Converter arquivos GML (Geography Markup Language) parece simples até que o leitor não consiga encontrar o esquema XML. Um arquivo GML descreve seus tipos de recursos e atributos em um XSD separado que é referenciado através do atributo schemaLocation. Quando esse esquema é perdido, movido ou não pode ser baixado, as definições de atributos desaparecem junto com ele, e um trabalho de conversão que funcionava na sua máquina começa a falhar em um servidor de build. Este guia mostra como preservar as informações do esquema GML durante a conversão em C# usando Aspose.GIS for .NET, e como comprovar que os recursos e atributos sobreviveram à ida e volta.

Por que preservar o esquema GML é importante

GML é um formato de intercâmbio popular porque transporta geometria e dados de atributos juntos. A estrutura desses dados, ou seja, os tipos de recurso, nomes de atributos e tipos de dados, é definida por um esquema de aplicação. Aspose.GIS lê esse esquema para construir a coleção de atributos de uma camada, de modo que o esquema é o que converte XML bruto em colunas utilizáveis no seu código, no QGIS ou no ArcGIS.

Em pipelines reais, o esquema costuma ser o elo mais fraco. Os arquivos são copiados sem seu XSD, schemaLocation aponta para uma URL desatualizada, ou o servidor que executa a conversão não tem acesso à internet. Nesses casos, o Aspose.GIS interrompe com uma GisException explicando que falhou ao construir a coleção de atributos da feature. A opção GmlOptions.RestoreSchema resolve isso permitindo que o leitor reconstrua o esquema de atributos a partir dos próprios dados da feature, de modo que suas conversões mantenham seus atributos em vez de falhar ou gerar saída incompleta.

Começando com Aspose.GIS for .NET

Aspose.GIS for .NET é uma biblioteca gerenciada para leitura, gravação e conversão de formatos GIS como GML, Shapefile, GeoJSON, KML e File Geodatabase, sem exigir ArcGIS ou QGIS na máquina. Adicione-a ao seu projeto a partir do NuGet:

Install-Package Aspose.GIS

Ou com a CLI do .NET:

dotnet add package Aspose.GIS

Você pode saber mais na página do produto Aspose.GIS for .NET e na Referência da API .NET do Aspose.GIS. Os dois namespaces usados neste tutorial são Aspose.Gis, que contém VectorLayer, Drivers e ConversionOptions, e Aspose.Gis.Formats.Gml, que contém GmlOptions.

Tutorial passo a passo para preservar o esquema GML

O exemplo C# a seguir converte um arquivo GML para um novo arquivo GML enquanto restaura o esquema de atributos e, em seguida, verifica o resultado. Ele tem como alvo o .NET 6 ou posterior.

O que o exemplo faz

  1. Cria opções de leitura com GmlOptions.RestoreSchema definido como true.
  2. Abre o GML de origem e registra sua contagem de recursos e nomes de atributos.
  3. Converte o arquivo com VectorLayer.Convert, passando as opções de leitura através de ConversionOptions.SourceDriverOptions.
  4. Reabre a saída com restauração de esquema e a compara com a origem.
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 };
}

Explicação de Cada Etapa

  • Criando opções do leitor – GmlOptions contém configurações específicas do driver GML. De acordo com a referência GmlOptions.RestoreSchema, defini‑la como true significa que o leitor não requer mais um esquema XML. O driver analisa o arquivo em busca de estruturas GML conhecidas e infere as classes de recursos e suas propriedades. O padrão é false.

  • Capturando a estrutura de origem – Abrir a origem com VectorLayer.Open fornece uma linha de base. layer.Count devolve o número de recursos, e layer.Attributes expõe a coleção de atributos, onde cada FeatureAttribute possui um Name e um DataType.

  • Chamando VectorLayer.Convert – A sobrecarga usada aqui aceita o caminho de origem, driver de origem, caminho de destino, driver de destino e um objeto ConversionOptions. SourceDriverOptions controla como a entrada é lida, enquanto DestinationDriverOptions controla como a saída é gravada. Como RestoreSchema afeta a leitura, ele é aplicado ao lado da origem.

  • Verificando a saída – A saída é reaberta com a mesma opção de leitor, de modo que a verificação não dependa da presença de um XSD. Em vez de números codificados, o exemplo compara a saída com a origem. Ele falha quando recursos ou atributos são perdidos e imprime os nomes e tipos de dados dos atributos restaurados para revisão. Atributos extras não são tratados como erros, pois identificadores como gml_id podem ser expostos de forma diferente após a conversão.

