Перетворення файлів 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 або новіший.
Що робить приклад
- Створює параметри читача з
GmlOptions.RestoreSchema, встановленим уtrue. - Відкриває вихідний GML і записує кількість об’єктів та імена атрибутів.
- Перетворює файл за допомогою
VectorLayer.Convert, передаючи параметри читача черезConversionOptions.SourceDriverOptions. - Знову відкриває вихідний файл з відновленням схеми та порівнює його з оригіналом.
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 reference, встановлення його в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 працює в режимі оцінки з обмеженнями, доки не буде застосована ліцензія. Щоб протестувати повний набір функцій, запитайте Free Temporary License і застосуйте її перед вашою першою GIS‑операцією:
var license = new Aspose.Gis.License();
license.SetLicense("Aspose.GIS.NET.lic");
Безкоштовні додаткові ресурси
- Документація Aspose.GIS
- API довідник для Aspose.GIS
- Довідник класу GmlOptions
- Безкоштовні онлайн GIS-додатки
Висновок
Збереження інформації про схему 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 працює в режимі оцінки з обмеженнями. Безкоштовна тимчасова ліцензія знімає ці обмеження для тестування, а для використання у продакшені потрібна придбана ліцензія.
