تبدیل فایلهای GML (Geography Markup Language) به نظر ساده میآید تا زمانی که خواننده نتواند طرحواره XML را پیدا کند. یک فایل GML انواع ویژگیها و خصوصیات خود را در یک XSD جداگانه که از طریق ویژگی schemaLocation ارجاع داده میشود، توصیف میکند. وقتی آن طرحواره گم شود، جابجا شود یا نتوان آن را دانلود کرد، تعاریف خصوصیات نیز از دست میروند و کاری که در ماشین شما کار میکرد در سرور ساخت شروع به شکست میکند. این راهنما نشان میدهد چگونه میتوان اطلاعات طرحواره GML را در طول تبدیل در C# با استفاده از Aspose.GIS for .NET حفظ کرد و چگونه میتوان ثابت کرد که ویژگیها و خصوصیات سفر دور را زنده نگه داشتهاند.
چرا حفظ طرحواره GML مهم است
GML یک فرمت تبادل محبوب است زیرا هندسه و دادههای ویژگی را با هم حمل میکند. ساختار این دادهها، به معنای انواع ویژگیها، نامهای ویژگی و انواع داده، توسط یک طرحنامه کاربردی تعریف میشود. Aspose.GIS این طرحنامه را میخواند تا مجموعه ویژگیهای لایه را بسازد، بنابراین طرحنامه همان چیزی است که XML خام را به ستونهای قابل استفاده در کد شما، در QGIS یا در ArcGIS تبدیل میکند.
در خطوط واقعی پردازش، طرحواره اغلب ضعیفترین نقطه است. فایلها بدون XSD خود کپی میشوند، schemaLocation به یک URL قدیمی اشاره میکند، یا سروری که تبدیل را اجرا میکند دسترسی به اینترنت ندارد. در این موارد Aspose.GIS با یک GisException متوقف میشود که توضیح میدهد ساخت مجموعه ویژگیهای ویژگی ناموفق بوده است. گزینه GmlOptions.RestoreSchema این مشکل را حل میکند با این که به خواننده اجازه میدهد طرحواره ویژگیها را از خود دادههای ویژگی بازسازی کند، بهطوری که تبدیلهای شما ویژگیهایشان را حفظ کنند بهجای اینکه شکست بخورند یا خروجی ناقص تولید کنند.
شروع کار با Aspose.GIS for .NET
Aspose.GIS for .NET یک کتابخانه مدیریتشده برای خواندن، نوشتن و تبدیل فرمتهای GIS مانند GML، Shapefile، GeoJSON، KML و File Geodatabase است، بدون نیاز به ArcGIS یا QGIS بر روی ماشین. آن را از NuGet به پروژه خود اضافه کنید:
Install-Package Aspose.GIS
یا با .NET CLI:
dotnet add package Aspose.GIS
میتوانید اطلاعات بیشتری را در صفحه محصول Aspose.GIS for .NET و در Aspose.GIS .NET API Reference بیابید. دو فضای نام مورد استفاده در این آموزش Aspose.Gis است که شامل VectorLayer، Drivers و ConversionOptions میشود، و Aspose.Gis.Formats.Gml که شامل GmlOptions است.
آموزش گام به گام برای حفظ طرحواره GML
مثال زیر به زبان C# یک فایل GML را به یک فایل GML جدید تبدیل میکند در حالی که طرحوارهٔ ویژگیها را بازگردانده و سپس نتیجه را تأیید مینماید. این مثال برای .NET 6 یا نسخههای بعدی هدفگذاری شده است.
کارکرد مثال
- گزینههای خواننده را با تنظیم
GmlOptions.RestoreSchemaبهtrueایجاد میکند. - فایل GML منبع را باز میکند و تعداد ویژگیها و نامهای ویژگیها را ثبت مینماید.
- فایل را با
VectorLayer.Convertتبدیل میکند و گزینههای خواننده را از طریقConversionOptions.SourceDriverOptionsپاس میدهد. - خروجی را با بازگرداندن طرحواره دوباره باز میکند و آن را با منبع مقایسه مینماید.
using System;
using System.IO;
using System.Linq;
using Aspose.Gis;
using Aspose.Gis.Formats.Gml;
class PreserveGmlSchema
{
static void Main()
{
// Input and output paths. Adjust them to your environment.
string sourcePath = Path.Combine("data", "input.gml");
string destinationPath = Path.Combine("data", "output.gml");
// Step 1: Capture the structure of the source layer.
// RestoreSchema lets the reader infer attributes when the XSD is missing or unreachable.
int sourceFeatureCount;
string[] sourceAttributeNames;
using (VectorLayer source = VectorLayer.Open(sourcePath, Drivers.Gml, CreateReadOptions()))
{
sourceFeatureCount = source.Count;
sourceAttributeNames = source.Attributes.Select(a => a.Name).ToArray();
}
// Step 2: Convert GML to GML. RestoreSchema is a reader option,
// so it is supplied through SourceDriverOptions.
var conversionOptions = new ConversionOptions
{
SourceDriverOptions = CreateReadOptions()
};
VectorLayer.Convert(sourcePath, Drivers.Gml, destinationPath, Drivers.Gml, conversionOptions);
// Step 3: Reopen the output and compare it with the source.
using (VectorLayer output = VectorLayer.Open(destinationPath, Drivers.Gml, CreateReadOptions()))
{
if (output.Count != sourceFeatureCount)
{
throw new InvalidOperationException(
$"Feature count mismatch: source has {sourceFeatureCount}, output has {output.Count}.");
}
string[] outputAttributeNames = output.Attributes.Select(a => a.Name).ToArray();
string[] missingAttributes = sourceAttributeNames.Except(outputAttributeNames).ToArray();
if (missingAttributes.Length > 0)
{
throw new InvalidOperationException(
$"Attributes missing from output: {string.Join(", ", missingAttributes)}");
}
Console.WriteLine($"Converted {output.Count} features with {output.Attributes.Count} attributes:");
foreach (FeatureAttribute attribute in output.Attributes)
{
Console.WriteLine($" {attribute.Name} ({attribute.DataType})");
}
}
}
// A fresh options instance for each read keeps the configuration explicit.
static GmlOptions CreateReadOptions() => new GmlOptions { RestoreSchema = true };
}
توضیح هر مرحله
- ایجاد گزینههای خواننده –
GmlOptionsتنظیمات مخصوص راننده GML را نگه میدارد. بر اساس مرجع GmlOptions.RestoreSchema تنظیم آن بهtrueبه این معنی است که خواننده دیگر به یک طرح XML نیاز ندارد. راننده فایل را برای ساختارهای شناختهشده GML اسکن میکند و کلاسهای ویژگی و خصوصیات آنها را استنتاج میکند. مقدار پیشفرضfalseاست. - ضبط ساختار منبع – باز کردن منبع با
VectorLayer.Openیک پایه به شما میدهد.layer.Countتعداد ویژگیها را برمیگرداند وlayer.Attributesمجموعه ویژگیها را نشان میدهد، که در آن هرFeatureAttributeدارایNameوDataTypeاست. - فراخوانی
VectorLayer.Convert– نسخهی بارگذاریشدهای که در اینجا استفاده میشود مسیر منبع، راننده منبع، مسیر مقصد، راننده مقصد و یک شیءConversionOptionsرا میپذیرد.SourceDriverOptionsنحوهی خواندن ورودی را کنترل میکند، در حالی کهDestinationDriverOptionsنحوهی نوشتن خروجی را کنترل میکند. از آنجا کهRestoreSchemaبر خواندن تأثیر میگذارد، در سمت منبع قرار میگیرد. - تأیید خروجی – خروجی با همان گزینهی خواننده دوباره باز میشود تا تأیید وابسته به وجود XSD نباشد. به جای اعداد ثابت، نمونه خروجی را در برابر منبع مقایسه میکند. در صورتی که ویژگیها یا ویژگیهای دادهای از دست بروند، شکست میخورد و نامهای ویژگیهای بازگرداندهشده و انواع داده آنها را برای بررسی چاپ میکند. ویژگیهای اضافی به عنوان خطا در نظر گرفته نمیشوند، زیرا شناسههایی مانند
gml_idممکن است پس از تبدیل به شکل متفاوتی نمایش داده شوند.
خواندن GML هنگامی که XSD اصلی در دسترس است
بازگرداندن طرحواره یک راهحل جایگزین است. اگر هنوز فایل طرحواره اصلی را دارید، خواننده را با استفاده از SchemaLocation به آن ارجاع دهید تا تعاریف ویژگیها از XSD گرفته شوند نه اینکه بهصورت استنتاجی باشند:
using System;
using Aspose.Gis;
using Aspose.Gis.Formats.Gml;
var options = new GmlOptions
{
// Space-separated pair: namespace URI, then the path to its XML schema.
SchemaLocation = "http://www.example.com/myfeatures schema.xsd",
LoadSchemasFromInternet = false
};
using (VectorLayer layer = VectorLayer.Open("input.gml", Drivers.Gml, options))
{
Console.WriteLine($"Features: {layer.Count}, attributes: {layer.Attributes.Count}");
}
وقتی SchemaLocation برابر null باشد (پیشفرض)، Aspose.GIS مقدار schemaLocation را از عنصر ریشه سند GML میخواند. LoadSchemasFromInternet به طور پیشفرض false است، بنابراین طرحنامههایی که توسط URIهای مطلق غیر file:// ارجاع داده میشوند، مگر اینکه شما آن را فعال کنید، دانلود نمیشوند.
دریافت یک مجوز رایگان
Aspose.GIS در حالت ارزیابی با محدودیتها اجرا میشود تا زمانی که یک لایسنس اعمال شود. برای تست کامل مجموعه ویژگیها، یک مجوز موقت رایگان درخواست کنید و قبل از اولین عملیات GIS خود آن را اعمال کنید:
var license = new Aspose.Gis.License();
license.SetLicense("Aspose.GIS.NET.lic");
منابع اضافی رایگان
نتیجهگیری
حفظ اطلاعات طرحنامه GML در طول تبدیل به کنترل نحوه خواندن منبع بستگی دارد. با استفاده از GmlOptions.RestoreSchema که از طریق ConversionOptions.SourceDriverOptions عبور میکند، Aspose.GIS for .NET میتواند تعاریف ویژگیها را حتی زمانی که XSD موجود نیست یا قابل دسترسی نیست بازسازی کند، بهطوری که تبدیلها دادههای خود را نگه دارند و از شکست جلوگیری شود. ترکیب این گزینه با مقایسه منبع به خروجی به شما شواهدی میدهد که ویژگیها و صفات بهدرستی عبور کردهاند، و تغییر به SchemaLocation زمانی که طرحنامه اصلی در دسترس باشد، نتایج دقیقتری ارائه میدهد. بههمپیوستگی، این روشها تبدیل GML را در کارهای دستهای، سرویسهای وب و خطوط لوله CI قابل اعتماد میسازند.
سوالات متداول
1. GmlOptions.RestoreSchema در واقع چه کاری انجام میدهد؟
این گزینه به خواننده GML Aspose.GIS اجازه میدهد تا ویژگیهای اشیا را زمانی که طرحواره XML (XSD) ارجاعشده توسط فایل موجود نیست یا نمیتواند بارگذاری شود، تجزیه‑تحلیل کند. درایور سند را برای ساختارهای شناختهشده GML اسکن میکند و کلاسهای ویژگی و ویژگیهای آنها را از دادهها استنتاج مینماید. مقدار پیشفرض false است.
۲. آیا نیاز است که RestoreSchema را هم برای تبدیل و هم برای فایل خروجی تنظیم کنم؟
فقط برای فایلهایی که طرحوارهٔ آنها قابل بارگذاری نیست. RestoreSchema یک گزینهٔ خواننده است، بنابراین در طول تبدیل باید در ConversionOptions.SourceDriverOptions قرار گیرد و وقتی خروجی را دوباره باز میکنید، آن را به VectorLayer.Open پاس میدهید. نمونه آن را در هر دو مکان تنظیم میکند تا جریان کار به وجود یک XSD وابسته نباشد.
۳. چه اتفاقی میافتد اگر RestoreSchema برابر false باشد و طرحواره موجود نباشد؟
Aspose.GIS نمیتواند مجموعه ویژگیهای صفت را بسازد و یک GisException پرتاب میکند. پیام استثنا پیشنهاد میکند که RestoreSchema را به true تنظیم کنید، یا LoadSchemasFromInternet را به true تنظیم کنید زمانی که طرحواره بهصورت آنلاین میزبانی میشود.
4. آیا یک طرحواره بازسازیشده با XSD اصلی یکسان است؟
نه لزوماً. Aspose.GIS بازسازی طرحواره را بهعنوان پرخطا توصیف میکند زیرا ویژگیها با اسکن فایل استنتاج میشوند. نتیجه را همانطور که نمونه نشان میدهد بررسی کنید و وقتی XSD اصلی را دارید از GmlOptions.SchemaLocation استفاده کنید.
5. آیا میتوانم هنگام تبدیل GML به Shapefile، GeoJSON یا سایر فرمتها از RestoreSchema استفاده کنم؟
بله. SourceDriverOptions نحوه خواندن منبع GML را بدون در نظر گرفتن درایور مقصد کنترل میکند. ویژگیهای بازگردانده شده سپس با استفاده از مدل ویژگیهای خود فرمت مقصد نوشته میشوند.
6. آیا برای اجرای این کد به لایسنس نیاز دارم؟ خیر. بدون لایسنس، Aspose.GIS در حالت ارزیابی با محدودیتها اجرا میشود. یک لایسنس موقت رایگان این محدودیتها را برای تست حذف میکند و استفاده در تولید نیاز به لایسنس خریداری شده دارد.
