Việc chuyển đổi các tệp GML (Geography Markup Language) trông có vẻ đơn giản cho đến khi trình đọc không thể tìm thấy schema XML. Một tệp GML mô tả các loại đối tượng và thuộc tính của nó trong một XSD riêng biệt được tham chiếu qua thuộc tính schemaLocation. Khi schema đó bị mất, di chuyển hoặc không thể tải xuống, các định nghĩa thuộc tính cũng sẽ mất theo, và một công việc chuyển đổi đã hoạt động trên máy của bạn sẽ bắt đầu thất bại trên máy chủ xây dựng. Hướng dẫn này cho thấy cách bảo tồn thông tin schema GML trong quá trình chuyển đổi bằng C# sử dụng Aspose.GIS for .NET, và cách chứng minh rằng các đối tượng và thuộc tính đã tồn tại qua vòng quay.

Tại sao việc bảo tồn sơ đồ GML lại quan trọng

GML là một định dạng trao đổi phổ biến vì nó mang cả dữ liệu hình học và thuộc tính cùng nhau. Cấu trúc của dữ liệu đó, nghĩa là các loại đối tượng, tên thuộc tính và kiểu dữ liệu, được định nghĩa bởi một schema ứng dụng. Aspose.GIS đọc schema này để xây dựng bộ sưu tập thuộc tính của lớp, vì vậy schema là thứ chuyển đổi XML thô thành các cột có thể sử dụng trong mã của bạn, trong QGIS hoặc trong ArcGIS.

Trong các pipeline thực tế, schema thường là mắt yếu nhất. Các tệp được sao chép mà không có XSD của chúng, schemaLocation trỏ tới một URL đã lỗi thời, hoặc máy chủ thực hiện chuyển đổi không có kết nối internet. Trong những trường hợp này, Aspose.GIS dừng lại với một GisException giải thích rằng nó không thể xây dựng bộ sưu tập thuộc tính của đối tượng. Tùy chọn GmlOptions.RestoreSchema giải quyết vấn đề này bằng cách cho phép trình đọc tái tạo schema thuộc tính từ dữ liệu của chính đối tượng, vì vậy các chuyển đổi của bạn sẽ giữ lại các thuộc tính thay vì thất bại hoặc tạo ra đầu ra không đầy đủ.

Bắt đầu với Aspose.GIS for .NET

Aspose.GIS for .NET là một thư viện được quản lý để đọc, ghi và chuyển đổi các định dạng GIS như GML, Shapefile, GeoJSON, KML và File Geodatabase, mà không cần yêu cầu ArcGIS hoặc QGIS trên máy. Thêm nó vào dự án của bạn từ NuGet:

Install-Package Aspose.GIS

Hoặc với .NET CLI:

dotnet add package Aspose.GIS

Bạn có thể tìm hiểu thêm trên trang sản phẩm Aspose.GIS for .NET và trong Aspose.GIS .NET API Reference. Hai không gian tên được sử dụng trong hướng dẫn này là Aspose.Gis, chứa VectorLayer, Drivers và ConversionOptions, và Aspose.Gis.Formats.Gml, chứa GmlOptions.

Hướng dẫn từng bước để bảo tồn sơ đồ GML

Ví dụ C# sau chuyển đổi một tệp GML sang một tệp GML mới trong khi khôi phục lược đồ thuộc tính, sau đó xác minh kết quả. Nó nhắm tới .NET 6 hoặc phiên bản mới hơn.

Những gì ví dụ thực hiện

  1. Tạo tùy chọn đọc với GmlOptions.RestoreSchema được đặt thành true.
  2. Mở GML nguồn và ghi lại số lượng tính năng và tên thuộc tính của nó.
  3. Chuyển đổi tệp bằng VectorLayer.Convert, truyền các tùy chọn đọc qua ConversionOptions.SourceDriverOptions.
  4. Mở lại đầu ra với việc khôi phục schema và so sánh nó với nguồn.
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 };
}

Giải thích từng bước

  • Creating reader options – GmlOptions chứa các cài đặt driver đặc thù cho GML. Theo tài liệu tham khảo GmlOptions.RestoreSchema việc đặt nó thành true có nghĩa là trình đọc không còn cần một schema XML nữa. Driver sẽ quét tệp để tìm các cấu trúc GML đã biết và suy ra các lớp đối tượng và thuộc tính của chúng. Mặc định là false.
  • Capturing the source structure – Mở nguồn bằng VectorLayer.Open sẽ cho bạn một cơ sở. layer.Count trả về số lượng đối tượng, và layer.Attributes hiển thị bộ sưu tập thuộc tính, trong đó mỗi FeatureAttribute có một Name và một DataType.
  • Calling VectorLayer.Convert – Phiên bản overload được sử dụng ở đây chấp nhận đường dẫn nguồn, driver nguồn, đường dẫn đích, driver đích, và một đối tượng ConversionOptions. SourceDriverOptions điều khiển cách đầu vào được đọc, trong khi DestinationDriverOptions điều khiển cách đầu ra được ghi. Vì RestoreSchema ảnh hưởng đến việc đọc, nó được đặt ở phía nguồn.
  • Verifying the output – Đầu ra được mở lại với cùng tùy chọn đọc để việc xác minh không phụ thuộc vào việc có XSD hay không. Thay vì sử dụng các số cố định, mẫu so sánh đầu ra với nguồn. Nó sẽ thất bại khi các đối tượng hoặc thuộc tính bị mất và in ra tên và kiểu dữ liệu của các thuộc tính đã được khôi phục để xem xét. Các thuộc tính bổ sung không được coi là lỗi, vì các định danh như gml_id có thể được hiển thị khác nhau sau khi chuyển đổi.