Lendo GML Quando o XSD Original Está Disponível

Restaurar o esquema é uma alternativa. Se ainda possuir o arquivo de esquema original, aponte o leitor para ele usando SchemaLocation para que as definições de atributos venham do XSD em vez de serem inferidas:

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 (o padrão), Aspose.GIS lê schemaLocation do elemento raiz do documento GML. LoadSchemasFromInternet é false por padrão, portanto os esquemas referenciados por URIs absolutos que não sejam file:// não são baixados a menos que você o habilite.

Obtenha uma Licença Gratuita

Aspose.GIS funciona em modo de avaliação com limitações até que uma licença seja aplicada. Para testar o conjunto completo de recursos, solicite uma Licença Temporária Gratuita e aplique‑a antes da sua primeira operação GIS:

var license = new Aspose.Gis.License();
license.SetLicense("Aspose.GIS.NET.lic");

Recursos adicionais gratuitos

Conclusão

Preservar as informações de esquema GML durante a conversão depende de controlar como a fonte é lida. Com GmlOptions.RestoreSchema passado através de ConversionOptions.SourceDriverOptions, Aspose.GIS for .NET pode reconstruir definições de atributos mesmo quando o XSD está ausente ou inacessível, de modo que as conversões mantêm seus dados em vez de falhar. Combinar essa opção com uma comparação fonte‑para‑saída fornece evidências de que os recursos e atributos foram transferidos, e mudar para SchemaLocation quando o esquema original está disponível oferece o resultado mais fiel. Juntas, essas práticas tornam a conversão GML confiável em trabalhos em lote, serviços web e pipelines de CI.

Perguntas Frequentes

1. O que GmlOptions.RestoreSchema realmente faz?
Ele permite que o leitor GML do Aspose.GIS analise os atributos de recursos quando o esquema XML (XSD) referenciado pelo arquivo está ausente ou não pode ser carregado. O driver examina o documento em busca de estruturas GML conhecidas e infere as classes de recursos e suas propriedades a partir dos dados. O valor padrão é false.

2. Preciso definir RestoreSchema tanto para a conversão quanto para o arquivo de saída? Somente para arquivos cujo esquema não pode ser carregado. RestoreSchema é uma opção de leitor, portanto, durante a conversão ele pertence a ConversionOptions.SourceDriverOptions, e quando você reabre a saída passa‑a para VectorLayer.Open. O exemplo define‑a em ambos os locais para que o fluxo de trabalho não dependa de um XSD estar disponível.

3. O que acontece se RestoreSchema for false e o esquema estiver ausente?
Aspose.GIS não pode construir a coleção de atributos de recurso e lança uma GisException. A mensagem da exceção sugere definir RestoreSchema como true, ou LoadSchemasFromInternet como true quando o esquema está hospedado online.

4. Um esquema restaurado é idêntico ao XSD original?
Não necessariamente. Aspose.GIS descreve a restauração de esquema como propensa a erros porque os atributos são inferidos ao analisar o arquivo. Verifique o resultado, como faz o exemplo, e use GmlOptions.SchemaLocation quando você tiver o XSD original.

5. Posso usar RestoreSchema ao converter GML para Shapefile, GeoJSON ou outros formatos?
Sim. SourceDriverOptions controla como a fonte GML é lida independentemente do driver de destino. Os atributos restaurados são então gravados usando o modelo de atributos próprio do formato de destino.

6. Preciso de uma licença para executar este código? Não. Sem uma licença, Aspose.GIS funciona em modo de avaliação com limitações. Uma licença temporária gratuita remove essas limitações para testes, e o uso em produção requer uma licença adquirida.

Leia Mais