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

  1. Crea le opzioni del lettore con GmlOptions.RestoreSchema impostato su true.
  2. Apre il GML di origine e registra il conteggio delle feature e i nomi degli attributi.
  3. Converte il file con VectorLayer.Convert, passando le opzioni del lettore tramite ConversionOptions.SourceDriverOptions.
  4. 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 – GmlOptions contiene le impostazioni del driver specifiche per GML. Secondo la documentazione GmlOptions.RestoreSchema impostarlo su true significa 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.Open fornisce una base di riferimento. layer.Count restituisce il numero di feature, e layer.Attributes espone la collezione di attributi, dove ogni FeatureAttribute ha un Name e un DataType.
  • 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 oggetto ConversionOptions. SourceDriverOptions controlla come viene letto l’input, mentre DestinationDriverOptions controlla come viene scritto l’output. Poiché RestoreSchema influisce 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_id possono 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

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.

Leggi di più