Преобразование файлов GML (Geography Markup Language) выглядит простым, пока читатель не может найти XML‑схему. Файл GML описывает типы объектов и атрибуты в отдельном XSD, на который ссылается атрибут schemaLocation. Когда эта схема потеряна, перемещена или её нельзя загрузить, определения атрибутов исчезают, и задача преобразования, которая работала на вашей машине, начинает падать на сервере сборки. В этом руководстве показано, как сохранить информацию о схеме GML во время преобразования в C# с использованием Aspose.GIS for .NET, и как доказать, что объекты и атрибуты выжили после кругового прохода.

Почему сохранение схемы GML имеет значение

GML — популярный формат обмена, потому что он объединяет геометрию и атрибутные данные. Структура этих данных, то есть типы объектов, имена атрибутов и типы данных, определяется схемой приложения. Aspose.GIS читает эту схему, чтобы построить коллекцию атрибутов слоя, поэтому схема превращает необработанный XML в пригодные для использования столбцы в вашем коде, в QGIS или в ArcGIS.

В реальных конвейерах схема часто является самым слабым звеном. Файлы копируются без их XSD, schemaLocation указывает на устаревший URL, или сервер, выполняющий конвертацию, не имеет доступа к интернету. В этих случаях Aspose.GIS останавливается с GisException, объясняя, что не удалось построить коллекцию атрибутов объектов. Параметр GmlOptions.RestoreSchema решает эту проблему, позволяя считывателю восстановить схему атрибутов из самих данных объектов, поэтому ваши конверсии сохраняют свои атрибуты вместо того, чтобы завершаться с ошибкой или выдавать неполный результат.

Начало работы с Aspose.GIS for .NET

Aspose.GIS for .NET — это управляемая библиотека для чтения, записи и конвертации GIS‑форматов, таких как GML, Shapefile, GeoJSON, KML и File Geodatabase, без необходимости установки ArcGIS или QGIS на машине. Добавьте её в свой проект через NuGet:

Install-Package Aspose.GIS

Или с помощью .NET CLI:

dotnet add package Aspose.GIS

Вы можете узнать больше на странице продукта Aspose.GIS for .NET и в Aspose.GIS .NET API Reference. Два пространства имён, используемых в этом руководстве, — Aspose.Gis, которое содержит VectorLayer, Drivers и ConversionOptions, и Aspose.Gis.Formats.Gml, которое содержит GmlOptions.

Пошаговое руководство по сохранению схемы GML

Следующий пример на C# преобразует файл GML в новый файл GML с восстановлением схемы атрибутов, а затем проверяет результат. Он предназначен для .NET 6 или более поздних версий.

Что делает пример

  1. Создает параметры чтения с GmlOptions.RestoreSchema, установленным в true.
  2. Открывает исходный GML и фиксирует количество объектов и имена атрибутов.
  3. Конвертирует файл с помощью VectorLayer.Convert, передавая параметры чтения через ConversionOptions.SourceDriverOptions.
  4. Снова открывает результат с восстановлением схемы и сравнивает его с исходным.
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 };
}

Объяснение каждого шага

  • Создание параметров чтения – GmlOptions содержит настройки драйвера, специфичные для GML. Согласно справке GmlOptions.RestoreSchema ссылка, установка значения true означает, что чтение больше не требует XML‑схемы. Драйвер сканирует файл в поиске известных GML‑структур и выводит классы объектов и их свойства. Значение по умолчанию — false.
  • Получение структуры источника – Открытие источника с помощью VectorLayer.Open дает базовый уровень. layer.Count возвращает количество объектов, а layer.Attributes предоставляет коллекцию атрибутов, где каждый FeatureAttribute имеет Name и DataType.
  • Вызов VectorLayer.Convert – Перегрузка, используемая здесь, принимает путь к источнику, драйвер источника, путь назначения, драйвер назначения и объект ConversionOptions. SourceDriverOptions управляет тем, как читается ввод, а DestinationDriverOptions — тем, как записывается вывод. Поскольку RestoreSchema влияет на чтение, он указывается для источника.
  • Проверка результата – Вывод открывается повторно с тем же параметром чтения, чтобы проверка не зависела от наличия XSD. Вместо жёстко заданных чисел пример сравнивает вывод с исходными данными. Тест завершается с ошибкой, если объекты или атрибуты потеряны, и выводит восстановленные имена атрибутов и их типы данных для проверки. Дополнительные атрибуты не считаются ошибкой, поскольку такие идентификаторы, как gml_id, могут быть представлены иначе после конвертации.

