Převod souborů GML (Geography Markup Language) vypadá jednoduše, dokud čtečka nemůže najít XML schéma. Soubor GML popisuje své typy prvků a atributy v samostatném XSD, který je odkazován pomocí atributu schemaLocation. Když je toto schéma ztraceno, přesunuto nebo nelze stáhnout, definice atributů s ním odcházejí a konverzní úloha, která fungovala na vašem počítači, začne selhávat na serveru sestavení. Tento průvodce ukazuje, jak během konverze v C# pomocí Aspose.GIS for .NET zachovat informace o GML schématu a jak dokázat, že prvky a atributy přežily zpětný průchod.
Proč je důležité zachovat GML schéma
GML je populární výměnný formát, protože nese geometrii a atributová data společně. Struktura těchto dat, tj. typy prvků, názvy atributů a datové typy, je definována aplikačním schématem. Aspose.GIS čte toto schéma a vytváří kolekci atributů vrstvy, takže schéma je to, co převádí surové XML na použitelné sloupce ve vašem kódu, v QGIS nebo v ArcGIS.
Ve skutečných pipelinech je schéma často nejslabším článkem. Soubory jsou kopírovány bez jejich XSD, schemaLocation ukazuje na zastaralou URL, nebo server provádějící konverzi nemá přístup k internetu. V těchto případech Aspose.GIS zastaví s GisException, která vysvětluje, že se nepodařilo vytvořit kolekci atributů prvku. Volba GmlOptions.RestoreSchema tento problém řeší tím, že umožní čtečce rekonstruovat schéma atributů přímo z dat prvku, takže vaše konverze zachovají své atributy místo selhání nebo vytváření neúplného výstupu.
Začínáme s Aspose.GIS pro .NET
Aspose.GIS for .NET je spravovaná knihovna pro čtení, zápis a konverzi GIS formátů, jako jsou GML, Shapefile, GeoJSON, KML a File Geodatabase, aniž by bylo nutné mít na počítači nainstalován ArcGIS nebo QGIS. Přidejte ji do svého projektu z NuGet:
Install-Package Aspose.GIS
Nebo pomocí .NET CLI:
dotnet add package Aspose.GIS
Více se můžete dozvědět na stránce produktu Aspose.GIS for .NET a v Aspose.GIS .NET API Reference. Ve výukovém tutoriálu jsou použity dva jmenné prostory Aspose.Gis, který obsahuje VectorLayer, Drivers a ConversionOptions, a Aspose.Gis.Formats.Gml, který obsahuje GmlOptions.
Postupný návod na zachování GML schématu
Následující příklad v C# převádí soubor GML na nový soubor GML při obnově schématu atributů a poté ověřuje výsledek. Cílem je .NET 6 nebo novější.
Co příklad dělá
- Vytvoří možnosti čtečky s nastavením
GmlOptions.RestoreSchemanatrue. - Otevře zdrojový GML a zaznamená počet prvků a názvy atributů.
- Převede soubor pomocí
VectorLayer.Convert, přičemž předá možnosti čtečky přesConversionOptions.SourceDriverOptions. - Znovu otevře výstup s obnovou schématu a porovná jej se zdrojem.
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 };
}
Vysvětlení každého kroku
- Vytváření možností čtečky –
GmlOptionsobsahuje nastavení ovladače specifická pro GML. Podle reference GmlOptions.RestoreSchema nastavení natrueznamená, že čtečka již nevyžaduje XML schéma. Ovladač prohledá soubor na známé GML struktury a odvodí třídy prvků a jejich vlastnosti. Výchozí hodnota jefalse. - Zachycení struktury zdroje – Otevření zdroje pomocí
VectorLayer.Openvám poskytne základní úroveň.layer.Countvrací počet prvků alayer.Attributesodhaluje kolekci atributů, kde každýFeatureAttributemáNameaDataType. - Volání
VectorLayer.Convert– Přetížení použité zde přijímá cestu ke zdroji, ovladač zdroje, cestu k cíli, ovladač cíle a objektConversionOptions.SourceDriverOptionsřídí, jak je vstup čten, zatímcoDestinationDriverOptionsřídí, jak je výstup zapisován. ProtožeRestoreSchemaovlivňuje čtení, nachází se na straně zdroje. - Ověření výstupu – Výstup je znovu otevřen se stejnou možností čtečky, takže ověření nezávisí na přítomnosti XSD. Místo pevně zakódovaných čísel vzor porovnává výstup se zdrojem. Selže, pokud jsou ztraceny prvky nebo atributy, a vypíše obnovené názvy atributů a datové typy k revizi. Další atributy nejsou považovány za chyby, protože identifikátory jako
gml_idmohou být po konverzi zobrazeny odlišně.
Čtení GML, když je k dispozici původní XSD
Obnovení schématu je záložní řešení. Pokud stále máte původní soubor schématu, nasměrujte čtečku na něj pomocí SchemaLocation, aby definice atributů pocházely z XSD místo aby byly odvozeny:
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}");
}
Když je SchemaLocation null (výchozí hodnota), Aspose.GIS načte schemaLocation z kořenového elementu GML dokumentu. LoadSchemasFromInternet je ve výchozím nastavení false, takže schémata odkazovaná absolutními ne‑file:// URI nejsou stažena, pokud to neaktivujete.
Získejte bezplatnou licenci
Aspose.GIS běží v evaluačním režimu s omezeními, dokud není licence aplikována. Pro otestování plné sady funkcí požádejte o Free Temporary License a aplikujte ji před vaší první GIS operací:
var license = new Aspose.Gis.License();
license.SetLicense("Aspose.GIS.NET.lic");
Bezplatné doplňkové zdroje
- Aspose.GIS Documentation
- API Reference pro Aspose.GIS
- Reference třídy GmlOptions
- Bezplatné online GIS aplikace
Závěr
Zachování informací o schématu GML během konverze spočívá v řízení toho, jak je zdroj čten. S GmlOptions.RestoreSchema předaným přes ConversionOptions.SourceDriverOptions může Aspose.GIS for .NET obnovit definice atributů i v případě, že XSD chybí nebo je nedostupné, takže konverze si zachovají svá data místo selhání. Kombinace této možnosti s porovnáním zdroj‑výstup poskytuje důkaz, že funkce a atributy prošly, a přepnutí na SchemaLocation, když je původní schéma k dispozici, poskytuje nejvěrnější výsledek. Společně tyto postupy činí konverzi GML spolehlivou v dávkových úlohách, webových službách a CI pipelinech.
Často kladené otázky
1. Co vlastně dělá GmlOptions.RestoreSchema?
Umožňuje čtečce GML knihovny Aspose.GIS parsovat atributy prvků, když chybí nebo nelze načíst XML schéma (XSD) odkazované v souboru. Ovladač prohledá dokument pro známé struktury GML a odvodí třídy prvků a jejich vlastnosti z dat. Výchozí hodnota je false.
2. Musím nastavit RestoreSchema jak pro konverzi, tak pro výstupní soubor?
Pouze pro soubory, jejichž schéma nelze načíst. RestoreSchema je volba čtečky, takže během konverze patří do ConversionOptions.SourceDriverOptions a když znovu otevřete výstup, předáte ji do VectorLayer.Open. Ukázka ji nastavuje na obou místech, aby pracovní postup nezávisel na dostupnosti XSD.
3. Co se stane, pokud je RestoreSchema nastaveno na false a schéma chybí?
Aspose.GIS nemůže vytvořit kolekci atributů prvku a vyhodí GisException. Zpráva výjimky navrhuje nastavit RestoreSchema na true nebo LoadSchemasFromInternet na true, když je schéma hostováno online.
4. Je obnovené schéma identické s původním XSD?
Ne nutně. Aspose.GIS popisuje obnovu schématu jako náchylnou k chybám, protože atributy jsou odvozeny skenováním souboru. Ověřte výsledek, jak to dělá ukázka, a použijte GmlOptions.SchemaLocation, když máte původní XSD.
5. Mohu použít RestoreSchema při převodu GML do Shapefile, GeoJSON nebo jiných formátů?
Ano. SourceDriverOptions řídí, jak je zdroj GML čten bez ohledu na cílový ovladač. Obnovené atributy jsou pak zapsány pomocí vlastního modelu atributů cílového formátu.
6. Potřebuji licenci pro spuštění tohoto kódu? Ne. Bez licence Aspose.GIS běží v evaluačním režimu s omezeními. Bezplatná dočasná licence odstraňuje tato omezení pro testování a pro produkční použití je vyžadována zakoupená licence.
