تحويل ملفات 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.
2. هل أحتاج إلى تعيين RestoreSchema لكل من التحويل وملف الإخراج؟
فقط للملفات التي لا يمكن تحميل مخططها. RestoreSchema هو خيار القارئ، لذلك أثناء التحويل يجب وضعه في ConversionOptions.SourceDriverOptions، وعند إعادة فتح الإخراج تمرره إلى VectorLayer.Open. العينة تعينه في كلا المكانين حتى لا يعتمد سير العمل على توفر XSD.
3. ماذا يحدث إذا كان RestoreSchema خاطئًا (false) وكان المخطط مفقودًا؟
Aspose.GIS لا يمكنه بناء مجموعة سمات الميزة ويطلق استثناء GisException. توصي رسالة الاستثناء بتعيين RestoreSchema إلى true، أو LoadSchemasFromInternet إلى true عندما يكون المخطط مستضافًا على الإنترنت.
4. هل المخطط المستعاد مطابق للمخطط الأصلي XSD؟
ليس بالضرورة. يصف Aspose.GIS استعادة المخطط بأنها عرضة للأخطاء لأن السمات يتم استنتاجها عن طريق فحص الملف. تحقق من النتيجة، كما يفعل العينة، واستخدم GmlOptions.SchemaLocation عندما يكون لديك المخطط الأصلي XSD.
5. هل يمكنني استخدام RestoreSchema عند تحويل GML إلى Shapefile أو GeoJSON أو صيغ أخرى؟
نعم. SourceDriverOptions يتحكم في كيفية قراءة مصدر GML بغض النظر عن برنامج التشغيل الوجهة. ثم تُكتب السمات المستعادة باستخدام نموذج السمات الخاص بصيغة الوجهة.
6. هل أحتاج إلى ترخيص لتشغيل هذا الكود؟
لا. بدون ترخيص، يعمل Aspose.GIS في وضع التقييم مع قيود. يزيل الترخيص المؤقت المجاني تلك القيود للاختبار، ويتطلب الاستخدام في الإنتاج ترخيصًا مُشتَرًى.
