[[simplekml]]

simplekml

KMLについて

Google EarthはGoogle Mapsのアプリ版みたいなもので、地図上にマーカーを置いたりラインを引いたりできる。どこに何を描画するかは、KMLという書式で指定する。

Google Earthは無償で利用できる上、数千件のデータを配置しても描画が高速。かなりの倍率までズームできるため、全体の概観から詳細の確認までできて便利。

simplekmlについて

simplekmlは、Pythonで簡単なKMLを作成するパッケージ。

とりあえず点や線を描いたりスタイルを変えるのは、これを使えば簡単にできる。

それ以上のことは、そもそもKMLでどこまでのことが出来るのか自体をイマイチ知らないんだけど、ドキュメントを見る限りいろんなことが出来る模様。

とりあえず

simplekmlを使って、List内の緯度経度座標をプロットするクラスを作ってみた。

  • 何を描画するの
    • 連続した緯度経度データ
  • どういう風に描画するの
    • 個々の点をマーカーで描画
    • さらにそれらを順番に繋いだ線を描画
    • 各マーカーの横に簡単な説明を添えることも可
  • 使い方
    • コードの最後に

import simplekml


class PlotKml:
    # スタイルは適当に、simplekmlやKMLのドキュメントを見つつ好みに変更する
    # マーカーのスタイル1
    STYLE_I = simplekml.Style()
    STYLE_I.iconstyle.icon.href = 'http://maps.google.com/mapfiles/kml/shapes/placemark_circle_highlight.png'
    STYLE_I.labelstyle.scale = 0.66
    STYLE_I.labelstyle.color = 'aaffffff'
    # マーカーのスタイル2
    STYLE_H = simplekml.Style()
    STYLE_H.iconstyle.icon.href = 'http://maps.google.com/mapfiles/kml/shapes/placemark_circle.png'
    STYLE_H.labelstyle.scale = 0.66
    STYLE_H.labelstyle.color = 'aaffffff'
    # ラインのスタイル
    STYLE_LS = simplekml.Style()
    STYLE_LS.linestyle.width = 3


    def __init__(self):
        self.kml = simplekml.Kml()

    def new(self):
        self.kml = simplekml.Kml()

    def draw_dots(self, lnglats, descriptions, style=None, linestring=True):
        """
        :param lnglats: [[lng, lat], [lng, lat], [], ...]
        :param descriptions: <name>属性に出力するタグ
        :param style: simplekml.Style のインスタンスまたはそのリスト
        :param linestring: 線が不要ならFalse
        """
        # descriptionsは、lnglatsと同じ要素数の文字列のリストで与える。
        #   対応する順番の文字列が、自動的に連番prefixを付与され、マーカーの横に添えられる
        # styleは、Noneなら全てデフォルト
        #   simplekml.Styleの(単独の)インスタンスの場合は全てそのスタイルに
        #   リストの場合はlnglatsと同じ要素数にする。対応する順番のマーカーがそのスタイルになる

        if descriptions is None:
            descriptions = [''] * len(lnglats)
        else:
            assert len(lnglats) == len(descriptions)

        if style is None:
            style = [self.STYLE_I] * len(lnglats)
        elif type(style) == simplekml.Style:
            style = [style] * len(lnglats)
        elif type(style) == list:
            assert len(lnglats) == len(style)

        for idx, (lnglat, description) in enumerate(zip(lnglats, descriptions)):
            pnt = self.kml.newpoint(name=str(idx) + ' ' + description, coords=[lnglat])
            pnt.style = style[idx]

        if linestring:
            ls = self.kml.newlinestring(name='LineString', coords=lnglats)
            ls.style = self.STYLE_LS

    def save(self, path):
        self.kml.save(path)

# --使い方--
pk = PlotKml()
pk.draw_dots([[135.26, 34.32], [135.23, 34.29], ...],  # lnglats
             ['2018/01/21', '2018/01/22', ...])        # descriptions
pk.save('out.kml')

pk.new()  # リセット(これをしないと前のが残る。敢えて残すことも可)
pk.draw_dots([[-112.35, 42.89], ...], style=PlotKml.STYLE_H)
pk.save('out2.kml')

programming/python/packages/simplekml.txt · 最終更新: 2018/09/08 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0