Convertir archivos GML (Geography Markup Language) parece sencillo hasta que el lector no puede encontrar el esquema XML. Un archivo GML describe sus tipos de entidad y atributos en un XSD separado que se referencia mediante el atributo schemaLocation. Cuando ese esquema se ha perdido, movido o no se puede descargar, las definiciones de atributos desaparecen con él, y una tarea de conversión que funcionaba en su máquina comienza a fallar en un servidor de compilación. Esta guía muestra cómo preservar la información del esquema GML durante la conversión en C# usando Aspose.GIS for .NET, y cómo demostrar que las entidades y atributos sobrevivieron al viaje de ida y vuelta.

Por qué es importante preservar el esquema GML

GML es un formato de intercambio popular porque transporta datos de geometría y atributos juntos. La estructura de esos datos, es decir, los tipos de entidad, los nombres de atributos y los tipos de datos, está definida por un esquema de aplicación. Aspose.GIS lee este esquema para construir la colección de atributos de una capa, por lo que el esquema es lo que convierte el XML sin procesar en columnas utilizables en su código, en QGIS o en ArcGIS.

En los pipelines reales, el esquema suele ser el eslabón más débil. Los archivos se copian sin su XSD, schemaLocation apunta a una URL desactualizada, o el servidor que ejecuta la conversión no tiene acceso a Internet. En estos casos Aspose.GIS se detiene con una GisException que explica que no pudo construir la colección de atributos de la entidad. La opción GmlOptions.RestoreSchema resuelve esto permitiendo que el lector reconstruya el esquema de atributos a partir de los propios datos de la entidad, de modo que sus conversiones mantengan sus atributos en lugar de fallar o producir una salida incompleta.

Comenzando con Aspose.GIS for .NET

Aspose.GIS for .NET es una biblioteca administrada para leer, escribir y convertir formatos GIS como GML, Shapefile, GeoJSON, KML y File Geodatabase, sin requerir ArcGIS o QGIS en la máquina. Agrégala a tu proyecto desde NuGet:

Install-Package Aspose.GIS

O con la CLI de .NET:

dotnet add package Aspose.GIS

Puedes obtener más información en la página del producto Aspose.GIS for .NET y en la Referencia de la API .NET de Aspose.GIS. Los dos espacios de nombres utilizados en este tutorial son Aspose.Gis, que contiene VectorLayer, Drivers y ConversionOptions, y Aspose.Gis.Formats.Gml, que contiene GmlOptions.

Tutorial paso a paso para preservar el esquema GML

El siguiente ejemplo en C# convierte un archivo GML a un nuevo archivo GML mientras restaura el esquema de atributos, y luego verifica el resultado. Está dirigido a .NET 6 o posterior.

Qué hace el ejemplo

  1. Crea opciones de lector con GmlOptions.RestoreSchema establecido en true.
  2. Abre el GML de origen y registra su recuento de características y los nombres de atributos.
  3. Convierte el archivo con VectorLayer.Convert, pasando las opciones del lector a través de ConversionOptions.SourceDriverOptions.
  4. Vuelve a abrir la salida con la restauración del esquema y la compara con el origen.
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 };
}

Explicación de cada paso

  • Creando opciones del lector – GmlOptions contiene la configuración del controlador específica de GML. Según la referencia GmlOptions.RestoreSchema , establecerlo en true significa que el lector ya no requiere un esquema XML. El controlador escanea el archivo en busca de estructuras GML conocidas e infiere las clases de entidad y sus propiedades. El valor predeterminado es false.

  • Capturando la estructura de origen – Abrir la fuente con VectorLayer.Open le brinda una base. layer.Count devuelve el número de entidades, y layer.Attributes expone la colección de atributos, donde cada FeatureAttribute tiene un Name y un DataType.

  • Llamando a VectorLayer.Convert – La sobrecarga utilizada aquí acepta la ruta de origen, el controlador de origen, la ruta de destino, el controlador de destino y un objeto ConversionOptions. SourceDriverOptions controla cómo se lee la entrada, mientras que DestinationDriverOptions controla cómo se escribe la salida. Dado que RestoreSchema afecta la lectura, se aplica en el lado de origen.

  • Verificando la salida – La salida se vuelve a abrir con la misma opción del lector, de modo que la verificación no depende de la presencia de un XSD. En lugar de números codificados, el ejemplo compara la salida con la fuente. Falla cuando se pierden entidades o atributos y muestra los nombres de atributos restaurados y sus tipos de datos para su revisión. Los atributos adicionales no se consideran errores, ya que identificadores como gml_id pueden exponerse de manera diferente después de la conversión.

