You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中从KML文件提取WKT字符串(基于ArcGIS Runtime)

使用ArcGIS Runtime .NET解析KML(点/线/面)并生成WKT

完全可以通过LINQ结合XML解析实现,KML本质是遵循OGIS规范的XML文档,无需第三方工具,直接用.NET自带的System.Xml.Linq即可完成提取,步骤如下:


核心思路

  1. 将KML文件加载为XDocument对象,处理KML的默认命名空间
  2. 用LINQ查询定位<Point>/<LineString>/<Polygon>节点(取第一个匹配项,满足单一几何要求)
  3. 解析<coordinates>节点的文本内容,转换为地理坐标
  4. 生成ArcGIS Runtime的Geometry对象,直接转为WKT字符串或添加到地图

实现代码

1. 必要命名空间

using System.Xml.Linq;
using Esri.ArcGISRuntime.Geometry;
using Esri.ArcGISRuntime.Mapping;
using Esri.ArcGISRuntime.Symbology;
using Esri.ArcGISRuntime.UI.Controls;

2. KML解析与Geometry生成方法

public static Geometry ParseKmlToGeometry(string kmlFilePath)
{
    // 加载KML文件为XML文档
    var kmlDoc = XDocument.Load(kmlFilePath);
    // KML的默认命名空间必须指定,否则LINQ无法匹配节点
    XNamespace kmlNs = "http://www.opengis.net/kml/2.2";

    // 解析点几何
    var pointElement = kmlDoc.Descendants(kmlNs + "Point").FirstOrDefault();
    if (pointElement != null)
    {
        var coordText = pointElement.Element(kmlNs + "coordinates").Value.Trim();
        var coords = coordText.Split(',');
        double lon = double.Parse(coords[0]);
        double lat = double.Parse(coords[1]);
        return new MapPoint(lon, lat, SpatialReferences.Wgs84);
    }

    // 解析线几何
    var lineElement = kmlDoc.Descendants(kmlNs + "LineString").FirstOrDefault();
    if (lineElement != null)
    {
        var coordText = lineElement.Element(kmlNs + "coordinates").Value.Trim();
        var coordPairs = coordText.Split(new[] { ' ', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
        var mapPoints = coordPairs.Select(pair =>
        {
            var coords = pair.Split(',');
            return new MapPoint(double.Parse(coords[0]), double.Parse(coords[1]), SpatialReferences.Wgs84);
        }).ToList();
        return new Polyline(mapPoints);
    }

    // 解析多边形几何
    var polygonElement = kmlDoc.Descendants(kmlNs + "Polygon").FirstOrDefault();
    if (polygonElement != null)
    {
        var linearRing = polygonElement.Descendants(kmlNs + "LinearRing").FirstOrDefault();
        if (linearRing != null)
        {
            var coordText = linearRing.Element(kmlNs + "coordinates").Value.Trim();
            var coordPairs = coordText.Split(new[] { ' ', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
            var mapPoints = coordPairs.Select(pair =>
            {
                var coords = pair.Split(',');
                return new MapPoint(double.Parse(coords[0]), double.Parse(coords[1]), SpatialReferences.Wgs84);
            }).ToList();
            return new Polygon(mapPoints);
        }
    }

    return null; // 未找到支持的几何类型
}

3. 生成WKT并添加到地图

// 调用解析方法
var targetGeometry = ParseKmlToGeometry(@"C:\your_kml_file.kml");
if (targetGeometry != null)
{
    // 生成WKT字符串
    string wktString = targetGeometry.ToWkt();
    
    // 将几何添加到地图控件
    var graphic = new Graphic(
        targetGeometry,
        new SimpleLineSymbol(SimpleLineSymbolStyle.Solid, System.Drawing.Color.Blue, 2)
    );
    // 假设已创建GraphicsOverlay并添加到MapView
    yourMapView.GraphicsOverlays.First().Graphics.Add(graphic);
}

关键注意事项

  • 命名空间处理:KML文档默认使用http://www.opengis.net/kml/2.2命名空间,LINQ查询时必须指定,否则无法匹配节点
  • 坐标顺序:KML的坐标格式为经度,纬度[,海拔],与ArcGIS RuntimeMapPoint的(x=经度, y=纬度)参数顺序一致,无需转换
  • 单一几何限制:代码中使用FirstOrDefault()取第一个匹配的几何节点,满足你仅处理单一几何的需求
  • 闭合多边形:KML规范要求多边形的线性环首尾点一致,ArcGIS Runtime会自动处理未闭合的情况

内容的提问来源于stack exchange,提问作者f_olivere

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:50:35