先日、SIGNATEのマイナビコンペが終了しました。

自分のチームではアイデア賞を入賞しましたが、そこで行った処理の一部についてまとめようと思います。(全体の振り返りはまた今度)

コードは最後に書きます

どんな処理をするのかな

1.foliumで地図データのhtmlを生成
2.seleniumでhtmlファイルをクロップし、pngファイルで保存する
するだけです。

ただ、調べてもあまり情報がなかったので書こうかなと思いました。

①foliumで地図データのhtmlを生成

そもそもfoliumを知っている人はどれくらいいるのでしょうか。少なくとも僕は今まで知りませんでした。


https://qiita.com/pork_steak/items/f551fa09794831100faa
ここの記事がわかりやすかったです。

試しにやってみるとこのようになります。(読み込みが終わってないですが)

引数に緯度経度を渡してあげれば勝手にファイルを作ってくれるのでかんたんにできます。

ちなみに白黒や地形図などいろんな種類の地図を出力させることもできます。


②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 = '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
 
 
def make_html(lng, lat):
    # zoom_startは拡大率みたいなもの(大きいほうが拡大される)
    map_data = folium.Map(location=[lng, lat],
                          attr=copyright_osm,
                          zoom_start=18)
    map_data.save("sample.html")
    get_img()
 
 
def get_img():
    options = Options()
    options.add_argument("--headless")
    driver = webdriver.Chrome(options=options)
 
    driver.get("file:///{}/sample.html".format(sys.path[0]))
 
    time.sleep(2)
 
    driver.save_screenshot("sample.png")
 
 
make_html(35.68, 139.78)