Convertir des fichiers GML (Geography Markup Language) semble simple jusqu’à ce que le lecteur ne puisse pas trouver le schéma XML. Un fichier GML décrit ses types d’entités et attributs dans un XSD séparé qui est référencé via l’attribut schemaLocation. Lorsque ce schéma a été perdu, déplacé ou ne peut pas être téléchargé, les définitions d’attributs disparaissent avec lui, et une tâche de conversion qui fonctionnait sur votre machine commence à échouer sur un serveur de build. Ce guide montre comment préserver les informations de schéma GML pendant la conversion en C# en utilisant Aspose.GIS for .NET, et comment prouver que les entités et attributs ont survécu au aller‑retour.
Pourquoi la préservation du schéma GML est importante
GML est un format d’échange populaire car il transporte les géométries et les données d’attributs ensemble. La structure de ces données, c’est‑à‑dire les types d’entités, les noms d’attributs et les types de données, est définie par un schéma d’application. Aspose.GIS lit ce schéma pour construire la collection d’attributs d’une couche, de sorte que le schéma transforme le XML brut en colonnes utilisables dans votre code, dans QGIS ou dans ArcGIS.
Dans les pipelines réelles, le schéma est souvent le maillon le plus faible. Les fichiers sont copiés sans leur XSD, schemaLocation pointe vers une URL obsolète, ou le serveur exécutant la conversion n’a pas d’accès à Internet. Dans ces cas, Aspose.GIS s’arrête avec une GisException expliquant qu’il n’a pas pu construire la collection d’attributs de la fonctionnalité. L’option GmlOptions.RestoreSchema résout ce problème en permettant au lecteur de reconstruire le schéma d’attributs à partir des données de la fonctionnalité elle‑même, de sorte que vos conversions conservent leurs attributs au lieu d’échouer ou de produire une sortie incomplète.
Démarrage avec Aspose.GIS for .NET
Aspose.GIS for .NET est une bibliothèque gérée pour la lecture, l’écriture et la conversion des formats GIS tels que GML, Shapefile, GeoJSON, KML et File Geodatabase, sans nécessiter ArcGIS ou QGIS sur la machine. Ajoutez‑la à votre projet depuis NuGet:
Install-Package Aspose.GIS
Ou avec le CLI .NET :
dotnet add package Aspose.GIS
Vous pouvez en savoir plus sur la page produit Aspose.GIS for .NET et dans la Référence de l’API .NET Aspose.GIS. Les deux espaces de noms utilisés dans ce tutoriel sont Aspose.Gis, qui contient VectorLayer, Drivers et ConversionOptions, et Aspose.Gis.Formats.Gml, qui contient GmlOptions.
Tutoriel étape par étape pour préserver le schéma GML
L’exemple C# suivant convertit un fichier GML en un nouveau fichier GML tout en restaurant le schéma des attributs, puis vérifie le résultat. Il cible .NET 6 ou une version ultérieure.
Ce que fait l’exemple
- Crée des options de lecteur avec
GmlOptions.RestoreSchemadéfini surtrue. - Ouvre le GML source et enregistre son nombre de fonctionnalités ainsi que les noms d’attributs.
- Convertit le fichier avec
VectorLayer.Convert, en transmettant les options du lecteur viaConversionOptions.SourceDriverOptions. - Rouvre la sortie avec restauration du schéma et la compare à la source.
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 };
}
Explication de chaque étape
- Création des options du lecteur –
GmlOptionscontient les paramètres du pilote spécifiques à GML. Selon la référence GmlOptions.RestoreSchema, le définir surtruesignifie que le lecteur n’a plus besoin d’un schéma XML. Le pilote analyse le fichier à la recherche de structures GML connues et déduit les classes d’entités et leurs propriétés. La valeur par défaut estfalse. - Capture de la structure source – Ouvrir la source avec
VectorLayer.Openvous fournit une base de référence.layer.Countrenvoie le nombre d’entités, etlayer.Attributesexpose la collection d’attributs, où chaqueFeatureAttributepossède unNameet unDataType. - Appel de
VectorLayer.Convert– La surcharge utilisée ici accepte le chemin source, le pilote source, le chemin de destination, le pilote de destination, et un objetConversionOptions.SourceDriverOptionscontrôle la façon dont l’entrée est lue, tandis queDestinationDriverOptionscontrôle la façon dont la sortie est écrite. CommeRestoreSchemaaffecte la lecture, il s’applique du côté source. - Vérification de la sortie – La sortie est rouverte avec la même option de lecteur afin que la vérification ne dépende pas de la présence d’un XSD. Au lieu de nombres codés en dur, l’exemple compare la sortie à la source. Il échoue lorsque des entités ou des attributs sont perdus et affiche les noms d’attributs restaurés ainsi que leurs types de données pour examen. Les attributs supplémentaires ne sont pas considérés comme des erreurs, car des identifiants tels que
gml_idpeuvent être exposés différemment après la conversion.
Lecture du GML lorsque le XSD original est disponible
La restauration du schéma est une solution de secours. Si vous avez toujours le fichier de schéma original, indiquez le lecteur vers celui‑ci avec SchemaLocation afin que les définitions d’attributs proviennent du XSD plutôt que d’être inférées :
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}");
}
Lorsque SchemaLocation est null (la valeur par défaut), Aspose.GIS lit schemaLocation à partir de l’élément racine du document GML. LoadSchemasFromInternet est false par défaut, ainsi les schémas référencés par des URI absolus non file:// ne sont pas téléchargés à moins que vous ne l’activiez.
Obtenez une licence gratuite
Aspose.GIS fonctionne en mode d’évaluation avec des limitations jusqu’à ce qu’une licence soit appliquée. Pour tester l’ensemble complet des fonctionnalités, demandez une Licence temporaire gratuite et appliquez‑la avant votre première opération GIS :
var license = new Aspise.Gis.License();
license.SetLicense("Aspose.GIS.NET.lic");
Ressources supplémentaires gratuites
- Documentation Aspose.GIS
- Référence API pour Aspose.GIS
- Référence de la classe GmlOptions
- Applications GIS en ligne gratuites
Conclusion
La préservation des informations de schéma GML lors de la conversion repose sur le contrôle de la façon dont la source est lue. Avec GmlOptions.RestoreSchema transmis via ConversionOptions.SourceDriverOptions, Aspose.GIS for .NET peut reconstruire les définitions d’attributs même lorsque le XSD est manquant ou inaccessible, de sorte que les conversions conservent leurs données au lieu d’échouer. Associer cette option à une comparaison source‑sortie vous fournit la preuve que les entités et les attributs ont bien été transférés, et passer à SchemaLocation lorsque le schéma original est disponible vous donne le résultat le plus fidèle. Ensemble, ces pratiques rendent la conversion GML fiable dans les travaux batch, les services web et les pipelines CI.
FAQ
1. Que fait réellement GmlOptions.RestoreSchema ?
Il permet au lecteur GML d’Aspose.GIS d’analyser les attributs des entités lorsque le schéma XML (XSD) référencé par le fichier est manquant ou ne peut pas être chargé. Le pilote parcourt le document à la recherche de structures GML connues et déduit les classes d’entités ainsi que leurs propriétés à partir des données. La valeur par défaut est false.
2. Dois‑je définir RestoreSchema à la fois pour la conversion et le fichier de sortie ?
Seulement pour les fichiers dont le schéma ne peut pas être chargé. RestoreSchema est une option du lecteur, donc pendant la conversion elle appartient à ConversionOptions.SourceDriverOptions, et lorsque vous rouvrez la sortie vous la transmettez à VectorLayer.Open. L’exemple la définit dans les deux endroits afin que le flux de travail ne dépende pas d’un XSD disponible.
3. Que se passe-t-il si RestoreSchema est false et que le schéma est manquant ?
Aspose.GIS ne peut pas construire la collection d’attributs de la fonctionnalité et lève une GisException. Le message d’exception suggère de définir RestoreSchema sur true, ou LoadSchemasFromInternet sur true lorsque le schéma est hébergé en ligne.
4. Un schéma restauré est-il identique au XSD original ?
Pas nécessairement. Aspose.GIS décrit la restauration du schéma comme sujette aux erreurs car les attributs sont déduits en analysant le fichier. Vérifiez le résultat, comme le montre l’exemple, et utilisez GmlOptions.SchemaLocation lorsque vous disposez du XSD original.
5. Puis-je utiliser RestoreSchema lors de la conversion de GML en Shapefile, GeoJSON ou d’autres formats ?
Oui. SourceDriverOptions contrôle la façon dont la source GML est lue, quel que soit le pilote de destination. Les attributs restaurés sont ensuite écrits en utilisant le modèle d’attributs propre au format de destination.
6. Dois-je une licence pour exécuter ce code ? Non. Sans licence, Aspose.GIS s’exécute en mode d’évaluation avec des limitations. Une licence temporaire gratuite supprime ces limitations pour les tests, et l’utilisation en production nécessite une licence achetée.
