Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Inspect and Parse KML with pyKML

Tags:

python

kml

pykml

similar to this: Extract Coordinates from KML BatchGeo File with Python

But I want to know how to inspect the data object, as well as how to iterate it, and parse all the Placemark to get the coordinates.

The below is the how the KML looks like, and there are multiple <Placemark> tags.

Sample KML data:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.opengis.net/kml/2.2 http://schemas.opengis.net/kml/2.2.0/ogckml22.xsd http://www.google.com/kml/ext/2.2 http://code.google.com/apis/kml/schema/kml22gx.xsd">
<Document id="...">
  <name>...</name>
  <Snippet></Snippet>
  <Folder id="...">
    <name>...</name>
    <Snippet></Snippet>
    <Placemark id="...">
      <name>....</name>
      <Snippet></Snippet>
      <description>...</description>
      <styleUrl>....</styleUrl>
      <Point>
        <altitudeMode>...</altitudeMode>
        <coordinates> 103.xxx,1.xxx,0</coordinates>
      </Point>
    </Placemark>
    <Placemark id="...">
      ...
    </Placemark>
  </Folder>
  <Style id="...">
    <IconStyle>
      <Icon><href>...</href></Icon>
      <scale>0.250000</scale>
    </IconStyle>
    <LabelStyle>
      <color>00000000</color>
      <scale>0.000000</scale>
    </LabelStyle>
    <PolyStyle>
      <color>ff000000</color>
      <outline>0</outline>
    </PolyStyle>
  </Style>
</Document>
</kml>

This is what I have, extract.py:

from pykml import parser
from os import path

kml_file = path.join('list.kml')

with open(kml_file) as f:
  doc = parser.parse(f).getroot()

print doc.Document.Folder.Placemark.Point.coordinates

This prints the first coordinates.

General python question:
How can I inspect doc, find out about its type, and print out the values it contains?

Task question: How do I iterate through all the Placemark and get its coordinates?

Have tried the following but nothing is printed.

for e in doc.Document.Folder.iter('Placemark'):
   print e
like image 351
resting Avatar asked Apr 04 '17 05:04

resting


1 Answers

I've found the answers.

To parse Placemark, this is the code

for e in doc.Document.Folder.Placemark:
  coor = e.Point.coordinates.text.split(',')

To find the object type, use type(object).

Not sure why findall() and iter() didn't work though:

doc.Document.Folder.findall('Placemark')

for e in doc.Document.Folder.iter('Placemark'):

Both returned empty.

Update: Was missing the namespace for findall to work.

doc.findall('.//{http://www.opengis.net/kml/2.2}Placemark')
like image 195
resting Avatar answered Oct 02 '22 19:10

resting