GML(Geography Markup Language) 파일을 변환하는 것은 읽기 프로그램이 XML 스키마를 찾지 못할 때까지는 간단해 보입니다. A GML 파일은 별도의 XSD에 기능 유형과 속성을 설명하며, 이는 schemaLocation 속성을 통해 참조됩니다. 해당 스키마가 손실되거나 이동했거나 다운로드할 수 없게 되면 속성 정의도 함께 사라지고, 로컬에서는 정상적으로 작동하던 변환 작업이 빌드 서버에서 실패하게 됩니다. 이 가이드는 Aspose.GIS for .NET을 사용하여 C#에서 변환 중에 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

You can learn more on the Aspose.GIS for .NET product page and in the Aspose.GIS .NET API Reference. The two namespaces used in this tutorial are Aspose.Gis, which contains VectorLayer, Drivers, and ConversionOptions, and Aspose.Gis.Formats.Gml, which contains 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는 라이선스가 적용될 때까지 제한이 있는 평가 모드로 실행됩니다. 전체 기능 세트를 테스트하려면 무료 임시 라이선스를 요청하고 첫 번째 GIS 작업 전에 적용하십시오.

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

무료 추가 리소스

결론

변환 중에 GML 스키마 정보를 보존하는 것은 소스를 어떻게 읽는지를 제어하는 것에 달려 있습니다. GmlOptions.RestoreSchema를 ConversionOptions.SourceDriverOptions를 통해 전달하면 Aspose.GIS for .NET은 XSD가 없거나 접근할 수 없을 때도 속성 정의를 재구성할 수 있어, 변환이 데이터를 유지하고 실패하지 않게 합니다. 이 옵션을 소스와 출력 비교와 결합하면 기능과 속성이 제대로 전달되었는지 확인할 수 있으며, 원본 스키마가 있을 때 SchemaLocation으로 전환하면 가장 충실한 결과를 얻을 수 있습니다. 이러한 관행을 함께 사용하면 배치 작업, 웹 서비스 및 CI 파이프라인에서 GML 변환을 신뢰할 수 있게 됩니다.

자주 묻는 질문

1. What does GmlOptions.RestoreSchema actually do? It lets the Aspose.GIS GML reader parse feature attributes when the XML schema (XSD) referenced by the file is missing or cannot be loaded. The driver scans the document for known GML structures and infers the feature classes and their properties from the data. The default value is false.

2. 변환 및 출력 파일 모두에 RestoreSchema를 설정해야 하나요? 스키마를 로드할 수 없는 파일에만 필요합니다. 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는 제한이 있는 평가 모드로 실행됩니다. 무료 임시 라이선스는 테스트용으로 이러한 제한을 제거하며, 실제 사용에는 구매한 라이선스가 필요합니다.

자세히 보기