simplekmlでCSVからGoogle Map向けのKMLを生成する

simplekmlを使用してグーグルマップでインポートするKMLをファイルを生成する方法


例題

例題として京都市が公開しているオープンデータの公共施設データベースから公衆トイレの場所を地図上にプロットしてみます

Google Earthにインポートしたイメージ

simplekmlの準備

pipsimplekmlをインストールします

% 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のリファレンスページを参照してください

おすすめ