การแปลงไฟล์ GML (Geography Markup Language) ดูเหมือนง่ายจนกระทั่งตัวอ่านไม่สามารถหา XML schema ได้ ไฟล์ GML จะอธิบายประเภทฟีเจอร์และแอตทริบิวต์ใน XSD แยกต่างหากที่อ้างอิงผ่านแอตทริบิวต์ schemaLocation เมื่อสกีมานั้นสูญหาย ย้ายตำแหน่ง หรือไม่สามารถดาวน์โหลดได้ นิยามแอตทริบิวต์ก็หายไปด้วย และงานแปลงที่ทำงานได้บนเครื่องของคุณจะเริ่มล้มเหลวบนเซิร์ฟเวอร์การสร้าง คำแนะนำนี้แสดงวิธีการเก็บข้อมูลสกีมาของ GML ไว้ระหว่างการแปลงใน C# ด้วย Aspose.GIS for .NET และวิธีพิสูจน์ว่าฟีเจอร์และแอตทริบิวต์ยังคงอยู่หลังการเดินทางรอบ.
ทำไมการรักษาโครงสร้าง GML ถึงสำคัญ
GML เป็นรูปแบบการแลกเปลี่ยนที่ได้รับความนิยมเนื่องจากมันบรรจุข้อมูลเรขาคณิตและแอตทริบิวต์ร่วมกัน โครงสร้างของข้อมูลนั้น ซึ่งหมายถึงประเภทฟีเจอร์ ชื่อแอตทริบิวต์ และประเภทข้อมูล ถูกกำหนดโดยสกีมาของแอปพลิเคชัน Aspose.GIS อ่านสกีมานี้เพื่อสร้างคอลเลกชันแอตทริบิวต์ของเลเยอร์ ดังนั้นสกีมาจึงเป็นสิ่งที่เปลี่ยน XML ดิบให้เป็นคอลัมน์ที่ใช้งานได้ในโค้ดของคุณ ใน QGIS หรือใน ArcGIS.
ใน pipeline จริง ๆ โครงสร้างสกีมามักเป็นจุดอ่อนที่สุด ไฟล์ถูกคัดลอกโดยไม่มี 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
คุณสามารถเรียนรู้เพิ่มเติมได้ที่หน้า product page ของ Aspose.GIS for .NET และใน Aspose.GIS .NET API Reference. สอง namespace ที่ใช้ในบทเรียนนี้คือ 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 ทำงานในโหมดประเมินผลพร้อมข้อจำกัดจนกว่าจะมีการใช้ใบอนุญาต เพื่อทดสอบชุดคุณสมบัติเต็มรูปแบบ ให้ขอ Free Temporary License แล้วนำไปใช้ก่อนการดำเนินการ 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 pipelines.
คำถามที่พบบ่อย
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 จะทำงานในโหมดประเมินผลพร้อมข้อจำกัด. ใบอนุญาตชั่วคราวฟรีจะลบข้อจำกัดเหล่านั้นสำหรับการทดสอบ, และการใช้งานในสภาพแวดล้อมการผลิตต้องมีใบอนุญาตที่ซื้อแล้ว.
