המרת קבצי 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 עבור .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. שני המרחבים (namespaces) המשמשים במדריך זה הם 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 פועל במצב הערכה עם מגבלות. רישיון זמני חינמי מסיר את המגבלות לצורך בדיקה, ושימוש בייצור דורש רישיון שנרכש.
