Чтение файла kml для получения координат в c # - PullRequest
0 голосов
/ 16 мая 2019

Хорошо, так что я работал над чтением в файле 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);
}

Так что, когда я добираюсь до переменной "регион", он группирует все значения элемента вместе.Например, он скажет «Соединенные ШтатыАутугаАлабама».

Что касается координат, поскольку в середине значений координат находятся эти теги случайных элементов, когда я делю координаты на "", он облажается при попадании в эти теги случайных элементов.(когда он дойдет до этого текста в середине координат, разделитель вернет «-86, 32 -86» вместо просто «-86, 32»). Итак, я, по сути, ищу помощь в том, как читать встрана, штат и округ отдельно и как правильно читать в координатах, несмотря на эти случайные теги элементов.

1 Ответ

0 голосов
/ 19 июня 2019

Я только что проверил следующие результаты:

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(); 
            } 
        }
    }
}
...