【问题标题】:Reading kml file to get coordinates in c#读取kml文件以获取c#中的坐标
【发布时间】:2019-05-15 21:16:17
【问题描述】:

好的,所以我一直在努力阅读一个 kml 文件,其中包含美国每个县/市的边界坐标。但是,我遇到了一些问题。特别是如何获取NextNode的值,当一个元素的值中间有另一个元素标签时怎么办。

kml 文件如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document id="root_doc">
<Schema name="gadm36_USA_2" id="gadm36_USA_2">
    <SimpleField name="NAME_0" type="string"></SimpleField>
    <SimpleField name="NAME_1" type="string"></SimpleField>
    <SimpleField name="NAME_2" type="string"></SimpleField>
</Schema>
<Folder><name>gadm36_USA_2</name>
  <Placemark>
    <Style><LineStyle><color>ff0000ff</color></LineStyle><PolyStyle><fill>0</fill></PolyStyle></Style>
    <ExtendedData><SchemaData schemaUrl="#gadm36_USA_2">
        <SimpleData name="NAME_0">United States</SimpleData>
        <SimpleData name="NAME_1">Alabama</SimpleData>
        <SimpleData name="NAME_2">Autauga</SimpleData>
    </SchemaData></ExtendedData>
      <MultiGeometry><Polygon><outerBoundaryIs><LinearRing><coordinates>-86.8189620971679,32.3402709960939 -86.8108367919922,32.3471298217775 -86.8097915649414,32.3535118103028 -86.8103485107422,32.3585205078126 -86.8158340454101,32.3703498840333 -86.8239974975586,32.3785285949708 -86.8310775756835,32.3839797973634 -86.83544921875,32.3912506103515 -86.8419876098633,32.3980712890626 -86.8452758789062,32.4044418334961 -86.8458633422851,32.4140090942383 -86.8447875976562,32.4167404174805 </coordinates></LinearRing></outerBoundaryIs></Polygon><Polygon><outerBoundaryIs><LinearRing><coordinates>-86.8426208496093,32.4181213378907 -86.8361129760742,32.4204101562501 -86.8296127319336,32.4227104187012 -86.8274383544922,32.4240798950195 -86.8263626098633,32.4259109497071 -86.8280029296875,32.4277305603028 -86.8307189941406,32.4295387268066 </coordinates></LinearRing></outerBoundaryIs></Polygon></MultiGeometry>
  </Placemark>

注意,这不是这些随机元素标签出现在坐标中间的实际示例,拥有它们的县通常有一个庞大的坐标列表,根据我的经验,如果我浏览 kml 文件并且只使用在第一个元素标签之前的值,它似乎映射出正确的县边界

List<string> locationList = new List<string>();
var doc = XDocument.Load("gadm36_USA1.kml");
XNamespace ns = "http://www.opengis.net/kml/2.2";
var result = doc.Root.Descendants(ns + "Placemark");
foreach (XElement xmlInfo in result)
{
   var region = xmlInfo.Element(ns + "ExtendedData").Element(ns + "SchemaData").Value;
   //var country = region.Element(ns + "SimpleData").Value;
   //var state = region.Element(ns + "SimpleData");
   //var cityCounty = region.Element(ns + "SimpleData");
   locationList = xmlInfo.Element(ns + "MultiGeometry").Value.Split(' ').ToList();
   CountyCoordinates.Add(region, locationList);
}

所以当我到达变量“区域”时,它会将所有元素值组合在一起。例如,它会说“United StatesAutaugaAlabama”。

至于坐标,由于坐标值中间有这些随机元素标签,所以当我用“ ”分割坐标时,碰到这些随机元素标签就搞砸了。 (当它到达坐标中间的文本时,拆分将返回'-86, 32 -86',而不仅仅是'-86, 32')所以,我基本上是在寻求有关如何阅读的帮助国家、州和县分别以及如何在这些随机元素标签中正确读取坐标。

【问题讨论】:

  • xml 是具有许多不同层的多级文档。在查找 MultiGeometry 之前,您必须查找具有名称的标签。
  • 元素永远不会是随机的。 KML 文件很大,包含许多层,并且是机器生成的。该文件可能对您没有多大意义,但读取该文件的计算机可以理解这些文件。 KML 文件旨在生成您的大脑可以看到的图片,但数据可能会断裂,您的眼睛并不关心一切是否连续。我使用过很多帮助 OP 解析数据的 KML 文件。有一次我花了一周时间完成其中一项任务,因为我不断出现内存不足的错误。你很幸运,你的文件不是很大..
  • 我没有关注如何处理多层。你们能否就如何做到这一点提供更多指导。我一直在解析 xml 文件,但 kml 文件对我来说很新
  • 那么我不是寻找MultiGeometry,而是寻找坐标?
  • 如果坐标是给你所有你需要的属性的父级。现在您只发布了地标。地标将为您提供名称和坐标。我会寻找所有的地标,但地标并没有给你地图上的所有城镇。道路是一层,位置(如城镇)是另一层,地标是另一层。您需要哪一层?

标签: c# xml kml gmap.net


【解决方案1】:

我刚刚测试了一个得到的结果:

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);
            XElement root = doc.Root;
            XNamespace ns = root.GetDefaultNamespace();

            List<XElement> simpleFields;

            List<XElement> extendedDatas = doc.Descendants(ns + "ExtendedData").ToList(); 

            foreach(XElement extendedData in extendedDatas)
            {
                simpleFields = extendedData.Descendants(ns + "SimpleData").ToList(); 
            } 
        }
    }
}

【讨论】:

    【解决方案2】:

    我想你的意思是:

         List<XElement> extendedDatas = doc.Descendants(ns + "ExtendedData").ToList();
                var a_docment = root.Element(ns + "Document").Value;
                var result = doc.Root.Descendants(ns + "Placemark");
                foreach (XElement xmlInfo in result)
                {
         
                    List<string> locationList = new List<string>();
                    var gg  = xmlInfo.Descendants(ns + "outerBoundaryIs").ToList();
        
                    foreach (XElement extendedData in gg)
                    {
                        locationList.AddRange(extendedData.Value.Split(' ').ToList());
                    }
    

    【讨论】:

      猜你喜欢
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多