2016-07-26 4 views
0

Я немного оглянулся и не могу найти решение моей проблемы. Моя основная проблема заключается в том, что мне нужно найти имя всех элементов KML, дочерние многоугольники которых содержат точки с заданным значением lat/lon.Как получить атрибуты kml/xml после фильтрации в python (lxml)?

Оглядываясь, я обнаружил, что с помощью keytree, shapely и lxml я могу отфильтровать все элементы KML до рассматриваемых полигонов, а затем получить доступ к их родителям. Однако, когда я пытаюсь получить доступ к атрибутам родителя, я продолжаю получать пустой список. Я попробовал следующее:

def __init__(self): 
    root=etree.fromstring(open("Example.kml", "r").read()) 
    kmlns = root.tag.split("}")[0][1:] 
    polygons=root.findall(".//{%s}Polygon"%kmlns) 
    p = Point(-128.1605,52.474) #this point exists in one of the polygons 
    hits = filter(
     lambda e: shape(keytree.geometry(e)).contains(p), 
     polygons) 

    print hits 
    hit_parent=hits[0].getparent() 
    print hit_parent.attrib#this prints {} 

Я был в состоянии найти строку, в которой полигон с помощью отладчика в PyCharm; в соответствии с этим, у хитов [0] был атрибут sourceline, и когда я пошел к этому номеру строки в моем документе KML, многоугольник действительно содержал точку. Прокрутив до родителя многоугольника, я обнаружил, что у него есть атрибуты (т. Е. Не пустой список). Я новичок в анализе xml и kml; я ищу не в том месте? Вот многоугольник и его родитель из KML:

<Placemark> 
      <name>THIS IS THE NAME</name> 
      <visibility>0</visibility> 
      <styleUrl>#falseColor184010</styleUrl> 
      <ExtendedData> 
       <SchemaData schemaUrl="#S_AL_TA_BC_2_41_eng_SSSSISSSSSSSSSSSSSSSSSSSSS10"> 
        <SimpleData name="ACQTECH">Computed</SimpleData> 
        <SimpleData name="METACOVER">Partial</SimpleData> 
        <SimpleData name="CREDATE">20030416</SimpleData> 
        <SimpleData name="REVDATE">20130504</SimpleData> 
        <SimpleData name="ACCURACY">-1</SimpleData> 
        <SimpleData name="PROVIDER">Federal</SimpleData> 
        <SimpleData name="DATASETNAM">BC</SimpleData> 
        <SimpleData name="SPECVERS">1.1</SimpleData> 
        <SimpleData name="NID">7103157bba3511d892e2080020a0f4c9</SimpleData> 
        <SimpleData name="ALCODE">07876</SimpleData> 
        <SimpleData name="LANGUAGE1">English</SimpleData> 
        <SimpleData name="NAME1">NEEKAS 4</SimpleData> 
        <SimpleData name="LANGUAGE2">French</SimpleData> 
        <SimpleData name="NAME2">NEEKAS NO 4</SimpleData> 
        <SimpleData name="LANGUAGE3">No Language</SimpleData> 
        <SimpleData name="NAME3">NULL</SimpleData> 
        <SimpleData name="LANGUAGE4">No Language</SimpleData> 
        <SimpleData name="NAME4">NULL</SimpleData> 
        <SimpleData name="LANGUAGE5">No Language</SimpleData> 
        <SimpleData name="NAME5">NULL</SimpleData> 
        <SimpleData name="JUR1">BC</SimpleData> 
        <SimpleData name="JUR2"></SimpleData> 
        <SimpleData name="JUR3"></SimpleData> 
        <SimpleData name="JUR4"></SimpleData> 
        <SimpleData name="ALTYPE">Indian Reserve</SimpleData> 
        <SimpleData name="WEBREF">http://clss.nrcan.gc.ca/map-carte/mapbrowser-navigateurcartographique-eng.php?cancode=07876</SimpleData> 
       </SchemaData> 
      </ExtendedData> 
      <Polygon> 
       <outerBoundaryIs> 
        <LinearRing> 
         <coordinates> 
          -128.1615722,52.47385589999999,0 -128.1618475,52.47338730000003,0 -128.1623126999999,52.47275560000004,0 -128.1622705,52.47253640000001,0 -128.162017,52.47243320000002,0 -128.1619326,52.4722527,0 -128.1618904,52.4721108,0 -128.161827,52.47202060000003,0 -128.1615523,52.47204629999998,0 -128.1613199,52.47211069999996,0 -128.1607705,52.47205899999999,0 -128.1604538,52.47172369999999,0 -128.1600750999999,52.47149440000001,0 -128.1600821,52.47510580000001,0 -128.1615621,52.47510469999996,0 -128.1615294999999,52.474926,0 -128.1615508,52.47452629999999,0 -128.1615298,52.47416529999997,0 -128.1615722,52.47385589999999,0 
         </coordinates> 
        </LinearRing> 
       </outerBoundaryIs> 
      </Polygon> 

Я хочу, чтобы получить «это имя» от родителя полигона.

ответ

1

Ваш целевой текст не является атрибутом какого-либо элемента. Учитывая <Polygon> как элемент контекста, вы хотите перейти к родительскому элементу <Placemark>, а затем получить его дочерний элемент <name>. Это можно сделать в одной строке с использованием XPath:

.... 
print hits 
hit_parent = hits[0].find("./../{%s}name"%kmlns) 
print hit_parent.text 
+0

Отлично работает! –

 Смежные вопросы

  • Нет связанных вопросов^_^