使用 C# 讀取 GPX 文件

GPX 文件包含以 GPS 交換格式保存的 GPS 數據。它是一種 XML 模式,用於描述航路點、航跡、路線等地理信息。它允許在 GPS 單元和軟件應用程序之間傳輸 GPS 數據。我們可以輕鬆地加載 GPX 文件並在 .NET 應用程序中以編程方式提取 GPS 信息。在本文中,我們將學習如何使用 C# 讀取 GPX 文件。

文章應涵蓋以下主題:

用於讀取 GPX 文件的 C# API

為了從 GPX 文件中讀取特徵,我們將使用 Aspose.GIS for .NET API。它允許您渲染地圖,以及創建、讀取和轉換地理數據,而無需額外的軟件。它還使您能夠將 KML 文件轉換為 GPX 格式,反之亦然。請 下載 API 的 DLL 或使用 NuGet 安裝它。

PM> Install-Package Aspose.GIS

在 C# 中從 GPX 文件讀取航點

我們可以按照以下步驟從 GPX 文件中讀取航路點作為點幾何:

  1. 首先,使用 OpenLayer 方法加載 GPX 文件。
  2. 接下來,對於圖層中的每個要素,檢查 GeometryType 是否為 Point
  3. 之後,將特徵的幾何形狀作為一個點。
  4. 最後,顯示 X 和 Y 坐標點。

以下代碼示例展示瞭如何使用 C# 從 GPX 文件中讀取航路點。

// 此代碼示例演示如何從 GPX 文件中讀取航路點
// 加載 GPX 文件
var layer = Drivers.Gpx.OpenLayer(@"D:\Files\GIS\St_Louis_Zoo_sample.gpx");

foreach (var feature in layer)
{
    // 檢查點幾何
    if (feature.Geometry.GeometryType == GeometryType.Point)
    {
        // 讀點
        Point point = (Point)feature.Geometry;
        Console.WriteLine(point.AsText() + " X: " + point.X + " Y: " + point.Y);
    }
}
POINT (-90.29408 38.63473) X: -90.29408 Y: 38.63473
POINT (-90.28679 38.63368) X: -90.28679 Y: 38.63368
POINT (-90.29323 38.63408) X: -90.29323 Y: 38.63408
POINT (-90.29019 38.63533) X: -90.29019 Y: 38.63533
POINT (-90.28976 38.63677) X: -90.28976 Y: 38.63677
POINT (-90.28948 38.63496) X: -90.28948 Y: 38.63496
POINT (-90.29458 38.63421) X: -90.29458 Y: 38.63421
POINT (-90.29083 38.63633) X: -90.29083 Y: 38.63633
POINT (-90.28715 38.63395) X: -90.28715 Y: 38.63395
POINT (-90.28769 38.63347) X: -90.28769 Y: 38.63347

從 C# 中的 GPX 文件中讀取路由

我們可以按照以下步驟從 GPX 文件中讀取路線作為線串幾何圖形:

  1. 首先,使用 OpenLayer 方法加載 GPX 文件。
  2. 接下來,對於圖層中的每個要素,檢查 GeometryType 是否為 LineString
  3. 之後,獲取要素的幾何形狀作為 LineString。
  4. 最後,顯示 X、Y 和 Z 坐標點。

以下代碼示例展示瞭如何使用 C# 從 GPX 文件中讀取路線。

// 此代碼示例演示如何從 GPX 文件讀取 GPS 路線
// 加載 GPX 文件
var layer = Drivers.Gpx.OpenLayer(@"D:\Files\GIS\schiehallion.gpx");

foreach (var feature in layer)
{
    // 檢查 LineString 幾何
    if (feature.Geometry.GeometryType == GeometryType.LineString)
    {
        // 讀取路徑
        LineString ls = (LineString)feature.Geometry;

        foreach (var point in ls)
        {
            Console.WriteLine(" X: " + point.X + " Y: " + point.Y + " Z: " + point.Z);
        }
    }
}
=====================================================
 X: -4.03601769647726 Y: 56.6758328268945 Z: 351.247702398777
 X: -4.03583038137853 Y: 56.6753865835736 Z: 344.690721458414
 X: -4.03614000315429 Y: 56.6735618299578 Z: 349.066837113628
 X: -4.03711323311608 Y: 56.6726922276694 Z: 352.76479861559
 X: -4.03921535478461 Y: 56.6708156570976 Z: 358.078238232484
 X: -4.04184722532733 Y: 56.668930361342 Z: 371.315914270806
 X: -4.04446052766014 Y: 56.668213511889 Z: 372.334546538997
 X: -4.04552528394144 Y: 56.6682858833434 Z: 398.610199355698
 X: -4.04660281552745 Y: 56.6678413316366 Z: 439.24188764472
 X: -4.04765411258453 Y: 56.6661616045966 Z: 430.695575764036
