[python] KMLを生成するPythonモジュールsimplekml

KMLは、位置情報を表すためのXMLフォーマットで、GoogleMapsやGoogleEarthでも採用されています。AndroidアプリのデモのためにGPSをシミュレートしたいときなどにも使うことができます。
http://ja.wikipedia.org/wiki/KML

このKMLフォーマットを、Pythonから生成することができるsimplekmlモジュールの使い方を紹介します。

ドキュメント

ドキュメントへは以下のURLでアクセスできます。
http://code.google.com/p/simplekml/wiki/Welcome

インストール

pipでインストールすることができます。

sudo pip install simplekml

場所の登録

kmlインスタンスにnewpointメソッドでどんどん場所を追加していくだけです。結果のkmlを取得するには、kml.kml()というメソッドを使います。ファイルに保存したい場合は、kml.save()というメソッドを使うと便利です。

import simplekml

kml = simplekml.Kml()
kml.newpoint(\
    name="武蔵小杉駅",\
    description="神奈川県民だわー",\
    coords=[(139.6594757216514,35.57075039910515)]\
)
kml.newpoint(\
    name="六本木駅",\
    description="死にたい",\
    coords=[(139.72678679072163,35.66917008965268)]\
)
print kml.kml()

実行結果

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:xal="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0">
    <Document id="feat_1">
        <Placemark id="feat_2">
            <name>武蔵小杉駅</name>
            <Point id="geom_0">
                <coordinates>139.659475722,35.5707503991,0.0</coordinates>
            </Point>
            <description>神奈川県民だわー</description>
        </Placemark>
        <Placemark id="feat_3">
            <name>六本木駅</name>
            <Point id="geom_1">
                <coordinates>139.726786791,35.6691700897,0.0</coordinates>
            </Point>
            <description>死にたい</description>
        </Placemark>
    </Document>
</kml>

(応用) mixiチェックインの履歴を、GoogleMapsに表示する

冒頭でも述べましたが、GoogleMapsではKMLフォーマットをサポートしていて、クエリにKMLのURLを与えるとマーカーで表示してくれます。
これを利用して、mixiチェックインAPIが返すjsonKMLに変換する関数を書いたのが以下です。

#coding: utf-8

import simplekml
from datetime import datetime
try:
    import simplejson as json
except ImportError:
    import json

# input:    json string contains mixi checkin history
# output:   converted kml string
def mixicheckinjson2kml(json_string):
    data = json.loads(json_string)
    kml = simplekml.Kml()
    # create a new folder
    folder = kml.newfolder(name="mixi checkin history", description="mixi checkin history")
    for entry in data["entry"]:
        name = entry["spot"]["name"]["formatted"]
        message = entry["message"]
        latitude = entry["location"]["latitude"]
        longitude = entry["location"]["longitude"]
        created_at = convertdateformat(entry["created"])

        # create a new point
        folder.newpoint(\
            name=name,\
            description=message,\
            coords=[(float(longitude), float(latitude))],\
            altitudemode="relativeToGround",\
            visibility=1,\
            extrude=1\
        )
    return kml.kml()
        
# convert iso datetime format to kml date format
def convertdateformat(isoformatdate_string):
    s = isoformatdate_string.split("+")[0]
    d = datetime.strptime(s, "%Y-%m-%dT%H:%M:%S")
    return d.strftime("%a, %d %b %H:%M:%S")


###################
## test
###################
def main():
    import sys
    if len(sys.argv) < 2:
        usage()
    json_filename = sys.argv[1]
    json_string = open(json_filename, "r").read()
    kml_string = mixicheckinjson2kml(json_string)

    # save to .kml file
    f = open("output.kml", "w")
    f.write(kml_string)
    f.close()
    return 0

def usage():
    print "Usage: python mixicheckinjson2kml.py path/to/mixi_checkin_json_file"
    sys.exit(1)

if __name__ == '__main__':
    main()

注意点

simplekmlはPython2.6以降しかサポートしていないようで、2.5ではうまく実行することができませんでした。appengineで使う場合などには注意が必要です…

mixiチェックインの履歴をGoogleMaps上に表示するツール on appengine

http://mixi-api-dev.appspot.com/checkin-mapping