Đọc GML Khi XSD Gốc Có Sẵn

Khôi phục schema là một phương án dự phòng. Nếu bạn vẫn còn tệp schema gốc, hãy chỉ định cho trình đọc tới nó bằng SchemaLocation để các định nghĩa thuộc tính được lấy từ XSD thay vì được suy luận.

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

Khi SchemaLocation là null (mặc định), Aspose.GIS đọc schemaLocation từ phần tử gốc của tài liệu GML. LoadSchemasFromInternet mặc định là false, vì vậy các schema được tham chiếu bằng URI tuyệt đối không phải file:// sẽ không được tải xuống trừ khi bạn bật nó.

Nhận giấy phép miễn phí

Aspose.GIS chạy ở chế độ đánh giá với các hạn chế cho đến khi giấy phép được áp dụng. Để thử toàn bộ bộ tính năng, yêu cầu một Giấy phép tạm thời miễn phí và áp dụng nó trước thao tác GIS đầu tiên của bạn:

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

Tài Nguyên Bổ Sung Miễn Phí

Kết luận

Việc bảo tồn thông tin lược đồ GML trong quá trình chuyển đổi phụ thuộc vào việc kiểm soát cách nguồn được đọc. Khi truyền GmlOptions.RestoreSchema qua ConversionOptions.SourceDriverOptions, Aspose.GIS for .NET có thể tái tạo lại các định nghĩa thuộc tính ngay cả khi XSD bị thiếu hoặc không thể truy cập, do đó các chuyển đổi giữ được dữ liệu thay vì thất bại. Kết hợp tùy chọn này với việc so sánh nguồn‑đến‑đầu ra sẽ cung cấp bằng chứng rằng các đối tượng và thuộc tính đã được chuyển qua, và chuyển sang SchemaLocation khi lược đồ gốc có sẵn sẽ cho kết quả trung thực nhất. Cùng nhau, những thực hành này làm cho việc chuyển đổi GML trở nên đáng tin cậy trong các công việc batch, dịch vụ web và pipeline CI.

Câu hỏi thường gặp

1. GmlOptions.RestoreSchema thực sự làm gì?
Nó cho phép trình đọc GML của Aspose.GIS phân tích các thuộc tính của đối tượng khi sơ đồ XML (XSD) được tham chiếu bởi tệp bị thiếu hoặc không thể tải. Trình điều khiển quét tài liệu để tìm các cấu trúc GML đã biết và suy ra các lớp đối tượng và các thuộc tính của chúng từ dữ liệu. Giá trị mặc định là false.

2. Tôi có cần đặt RestoreSchema cho cả quá trình chuyển đổi và tệp đầu ra không? Chỉ áp dụng cho các tệp mà không thể tải schema. RestoreSchema là một tùy chọn đọc, vì vậy trong quá trình chuyển đổi nó thuộc về ConversionOptions.SourceDriverOptions, và khi bạn mở lại tệp đầu ra bạn truyền nó cho VectorLayer.Open. Ví dụ đặt nó ở cả hai vị trí để quy trình làm việc không phụ thuộc vào việc có sẵn XSD.

3. Điều gì xảy ra nếu RestoreSchema là false và schema bị thiếu? Aspose.GIS không thể xây dựng bộ sưu tập thuộc tính tính năng và ném ra một GisException. Thông báo ngoại lệ đề xuất đặt RestoreSchema thành true, hoặc LoadSchemasFromInternet thành true khi schema được lưu trữ trực tuyến.

4. Một schema được khôi phục có giống hệt schema XSD gốc không?
Không nhất thiết. Aspose.GIS mô tả việc khôi phục schema là dễ gây lỗi vì các thuộc tính được suy ra bằng cách quét tệp. Hãy xác minh kết quả, như mẫu đã làm, và sử dụng GmlOptions.SchemaLocation khi bạn có XSD gốc.

5. Tôi có thể sử dụng RestoreSchema khi chuyển đổi GML sang Shapefile, GeoJSON hoặc các định dạng khác không?
Có. SourceDriverOptions kiểm soát cách nguồn GML được đọc bất kể trình điều khiển đích. Các thuộc tính đã khôi phục sau đó được ghi bằng mô hình thuộc tính riêng của định dạng đích.

6. Tôi có cần giấy phép để chạy đoạn mã này không? Không. Nếu không có giấy phép, Aspose.GIS chạy ở chế độ đánh giá với các hạn chế. Một giấy phép tạm thời miễn phí sẽ loại bỏ các hạn chế này cho việc thử nghiệm, và việc sử dụng trong môi trường sản xuất yêu cầu mua giấy phép.

Đọc thêm