La conversione di file GML (Geography Markup Language) sembra semplice finché il lettore non riesce a trovare lo schema XML. Un file GML descrive i suoi tipi di feature e gli attributi in un XSD separato che è referenziato tramite l’attributo schemaLocation. Quando quello schema è stato perso, spostato o non può essere scaricato, le definizioni degli attributi vanno perse con esso, e un lavoro di conversione che funzionava sulla tua macchina inizia a fallire su un server di build. Questa guida mostra come preservare le informazioni dello schema GML durante la conversione in C# usando Aspose.GIS for .NET, e come dimostrare che le feature e gli attributi sono sopravvissuti al round trip.
Perché preservare lo schema GML è importante
GML è un formato di interscambio popolare perché trasporta geometrie e dati attributivi insieme. La struttura di questi dati, ovvero i tipi di feature, i nomi degli attributi e i tipi di dati, è definita da uno schema applicativo. Aspose.GIS legge questo schema per costruire la raccolta di attributi di un layer, quindi lo schema è ciò che trasforma l’XML grezzo in colonne utilizzabili nel tuo codice, in QGIS o in ArcGIS.
Nelle pipeline reali lo schema è spesso il punto più debole. I file vengono copiati senza il loro XSD, schemaLocation punta a un URL obsoleto, o il server che esegue la conversione non ha accesso a Internet. In questi casi Aspose.GIS si interrompe con una GisException che spiega che non è riuscito a costruire la raccolta di attributi della feature. L’opzione GmlOptions.RestoreSchema risolve il problema consentendo al lettore di ricostruire lo schema degli attributi dai dati della feature stessa, così le tue conversioni mantengono i loro attributi invece di fallire o produrre output incompleti.
Iniziare con Aspose.GIS per .NET
Aspose.GIS for .NET è una libreria gestita per la lettura, scrittura e conversione di formati GIS come GML, Shapefile, GeoJSON, KML e File Geodatabase, senza richiedere ArcGIS o QGIS sulla macchina. Aggiungila al tuo progetto da NuGet:
Install-Package Aspose.GIS
Oppure con la CLI .NET:
dotnet add package Aspose.GIS
Puoi saperne di più sulla pagina del prodotto Aspose.GIS for .NET e nella Aspose.GIS .NET API Reference. I due namespace utilizzati in questo tutorial sono Aspose.Gis, che contiene VectorLayer, Drivers e ConversionOptions, e Aspose.Gis.Formats.Gml, che contiene GmlOptions.
Tutorial passo-passo per preservare lo schema GML
Il seguente esempio C# converte un file GML in un nuovo file GML ripristinando lo schema degli attributi, quindi verifica il risultato. È destinato a .NET 6 o versioni successive.
Cosa fa l’esempio
- Crea le opzioni del lettore con
GmlOptions.RestoreSchemaimpostato sutrue. - Apre il GML di origine e registra il conteggio delle feature e i nomi degli attributi.
- Converte il file con
VectorLayer.Convert, passando le opzioni del lettore tramiteConversionOptions.SourceDriverOptions. - Riapre l’output con il ripristino dello schema e lo confronta con l’origine.
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 };
}
Spiegazione di ogni passaggio
- Creazione delle opzioni del lettore –
GmlOptionscontiene le impostazioni del driver specifiche per GML. Secondo la documentazione GmlOptions.RestoreSchema impostarlo sutruesignifica che il lettore non richiede più uno schema XML. Il driver analizza il file alla ricerca di strutture GML conosciute e deduce le classi di feature e le loro proprietà. Il valore predefinito èfalse. - Cattura della struttura di origine – L’apertura della sorgente con
VectorLayer.Openfornisce una base di riferimento.layer.Countrestituisce il numero di feature, elayer.Attributesespone la collezione di attributi, dove ogniFeatureAttributeha unNamee unDataType. - Chiamata a
VectorLayer.Convert– La sovraccarico utilizzata qui accetta il percorso di origine, il driver di origine, il percorso di destinazione, il driver di destinazione e un oggettoConversionOptions.SourceDriverOptionscontrolla come viene letto l’input, mentreDestinationDriverOptionscontrolla come viene scritto l’output. PoichéRestoreSchemainfluisce sulla lettura, si applica al lato sorgente. - Verifica dell’output – L’output viene riaperto con la stessa opzione del lettore in modo che la verifica non dipenda dalla presenza di un XSD. Invece di numeri hard‑coded, il campione confronta l’output con la sorgente. Fallisce quando feature o attributi vengono persi e stampa i nomi degli attributi ripristinati e i tipi di dati per la revisione. Gli attributi extra non sono considerati errori, poiché identificatori come
gml_idpossono essere esposti in modo diverso dopo la conversione.
Lettura di GML quando lo XSD originale è disponibile
Il ripristino dello schema è una soluzione di riserva. Se hai ancora il file schema originale, indica al lettore di puntare a esso con SchemaLocation in modo che le definizioni degli attributi provengano dall’XSD anziché essere inferite:
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}");
}
Quando SchemaLocation è null (il valore predefinito), Aspose.GIS legge schemaLocation dall’elemento radice del documento GML. LoadSchemasFromInternet è false per impostazione predefinita, quindi gli schemi referenziati da URI assoluti non file:// non vengono scaricati a meno che non lo abiliti.
Ottieni una licenza gratuita
Aspose.GIS funziona in modalità di valutazione con limitazioni fino a quando non viene applicata una licenza. Per testare l’intero set di funzionalità, richiedi una Free Temporary License e applicala prima della tua prima operazione GIS:
var license = new Aspose.Gis.License();
license.SetLicense("Aspose.GIS.NET.lic");
Risorse aggiuntive gratuite
- Documentazione Aspose.GIS
- Riferimento API per Aspose.GIS
- Riferimento della classe GmlOptions
- App GIS online gratuite
Conclusione
Conservare le informazioni dello schema GML durante la conversione dipende dal controllo di come viene letto il sorgente. Con GmlOptions.RestoreSchema passato tramite ConversionOptions.SourceDriverOptions, Aspose.GIS for .NET può ricostruire le definizioni degli attributi anche quando l’XSD è mancante o non raggiungibile, così le conversioni mantengono i dati invece di fallire. Accoppiare questa opzione con un confronto sorgente‑output ti fornisce la prova che le feature e gli attributi sono stati trasferiti, e passare a SchemaLocation quando lo schema originale è disponibile ti offre il risultato più fedele. Insieme, queste pratiche rendono la conversione GML affidabile nei lavori batch, nei servizi web e nelle pipeline CI.
FAQs
1. Che cosa fa realmente GmlOptions.RestoreSchema?
Consente al lettore GML di Aspose.GIS di analizzare gli attributi delle feature quando lo schema XML (XSD) a cui fa riferimento il file è mancante o non può essere caricato. Il driver esamina il documento alla ricerca di strutture GML note e deduce le classi di feature e le loro proprietà dai dati. Il valore predefinito è false.
2. Devo impostare RestoreSchema sia per la conversione sia per il file di output?
Solo per i file il cui schema non può essere caricato. RestoreSchema è un’opzione del lettore, quindi durante la conversione appartiene a ConversionOptions.SourceDriverOptions, e quando riapri l’output lo passi a VectorLayer.Open. L’esempio lo imposta in entrambi i punti in modo che il flusso di lavoro non dipenda dalla disponibilità di un XSD.
3. Cosa succede se RestoreSchema è false e lo schema è mancante?
Aspose.GIS non può costruire la raccolta di attributi della feature e genera una GisException. Il messaggio dell’eccezione suggerisce di impostare RestoreSchema su true, oppure LoadSchemasFromInternet su true quando lo schema è ospitato online.
4. Uno schema ripristinato è identico all’XSD originale?
Non necessariamente. Aspose.GIS descrive il ripristino dello schema come soggetto a errori perché gli attributi vengono dedotti analizzando il file. Verifica il risultato, come fa l’esempio, e utilizza GmlOptions.SchemaLocation quando disponi dell’XSD originale.
5. Posso usare RestoreSchema durante la conversione da GML a Shapefile, GeoJSON o altri formati?
Sì. SourceDriverOptions controlla come la sorgente GML viene letta indipendentemente dal driver di destinazione. Gli attributi ripristinati vengono quindi scritti utilizzando il modello di attributi del formato di destinazione.
6. Ho bisogno di una licenza per eseguire questo codice?
No. Senza una licenza, Aspose.GIS funziona in modalità di valutazione con limitazioni. Una licenza temporanea gratuita rimuove tali limitazioni per i test, e l’uso in produzione richiede una licenza acquistata.
