使用 C# 读取 GPX 文件

GPX 文件包含以 GPS 交换格式保存的 GPS 数据。它是一种 XML 模式,用于描述诸如航点、航迹、路线等地理信息。它允许在 GPS 单元和软件应用程序之间传输 GPS 数据。我们可以在 .NET 应用程序中以编程方式轻松加载 GPX 文件并提取 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. 然后,使用带有 GpxOptions 对象作为参数的 OpenLayer() 方法加载 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 的信息。如有任何歧义,请随时在 论坛 上与我们联系。

也可以看看