Чтение GML, когда исходный XSD доступен

Восстановление схемы — это резервный вариант. Если у вас всё ещё есть оригинальный файл схемы, укажите его читателю с помощью SchemaLocation, чтобы определения атрибутов брались из XSD, а не выводились автоматически:

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

Когда SchemaLocation равно null (по умолчанию), Aspose.GIS читает schemaLocation из корневого элемента документа GML. LoadSchemasFromInternet по умолчанию false, поэтому схемы, указанные абсолютными URI, не являющимися file://, не загружаются, если вы не включите эту опцию.

Получить бесплатную лицензию

Aspose.GIS работает в режиме оценки с ограничениями до применения лицензии. Чтобы протестировать полный набор функций, запросите Бесплатную временную лицензию и примените её перед первой GIS‑операцией:

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

Бесплатные дополнительные ресурсы

Заключение

Сохранение информации о схеме GML при конвертации сводится к контролю того, как читается источник. При передаче GmlOptions.RestoreSchema через ConversionOptions.SourceDriverOptions Aspose.GIS for .NET может восстанавливать определения атрибутов даже при отсутствии или недоступности XSD, поэтому конвертации сохраняют свои данные вместо того, чтобы завершаться с ошибкой. Сочетание этой опции с сравнением исходного и результирующего вывода дает подтверждение того, что объекты и атрибуты прошли через процесс, а переключение на SchemaLocation, когда оригинальная схема доступна, обеспечивает наибольшую точность результата. Вместе эти практики делают конвертацию GML надёжной в пакетных заданиях, веб‑службах и CI‑конвейерах.

Часто задаваемые вопросы

1. Что делает GmlOptions.RestoreSchema?
Это позволяет читателю GML библиотеки Aspose.GIS разбирать атрибуты объектов, когда XML‑схема (XSD), на которую ссылается файл, отсутствует или не может быть загружена. Драйвер сканирует документ в поисках известных структур GML и выводит классы объектов и их свойства из данных. Значение по умолчанию — false.

2. Нужно ли устанавливать RestoreSchema как для конвертации, так и для выходного файла? Только для файлов, схема которых не может быть загружена. RestoreSchema является параметром чтения, поэтому во время конвертации он относится к ConversionOptions.SourceDriverOptions, а при повторном открытии выходного файла вы передаёте его в VectorLayer.Open. Пример устанавливает его в обоих местах, чтобы процесс не зависел от наличия XSD.

3. Что происходит, если RestoreSchema равен false и схема отсутствует?
Aspose.GIS не может построить коллекцию атрибутов объектов и бросает GisException. Сообщение исключения предлагает установить RestoreSchema в true или LoadSchemasFromInternet в true, когда схема размещена онлайн.

4. Является ли восстановленная схема идентичной оригинальному XSD?
Не обязательно. Aspose.GIS описывает восстановление схемы как подверженное ошибкам, поскольку атрибуты выводятся путем сканирования файла. Проверьте результат, как делает пример, и используйте GmlOptions.SchemaLocation, когда у вас есть оригинальный XSD.

5. Могу ли я использовать RestoreSchema при конвертации GML в Shapefile, GeoJSON или другие форматы?
Да. SourceDriverOptions управляет тем, как читается источник GML, независимо от драйвера назначения. Восстановленные атрибуты затем записываются с использованием собственной модели атрибутов формата назначения.

6. Нужно ли лицензировать этот код?
Нет. Без лицензии Aspose.GIS работает в режиме оценки с ограничениями. Бесплатная временная лицензия снимает эти ограничения для тестирования, а для использования в продакшене требуется приобретённая лицензия.

Читать далее