.
.
.

在 C# 中從 GPX 文件中提取軌跡

我們可以按照以下步驟從 GPX 文件中讀取軌道作為 MultiLineString 幾何圖形:

  1. 首先,使用 OpenLayer 方法加載 GPX 文件。
  2. 接下來,對於圖層中的每個要素,檢查 GeometryType 是否為 MultiLineString
  3. 之後,獲取要素的幾何形狀作為 MultiLineString。
  4. 最後,顯示軌道。

下面的代碼示例展示瞭如何使用 C# 從 GPX 文件中讀取軌跡。

// 此代碼示例演示如何從 GPX 文件中讀取曲目
// 加載 GPX 文件
var layer = Drivers.Gpx.OpenLayer(@"D:\Files\GIS\nested_data.gpx");

foreach (var feature in layer)
{
    // 檢查 MultiLineString 幾何
    if (feature.Geometry.GeometryType == GeometryType.MultiLineString)
    {
        // 讀取軌道
        var lines = (MultiLineString)feature.Geometry;
        foreach(var line in lines)
        {
            Console.WriteLine(line.AsText());
        }
    }
}
LINESTRING (0 0, 1 1, 2 2, 3 3)
LINESTRING EMPTY
LINESTRING EMPTY
LINESTRING (10 10, 11 11, 12 12, 13 13)

在 C# 中讀取 GPX 嵌套屬性

我們可以按照以下步驟讀取段中每個點的特徵並提取嵌套屬性值:

  1. 首先,創建 GpxOptions 類的一個實例。
  2. 接下來,將 ReadNestedAttributes 設置為 true。
  3. 然後,使用 OpenLayer() 方法以 GpxOptions 對像作為參數加載 GPX 文件。
  4. 接下來,對於圖層中的每個要素,檢查 GeometryType 是否為 MultiLineString
  5. 然後,獲取要素的幾何形狀作為 MultiLineString。
  6. 之後,從每個 MultiLineString 中讀取作為 LineString 的段。
  7. 最後,讀取段中的點並顯示屬性值。

以下代碼示例展示瞭如何使用 C# 從 GPX 文件中讀取 GPX 嵌套屬性。

// 此代碼示例演示如何從 GPX 文件讀取 GPX 嵌套屬性
// 指定 GPX 選項
GpxOptions options = new GpxOptions()
{
    ReadNestedAttributes = true
};


// 加載 GPX 文件並打開圖層以讀取功能
using (var layer = Drivers.Gpx.OpenLayer(@"D:\Files\GIS\nested_data.gpx", options))
{
    foreach (var feature in layer)
    {
        // 檢查 MultiLineString 幾何
        if (feature.Geometry.GeometryType == GeometryType.MultiLineString)
        {
            // 讀段
            var lines = (MultiLineString) feature.Geometry;
           for (int i = 0; i < lines.Count; i++)
            {
                Console.WriteLine($"....segment({i})......");
                var segment = (LineString)lines[i];

                // 分段讀取點
               for (int j = 0; j < segment.Count; j++)
                {
                    // 尋找屬性
                    string attributeName = $"name__{i}__{j}";
                    if (layer.Attributes.Contains(attributeName) && feature.IsValueSet(attributeName))
                    {
                        // 打印一個點和屬性
                        var value = feature.GetValue<string>(attributeName);
                        Console.WriteLine($"{segment[j].AsText()} - {attributeName}: {value}, ");
                    }
                    else
                    {
                        // 只打印一個點
                        Console.WriteLine(segment[j].AsText());
                    }
                }
            }
            Console.WriteLine("..........");
        }
    }
}

獲得免費許可證

您可以 獲得免費的臨時許可證 來試用該庫,而沒有評估限制。

結論

在本文中,我們學習瞭如何:

  • 在 C# 中使用 OpenLayer 加載 GPX 文件;
  • 以編程方式從 GPX 文件中讀取航路點、路線和軌跡;
  • 使用 C# 從 GPX 文件中讀取嵌套屬性。

此外,您可以使用 文檔 了解有關 Aspose.GIS for .NET API 的更多信息。如有任何歧義,請隨時在論壇上與我們聯繫。

也可以看看