Inspect and Parse KML with pyKML

resting picture resting · Apr 4, 2017 · Viewed 7.1k times · Source

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

Answer

resting picture resting · Apr 4, 2017

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')