【问题标题】:How to get KML Polygon and Multigeometry values in c#?如何在 C# 中获取 KML 多边形和多几何值?
【发布时间】:2015-05-26 10:45:10
【问题描述】:

我可以使用此代码读取和获取 KML 数据地标值

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            List<XElement> placemarks = doc.Descendants().Where(x => x.Name.LocalName == "Placemark").ToList();
            List<string> states = placemarks.Descendants().Where(x => x.Name.LocalName == "name").Select(x => x.Value).ToList();
        }
    }

}

但如果KML数据有以下详细信息,我不知道如何获取:

  1. 示例:阿拉巴马州 KML 格式类似

    &lt;Polygon&gt; &lt;outerBoundaryIs&gt; &lt;LinearRing&gt; &lt;coordinates&gt;-85.070067,31.980703,0.0 -85.11515,31.907425,0.0 -85.135567,31.854884,0.0 -85.0567,32.017377,0.0 -85.070067,31.980703,0.0&lt;/coordinates&gt; &lt;/LinearRing&gt; &lt;/outerBoundaryIs&gt; &lt;/Polygon&gt;

  2. 示例:德克萨斯州 KML 格式,如

    &lt;MultiGeometry&gt; &lt;Polygon&gt; &lt;outerBoundaryIs&gt; &lt;LinearRing&gt; &lt;coordinates&gt;-161.333785,58.703653&lt;/coordinates&gt; &lt;/LinearRing&gt; &lt;/outerBoundaryIs&gt; &lt;/Polygon&gt; &lt;Polygon&gt; &lt;outerBoundaryIs&gt; &lt;LinearRing&gt; &lt;coordinates&gt;-131.594177,55.106316,55.23548,0.0&lt;/coordinates&gt; &lt;/LinearRing&gt; &lt;/outerBoundaryIs&gt; &lt;/Polygon&gt; &lt;/MultiGeometry&gt;

我尝试了这个LINQ 程序来获取多边形值:

List<string> states = placemarks.Descendants().Where(x => x.Name.LocalName == "Polygon").Select(x => x.Value).ToList();

输出:

-85.070067,31.980703,0.0 -85.11515,31.907425,0.0 -85.135567,31.854884,0.0 -85.0567,32.017377,0.0 -85.070067,31.980703,0.0

在我尝试替换如下所示格式的坐标并将它们复制/粘贴到融合表位置预览中后,地图完全按预期工作。

<Polygon> <outerBoundaryIs> <LinearRing> <coordinates>-85.070067,31.980703,0.0 -85.11515,31.907425,0.0 -85.135567,31.854884,0.0 -85.0567,32.017377,0.0 -85.070067,31.980703,0.0</coordinates> </LinearRing> </outerBoundaryIs> </Polygon>

但是当我尝试使用相同的方式获取 Multigeometry 值时:

List<string> states = placemarks.Descendants().Where(x => x.Name.LocalName == "MultiGeometry").Select(x => x.Value).ToList();

我得到了这个输出:

-161.333785,58.703653 -131.594177,55.106316,55.23548,0.0

但我不知道如何获取详细信息。

【问题讨论】:

    标签: c# linq kml


    【解决方案1】:

    在我尝试替换如下所示格式的坐标并将它们复制/粘贴到融合表位置预览中后,地图完全按预期工作。

    &lt;Polygon&gt; &lt;outerBoundaryIs&gt; &lt;LinearRing&gt; &lt;coordinates&gt;-85.070067,31.980703,0.0 -85.11515,31.907425,0.0 -85.135567,31.854884,0.0 -85.0567,32.017377,0.0 -85.070067,31.980703,0.0&lt;/coordinates&gt; &lt;/LinearRing&gt; &lt;/outerBoundaryIs&gt; &lt;/Polygon&gt;

    如果您想要 XElement 的 XML 标记,只需调用 ToString() 而不是获取它的 Value 属性:

    List<string> states = placemarks.Descendants()
                                    .Where(x => x.Name.LocalName == "MultiGeometry")
                                    .Select(x => x.ToString())
                                    .ToList();
    

    ..或者如果您真的想从MultiGeometry 获取单个坐标值:

    List<string> states = placemarks.Descendants()
                                    .Where(x => x.Name.LocalName == "MultiGeometry")
                                    .Descendants()
                                    .Where(x => x.Name.LocalName == "Polygon")
                                    .Select(x => x.Value)
                                    .ToList();
    

    【讨论】:

    • 如何根据 AK 或 AL 等名称获取 MultiGeometry 值。示例:List MultiGeometry = doc.Descendants().Where(x => (x.Name.LocalName == "MultiGeometry") && (? == "AK")).ToList();
    猜你喜欢
    • 2016-09-11
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 2013-02-25
    相关资源
    最近更新 更多