simplekmlでCSVからGoogle Map向けのKMLを生成する
simplekmlを使用してグーグルマップでインポートするKMLをファイルを生成する方法
例題
例題として京都市が公開しているオープンデータの公共施設データベースから公衆トイレの場所を地図上にプロットしてみます
simplekmlの準備
pip
でsimplekml
をインストールします
% pip install simplekml
データベースのダウンロード
データベースはCSVフォーマットで公開されているため(リンク)、ダウンロードしてcsvライブラリで読み込みます
import csv import io from pprint import pprint import requests import sys # ダウンロードするURL csv_url = 'https://data.city.kyoto.lg.jp/file/10514/download?token=oOYK7dEE' res = requests.get(csv_url) #CSVオブジェクトに入力するためにStringIOを作成 csv_f = io.StringIO(res.content.decode('cp932')) csv_r = csv.reader(csv_f) #ヘッダから必要データのインデックスを抽出 header = next(csv_r) try: index_list = ['name', 'cate_id', 'lat', 'lng', 'address', 'tel', 'note', 'optime', 'fee'] item_index = {k: [i for i,j in enumerate(header) if j.find(k) > 0].pop() for k in index_list} except IndexError as e: print(f'[Error] Cannot get index of {index_list}') sys.exit(-1)
KMLファイルの作成と位置情報の設定
simplekml.Kml()
でKMLオブジェクトを作成、save("ファイル名")
でファイルに書き出します。新しいポイントはnewpoint(name=名前, coords=[(経度, 緯度)])
で追加します。
こちらのページによると公衆トイレのカテゴリーIDは137
のようなので、このIDのデータのみ抜き出して追加します
RESTROOM_CATE_ID = 137 # 公衆トイレのカテゴリーID r_kml = simplekml.Kml() # KMLオブジェクトの作成 for db in csv_r: if int(db[item_index['cate_id']]) == RESTROOM_CATE_ID: p = r_kml.newpoint(name=db[item_index["name"]], coords=[(db[item_index["lng"]], db[item_index["lat"]])]) r_kml.save('kyoto_public_restroom.kml') # ファイルに保存
kmzとして保存
savekmz()
により、kmlを圧縮したkmz形式で保存することができます
r_kml.savekmz('kyoto_public_restroom.kmz') # 圧縮形式 (kmz)で保存
属性設定・付加情報追加
上記のp = r_kml.newpoint()
で返されたp
に対して様々な属性を設定することができます。
ドキュメント名
ドキュメント名を省略するとファイル名がタイトルとして使用されます
r_kml.document.name = '京都市公共トイレ' # マップのタイトル
住所設定
p.address = db[item_index['address']]
電話番号
(この例の公衆トイレデータベースには電話番号は設定されていません)
p.phoneNumber = db[item_index['tel']]
説明記述
Google EarthではHTMLが利用できます。 (Google Mapでは使用できません)
p.description = ('<table>' f'<tr><td>ご案内</td><td>{db[item_index["note"]]}</td></tr>' f'<tr><td>利用時間</td><td>{db[item_index["optime"]]}</td></tr>' f'<tr><td>利用料</td><td>{db[item_index["fee"]]}</td></tr>' '</table>')
アイコン
デフォルトのアイコンはGoogle Earthでは黄色いピン、Google Mapでは青いポインタですが、style.iconstyle.icon.href
を設定することによる変更することができます。利用可能なアイコンの一覧についてはこのページが参考になります
p.style.iconstyle.icon.href = 'http://maps.google.com/mapfiles/kml/shapes/toilets.png'
その他
その他の属性についてはGoogleのリファレンスページを参照してください
最近のコメント