Konwertowanie plików GML (Geography Markup Language) wydaje się proste, dopóki czytnik nie może znaleźć schematu XML. Plik GML opisuje swoje typy obiektów i atrybuty w osobnym XSD, które jest odwoływane przez atrybut schemaLocation. Gdy ten schemat zostanie utracony, przeniesiony lub nie da się go pobrać, definicje atrybutów znikają razem z nim, a zadanie konwersji, które działało na Twoim komputerze, zaczyna nie działać na serwerze budowania. Ten przewodnik pokazuje, jak zachować informacje o schemacie GML podczas konwersji w C# przy użyciu Aspose.GIS for .NET, oraz jak udowodnić, że obiekty i atrybuty przetrwały pełen cykl.
Dlaczego zachowanie schematu GML ma znaczenie
GML jest popularnym formatem wymiany, ponieważ przenosi razem dane geometryczne i atrybutowe. Struktura tych danych, czyli typy obiektów, nazwy atrybutów i typy danych, jest definiowana przez schemat aplikacji. Aspose.GIS odczytuje ten schemat, aby zbudować kolekcję atrybutów warstwy, więc schemat jest tym, co przekształca surowy XML w użyteczne kolumny w Twoim kodzie, w QGIS lub w ArcGIS.
W rzeczywistych potokach schemat jest często najsłabszym ogniwem. Pliki są kopiowane bez ich XSD, schemaLocation wskazuje przestarzały URL lub serwer wykonujący konwersję nie ma dostępu do Internetu. W takich przypadkach Aspose.GIS zatrzymuje się z GisException, wyjaśniając, że nie udało się zbudować kolekcji atrybutów cech. Opcja GmlOptions.RestoreSchema rozwiązuje ten problem, umożliwiając czytnikowi odtworzenie schematu atrybutów z samych danych cechy, dzięki czemu konwersje zachowują swoje atrybuty zamiast kończyć się niepowodzeniem lub generować niekompletny wynik.
Rozpoczęcie pracy z Aspose.GIS for .NET
Aspose.GIS for .NET to zarządzana biblioteka do odczytu, zapisu i konwertowania formatów GIS, takich jak GML, Shapefile, GeoJSON, KML oraz File Geodatabase, bez konieczności instalowania ArcGIS lub QGIS na komputerze. Dodaj ją do swojego projektu z NuGet:
Install-Package Aspose.GIS
Lub przy użyciu .NET CLI:
dotnet add package Aspose.GIS
Więcej informacji można znaleźć na stronie produktu Aspose.GIS for .NET oraz w Aspose.GIS .NET API Reference. Dwie przestrzenie nazw użyte w tym samouczku to Aspose.Gis, które zawierają VectorLayer, Drivers i ConversionOptions, oraz Aspose.Gis.Formats.Gml, które zawiera GmlOptions.
Samouczek krok po kroku zachowujący schemat GML
Poniższy przykład w C# konwertuje plik GML na nowy plik GML, przywracając schemat atrybutów, a następnie weryfikuje wynik. Działa na platformie .NET 6 lub nowszej.
Co robi przykład
- Tworzy opcje czytnika z ustawionym
GmlOptions.RestoreSchemanatrue. - Otwiera źródłowy plik GML i zapisuje liczbę cech oraz nazwy atrybutów.
- Konwertuje plik przy użyciu
VectorLayer.Convert, przekazując opcje czytnika przezConversionOptions.SourceDriverOptions. - Ponownie otwiera wynik z przywróceniem schematu i porównuje go ze źródłem.
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 };
}
Wyjaśnienie każdego kroku
- Tworzenie opcji czytnika –
GmlOptionszawiera ustawienia sterownika specyficzne dla GML. Zgodnie z dokumentacją GmlOptions.RestoreSchema ustawienie jej natrueoznacza, że czytnik nie wymaga już schematu XML. Sterownik przeszukuje plik w poszukiwaniu znanych struktur GML i wnioskowuje klasy obiektów oraz ich właściwości. Domyślnie jestfalse. - Przechwytywanie struktury źródła – Otwarcie źródła za pomocą
VectorLayer.Opendaje punkt odniesienia.layer.Countzwraca liczbę obiektów, alayer.Attributesudostępnia kolekcję atrybutów, gdzie każdyFeatureAttributemaNameiDataType. - Wywoływanie
VectorLayer.Convert– Przeciążenie użyte tutaj przyjmuje ścieżkę źródłową, sterownik źródłowy, ścieżkę docelową, sterownik docelowy oraz obiektConversionOptions.SourceDriverOptionskontroluje sposób odczytu danych, natomiastDestinationDriverOptionskontroluje sposób zapisu wyjścia. PonieważRestoreSchemawpływa na odczyt, znajduje się po stronie źródła. - Weryfikacja wyniku – Wynik jest ponownie otwierany z tą samą opcją czytnika, więc weryfikacja nie zależy od obecności XSD. Zamiast sztywno zakodowanych liczb, przykład porównuje wynik ze źródłem. Test niepowodzenia następuje, gdy utracone zostaną obiekty lub atrybuty, a wypisywane są przywrócone nazwy atrybutów i typy danych do przeglądu. Dodatkowe atrybuty nie są traktowane jako błędy, ponieważ identyfikatory takie jak
gml_idmogą być eksponowane inaczej po konwersji.
Odczytywanie GML, gdy dostępny jest oryginalny XSD
Odtwarzanie schematu jest rozwiązaniem awaryjnym. Jeśli nadal masz oryginalny plik schematu, wskaż czytnikowi go za pomocą SchemaLocation, aby definicje atrybutów pochodziły z XSD, a nie były domyślnie wywnioskowane:
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}");
}
When SchemaLocation is null (wartość domyślna), Aspose.GIS reads schemaLocation from the root element of the GML document. LoadSchemasFromInternet is false domyślnie, więc schematy odwołujące się do bezwzględnych URI innych niż file:// nie są pobierane, chyba że je włączysz.
Uzyskaj darmową licencję
Aspose.GIS działa w trybie ewaluacyjnym z ograniczeniami, dopóki nie zostanie zastosowana licencja. Aby przetestować pełny zestaw funkcji, poproś o Darmowa licencja tymczasowa i zastosuj ją przed pierwszą operacją GIS:
var license = new Aspise.Gis.License();
license.SetLicense("Aspose.GIS.NET.lic");
Darmowe dodatkowe zasoby
- Dokumentacja Aspose.GIS
- Referencja API dla Aspose.GIS
- Referencja klasy GmlOptions
- Darmowe aplikacje GIS online
Podsumowanie
Zachowanie informacji o schemacie GML podczas konwersji sprowadza się do kontrolowania sposobu odczytu źródła. Dzięki GmlOptions.RestoreSchema przekazywanemu przez ConversionOptions.SourceDriverOptions, Aspose.GIS for .NET może odtworzyć definicje atrybutów, nawet gdy XSD jest brakujący lub nieosiągalny, dzięki czemu konwersje zachowują dane zamiast kończyć się niepowodzeniem. Połączenie tej opcji z porównaniem źródło‑wynik daje dowód, że cechy i atrybuty przeszły pomyślnie, a przejście na SchemaLocation, gdy oryginalny schemat jest dostępny, zapewnia najwierniejszy rezultat. Razem te praktyki sprawiają, że konwersja GML jest niezawodna w zadaniach wsadowych, usługach internetowych i pipeline’ach CI.
Najczęściej zadawane pytania
1. Co tak naprawdę robi GmlOptions.RestoreSchema?
Umożliwia czytnikowi GML Aspose.GIS parsowanie atrybutów obiektów, gdy schemat XML (XSD) odwoływany przez plik jest nieobecny lub nie może zostać załadowany. Sterownik przeszukuje dokument w poszukiwaniu znanych struktur GML i wnioskowuje klasy obiektów oraz ich właściwości na podstawie danych. Domyślna wartość to false.
2. Do I need to set RestoreSchema for both the conversion and the output file?
Only for files whose schema cannot be loaded. RestoreSchema is a reader option, so during conversion it belongs in ConversionOptions.SourceDriverOptions, and when you reopen the output you pass it to VectorLayer.Open. The sample sets it in both places so the workflow does not depend on an XSD being available.
3. Co się stanie, jeśli RestoreSchema jest ustawione na false i schemat jest brakujący?
Aspose.GIS nie może zbudować kolekcji atrybutów cech i rzuca GisException. Wiadomość wyjątku sugeruje ustawienie RestoreSchema na true, lub LoadSchemasFromInternet na true, gdy schemat jest hostowany online.
4. Czy przywrócone schema jest identyczne z oryginalnym XSD?
Niekoniecznie. Aspose.GIS opisuje przywracanie schematu jako podatne na błędy, ponieważ atrybuty są wywnioskowane poprzez skanowanie pliku. Zweryfikuj wynik, tak jak robi to przykład, i użyj GmlOptions.SchemaLocation, gdy masz oryginalny XSD.
5. Czy mogę używać RestoreSchema przy konwertowaniu GML do Shapefile, GeoJSON lub innych formatów?
Tak. SourceDriverOptions kontroluje, jak źródło GML jest odczytywane, niezależnie od sterownika docelowego. Przywrócone atrybuty są następnie zapisywane przy użyciu własnego modelu atrybutów formatu docelowego.
6. Czy potrzebuję licencji, aby uruchomić ten kod? Nie. Bez licencji Aspose.GIS działa w trybie ewaluacyjnym z ograniczeniami. Darmowa tymczasowa licencja usuwa te ograniczenia w celu testowania, a użycie w produkcji wymaga zakupionej licencji.
