[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が返すjsonをKMLに変換する関数を書いたのが以下です。
#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で使う場合などには注意が必要です…