如何在C#中从KML文件提取WKT字符串(基于ArcGIS Runtime)
使用ArcGIS Runtime .NET解析KML(点/线/面)并生成WKT
完全可以通过LINQ结合XML解析实现,KML本质是遵循OGIS规范的XML文档,无需第三方工具,直接用.NET自带的System.Xml.Linq即可完成提取,步骤如下:
核心思路
- 将KML文件加载为
XDocument对象,处理KML的默认命名空间 - 用LINQ查询定位
<Point>/<LineString>/<Polygon>节点(取第一个匹配项,满足单一几何要求) - 解析
<coordinates>节点的文本内容,转换为地理坐标 - 生成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
相关产品推荐
相关产品推荐