Lectura de GML cuando el XSD original está disponible

La restauración del esquema es una solución alternativa. Si aún tienes el archivo de esquema original, indica al lector que lo use con SchemaLocation para que las definiciones de atributos provengan del XSD en lugar de inferirse:

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}");
}

Cuando SchemaLocation es null (el valor predeterminado), Aspose.GIS lee schemaLocation del elemento raíz del documento GML. LoadSchemasFromInternet es false por defecto, por lo que los esquemas referenciados por URIs absolutas que no sean file:// no se descargan a menos que lo habilites.

Obtener una licencia gratuita

Aspose.GIS se ejecuta en modo de evaluación con limitaciones hasta que se aplique una licencia. Para probar el conjunto completo de funciones, solicite una Licencia Temporal Gratuita y aplíquela antes de su primera operación GIS.

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

Recursos Adicionales Gratuitos

Conclusión

Preservar la información del esquema GML durante la conversión se reduce a controlar cómo se lee la fuente. Con GmlOptions.RestoreSchema pasado a través de ConversionOptions.SourceDriverOptions, Aspose.GIS for .NET puede reconstruir las definiciones de atributos incluso cuando el XSD falta o no es accesible, de modo que las conversiones conservan sus datos en lugar de fallar. Combinar esa opción con una comparación de origen a salida le brinda evidencia de que las entidades y atributos se han transferido, y cambiar a SchemaLocation cuando el esquema original está disponible le proporciona el resultado más fiel. En conjunto, estas prácticas hacen que la conversión GML sea fiable en trabajos por lotes, servicios web y canalizaciones CI.

FAQs

1. ¿Qué hace realmente GmlOptions.RestoreSchema?
Permite que el lector GML de Aspose.GIS analice los atributos de las entidades cuando el esquema XML (XSD) referenciado por el archivo falta o no se puede cargar. El controlador escanea el documento en busca de estructuras GML conocidas e infiere las clases de entidades y sus propiedades a partir de los datos. El valor predeterminado es false.

2. ¿Necesito establecer RestoreSchema tanto para la conversión como para el archivo de salida?
Solo para archivos cuyo esquema no se puede cargar. RestoreSchema es una opción del lector, por lo que durante la conversión pertenece a ConversionOptions.SourceDriverOptions, y cuando vuelvas a abrir la salida la pasas a VectorLayer.Open. El ejemplo la establece en ambos lugares para que el flujo de trabajo no dependa de que un XSD esté disponible.

3. ¿Qué ocurre si RestoreSchema es false y el esquema falta? Aspose.GIS no puede construir la colección de atributos de la entidad y lanza una GisException. El mensaje de la excepción sugiere establecer RestoreSchema a true, o LoadSchemasFromInternet a true cuando el esquema está alojado en línea.

4. ¿Un esquema restaurado es idéntico al XSD original?
No necesariamente. Aspose.GIS describe la restauración del esquema como propensa a errores porque los atributos se infieren al escanear el archivo. Verifique el resultado, como lo hace el ejemplo, y use GmlOptions.SchemaLocation cuando tenga el XSD original.

5. ¿Puedo usar RestoreSchema al convertir GML a Shapefile, GeoJSON u otros formatos?
Sí. SourceDriverOptions controla cómo se lee la fuente GML sin importar el controlador de destino. Los atributos restaurados se escriben luego usando el propio modelo de atributos del formato de destino.

6. ¿Necesito una licencia para ejecutar este código?
No. Sin una licencia, Aspose.GIS se ejecuta en modo de evaluación con limitaciones. Una licencia temporal gratuita elimina esas limitaciones para pruebas, y el uso en producción requiere una licencia comprada.

Leer más