GML(Geography Markup Language)ファイルの変換は、リーダーが XML スキーマを見つけられないまで簡単に見えます。A GML ファイルは、schemaLocation 属性で参照される別個の XSD に機能タイプと属性を記述します。そのスキーマが失われた、移動した、またはダウンロードできない場合、属性定義も失われ、マシン上で動作していた変換ジョブがビルドサーバーで失敗し始めます。このガイドでは、C# で Aspose.GIS for .NET を使用して変換中に GML スキーマ情報を保持する方法と、機能と属性が往復変換後も残っていることを確認する方法を示します。

GML スキーマを保持することが重要な理由

GMLはジオメトリと属性データを一緒に保持するため、人気のあるインターチェンジ形式です。そのデータの構造、つまりフィーチャ タイプ、属性名、データ型はアプリケーション スキーマで定義されます。Aspose.GISはこのスキーマを読み取り、レイヤーの属性コレクションを構築するため、スキーマは生の XML をコード内、QGIS、または ArcGIS で使用できる列に変換する役割を果たします。

実際のパイプラインでは、スキーマがしばしば最も弱いリンクになります。ファイルが XSD なしでコピーされ、schemaLocation が古い URL を指しているか、変換を実行しているサーバーがインターネットにアクセスできない場合があります。このようなケースでは Aspose.GIS が GisException で停止し、機能属性コレクションの構築に失敗したことを説明します。GmlOptions.RestoreSchema オプションは、リーダーが機能データ自体から属性スキーマを再構築できるようにすることでこれを解決し、変換が属性を保持したまま失敗したり不完全な出力を生成したりしないようにします。

Aspose.GIS for .NET の開始

Aspose.GIS for .NET は、GML、Shapefile、GeoJSON、KML、File Geodatabase などの GIS フォーマットの読み取り、書き込み、変換を行うマネージド ライブラリで、マシンに ArcGIS や QGIS をインストールする必要はありません。NuGet からプロジェクトに追加してください:

Install-Package Aspose.GIS

または .NET CLI を使用して:

dotnet add package Aspose.GIS

この製品ページである Aspose.GIS for .NET と、Aspose.GIS .NET API Reference で詳細をご確認いただけます。 このチュートリアルで使用される 2 つの名前空間は 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 のような識別子は変換後に異なる形で公開される可能性があるため、余分な属性はエラーとして扱われません。

元の XSD が利用可能な場合の GML の読み取り

スキーマの復元はフォールバックです。元のスキーマファイルがまだある場合は、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 は GML ドキュメントのルート要素から schemaLocation を読み取ります。LoadSchemasFromInternet はデフォルトで false なので、file:// 以外の絶対 URI で参照されているスキーマは、有効にしない限りダウンロードされません。

無料ライセンスを取得する

Aspose.GIS はライセンスが適用されるまで評価モードで実行され、制限があります。フル機能セットをテストするには、Free Temporary License をリクエストし、最初の GIS 操作の前に適用してください:

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

無料の追加リソース

結論

変換中に GML スキーマ情報を保持するには、ソースの読み取り方法を制御することが重要です。GmlOptions.RestoreSchema を ConversionOptions.SourceDriverOptions 経由で渡すことで、Aspose.GIS for .NET は XSD が欠落している、または到達できない場合でも属性定義を再構築できるため、変換が失敗せずにデータを保持します。このオプションをソースから出力への比較と組み合わせると、フィーチャと属性が正しく渡されたことを確認できます。また、元のスキーマが利用可能な場合は SchemaLocation に切り替えることで、最も忠実な結果が得られます。これらの手法を組み合わせることで、バッチジョブ、Web サービス、CI パイプラインにおける GML 変換の信頼性が向上します。

よくある質問

1. GmlOptions.RestoreSchema は実際に何をするのですか? ファイルが参照している XML スキーマ (XSD) が欠落しているか読み込めない場合に、Aspose.GIS の GML リーダーがフィーチャ属性を解析できるようにします。ドライバーはドキュメント内の既知の GML 構造をスキャンし、データからフィーチャ クラスとそのプロパティを推測します。デフォルト値は false です。

2. Do I need to set RestoreSchema for both the conversion and the output file?
スキーマをロードできないファイルに対してのみです。 RestoreSchema はリーダーオプションであり、変換中は ConversionOptions.SourceDriverOptions に属し、出力を再度開く際には VectorLayer.Open に渡します。サンプルでは両方に設定しているため、ワークフローが XSD の有無に依存しません。

3. RestoreSchema が false でスキーマが存在しない場合はどうなりますか?
Aspose.GIS はフィーチャ属性コレクションを構築できず、GisException をスローします。例外メッセージは、スキーマがオンラインでホストされている場合に RestoreSchema を true に設定するか、LoadSchemasFromInternet を true に設定することを示唆しています。

4. 復元されたスキーマは元の XSD と同一ですか?
必ずしもそうとは限りません。Aspose.GIS は、属性がファイルのスキャンによって推測されるため、スキーマの復元はエラーが起きやすいと説明しています。サンプルが行うように結果を検証し、元の XSD がある場合は GmlOptions.SchemaLocation を使用してください。

5. GML を Shapefile、GeoJSON、またはその他の形式に変換する際に RestoreSchema を使用できますか? はい。SourceDriverOptions は、宛先ドライバーに関係なく GML ソースの読み取り方法を制御します。復元された属性は、宛先形式独自の属性モデルを使用して書き込まれます。

6. このコードを実行するためにライセンスは必要ですか? いいえ。ライセンスがない場合、Aspose.GIS は制限付きの評価モードで実行されます。無料の一時ライセンスはテスト用の制限を解除し、実稼働での使用には購入したライセンスが必要です。

続きを読む