foliumを用いた地図表示を即時行う

foliumというモジュールで地図表示が簡単にできるが、一旦htmlファイルに出力してからブラウザ表示する必要があってやや使いづらかった(Jupyterを使えばよいみたいだが)のでtempfileとwebbrowserモジュールを使って即時ブラウザ表示するプログラムを作成してみた。

ソース

import folium
import tempfile
import webbrowser

class fmap(folium.Map):
    def __init__(self, **kw):
        super().__init__(**kw)
        self.listtf = list()

    def show(self):
        tf = tempfile.NamedTemporaryFile(suffix='.html', delete=False)
        map_osm.save(tf)
        webbrowser.open(tf.name)
        self.listtf.append(tf)

    def __del__(self):
        list(map(lambda tf: os.remove(tf.name), self.listtf))

map_osm = fmap(location=[45.5236, -122.675])
map_osm.show()
time.sleep(2)

実行結果


補足説明

そもそもfoliumとは何かというのはこちらのページを見るのが早い。

こちらにもサンプルコードがある。

作成したfmapクラスのshow()を呼ぶとブラウザで表示される。2秒待ちを入れているのは、プログラム終了と同時にデストラクタが呼ばれて、表示される前に作成したhtmlファイルが削除されてしまうことを防ぐため。
map_osm = fmap(location=[45.5236, -122.675])
map_osm.show()
time.sleep(2)

ココがこのプログラムのメインの処理。NamedTemporaryFileでdelete=Falseとしておかないと、ファイルへの書き込み完了&ファイルセーブ後、ブラウザ表示前にファイル削除されてしまう。あとはsaveしたファイルをwebbrowser.openでブラウザ表示している。
    def show(self):
        tf = tempfile.NamedTemporaryFile(suffix='.html', delete=False)
        map_osm.save(tf)
        webbrowser.open(tf.name)
        self.listtf.append(tf)

NamedTemporaryFileでdelete=Falseとしてしまったので、デストラクタでファイル削除している。もう少し良い方法がないものかと思って色々工夫したがこれに落ち着いた。
    def __del__(self):
        list(map(lambda tf: os.remove(tf.name), self.listtf))


コメント

このブログの人気の投稿

Python SQLite スレッド間でコネクションの使いまわしは出来ない

slackでgeneralの投稿を全削除する

Google location history(JSON形式)をCSVファイルにする