緯度経度から付近の地図を画像で保存するtip
先日、SIGNATEのマイナビコンペが終了しました。 自分のチームではアイデア賞を入賞しましたが、そこで行った処理の一部についてまとめようと思います。(全体の振り返りはまた今度) コードは最後に書きます どんな処理をするのかな 1.foliumで地図データのhtmlを生成 2.seleniumでhtmlファイルをクロップし、pngファイルで保存する するだけです。 ただ、調べてもあまり情報がなかったので書こうかなと思いました。 ①foliumで地図データのhtmlを生成 そもそもfoliumを知っている人はどれくらいいるのでしょうか。少なくとも僕は今まで知りませんでした。 https://qiita.com/pork_steak/items/f551fa09794831100faa ここの記事がわかりやすかったです。 試しにやってみるとこのようになります。(読み込みが終わってないですが) 引数に緯度経度を渡してあげれば勝手にファイルを作ってくれるのでかんたんにできます。 ちなみに白黒や地形図などいろんな種類の地図を出力させることもできます。 .resizeimage { width: 75%; } .resizeimage img { width: 100%; } ②seleniumでhtmlファイルをクロップすし、pngファイルで保存する driver.save_screenshot() でできます。引数には保存するパスを指定します。 地図データが意外に重いので2秒くらいは待ったほうがいいと思います(time.sleep(2)) 気を使うとしたら、ファイルのパスですね。 driver.get()では絶対パスが必要です。 sys.pathでワーキングディレクトリを取得するので、それに相対パスにくっつけることで絶対パスにすることができます。 driver.get("file:///{}/sample.html".format(sys.path[0]))</code></pre></div> まとめ あらかんたん。調べてみれば案外かんたんにできるものですね。 マイナビコンペではこれを使って全データの地図を取得しました。 データ数が多く、1回のループに5秒くらいかかったのでjoblibで全コア使用し一晩ぶん回してやっと終わりました。 train, test合わせて20GB超えてしまったので驚きました(Google Driveの100GBプラン入っててよかった) コードをおいておきます import folium from selenium import webdriver from selenium.webdriver.chrome.options import Options import time import sys import chromedriver_binary copyright_osm = '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' def make_html(lng, lat): # zoom_startは拡大率みたいなもの(大きいほうが拡大される) map_data = folium.