PythonでGISデータを可視化するときにはFoliumを使うのが便利です。
FoliumはJavaScriptのleafletをもとにしたPythonエコシステムで、緯度経度などからなるGISファイルを簡単にインタラクティブにOpenStreetMatなどの地図上に可視化できます。
Pythonだとあまり可視化ツールがないように思う人もいるかもしれませんが、GISデータをPythonで可視化となったらFoliumを使うのが絶対におすすめなので、ぜひ機会があれば使ってみて欲しいです。
さて、この回はFoliumを使ってオープンデータのCSVファイルを読み込んで、地図上にヒートマップを作ってみたいと思います。
CSVファイルには緯度・経度のカラムがあるので、それらを使って地図上にプロットしていくという手順になります。
-
データサイエンティストとして3年間で3社経験した僕の転職体験談まとめ
こんにちわ、サトシです。33歳です。 今回は、データサイエンティストの3年間に3社で働いた僕が、データサイエンティストとしての転職活動についてまとめて書きたいと思います。 これまでSE→博士研究員→ポ ...
Foliumのインストール
Foliumはpipやcondaでインストールができます。
1 |
pip install folium |
or
1 |
conda install -c conda-forge folium |
ただし公式WEBサイトによると、依存パッケージで以下のようなパッケージが必要になることがあるので注意しましょう。
"branca, jinja2 and requests"
まぁ、僕の考えでは、Foliumを単体で使うことはほぼなく、GeoPandasでGISデータをいい感じに処理して、その結果を地図上で可視化するんだと思っています。
conda-forgeでGeoPandasをインストールすれば、Foliumもインストールされますので、それで一緒に使えるようになります。
こちらの記事でGeoPandasの環境構築の記事を書きましたので、参考にしてみてください。
オープンデータのダウンロード
試しに今回使うデータは、品川区オープンデータのWEBページから、公共施設のデータを使います。
https://www.city.shinagawa.tokyo.jp/PC/kuseizyoho/kuseizyoho-opendate/index.html
こちらのCSVをダウンロードして、Pythonでデータフレームで読み込むとこのような形式になっています。
1 2 3 |
#品川公共施設データの読み込み df = pd.read_csv("data/kokyoshisetsu.csv", encoding="shift-jis") df |
ジオデータフレームへの変換
データフレームに変換する事ができたので、こちらをそのまま使ってもいいのですが、多めのデータを点でプロットしたい場合は、Choroplethという関数を使いたいので、ジオデータフレームにさらに変換したいと思います。
ジオデータフレームを作る際にはgeometry列が必要になるので、データフレームの緯度・経度列を使って、Pointのgeometryを作ります。
1 2 3 4 |
df = df.loc[:, "施設名":"経度"] geometry = gpd.points_from_xy(df['経度'], df['緯度']) gdf = gpd.GeoDataFrame(df, geometry=geometry) gdf |
はい、このようにしてgeometryにPointを加えたジオデータフレームができました。
1 |
gdf.crs=6668 |
座標系も設定しておきます。
ちなみにcrs=6668は、日本周辺を単位:度で正確に表した座標系です。
この座標系(EPSGコードと呼ばれます)の詳細は割愛します。
FoliumでOpenStreetMap上に点プロット作成
ジオデータフレームができましたので、こちらをOpenStreetMap上に点でプロットします。
この点はデフォルト設定のマーカーとし、地図の中心は品川駅とします。
1 2 3 4 5 |
# 品川駅 緯度経度 lat = 35.6291112 lon = 139.7389313 map = folium.Map(location=[lat, lon], zoom_start=13) |
これで地図ができました。
まだデータがプロットされていないので、こちらにプロットを追加していきます。
プロットにはChoroplethを使います。
1 2 3 4 5 |
#choroplethで可視化 folium.Choropleth( gdf ).add_to(map) map |
これでプロットができました。
たくさんの点がマーカーでプロットされていますね。
でもこれだと点が多いので、よくわからないのが正直なところだと思います。
なので次に点ではなくヒートマップで可視化してみましょう。
-
データサイエンティスト経験3年の僕がフリーランスとして独立するまでの体験談
こんにちわ、サトシです。 今回は、企業でデータサイエンティストとして働いていた僕が、フリーランスとしてどのような手順で独立していったかについて書いていきたいと思います。 僕はSIer SE→博士過程→ ...
FoliumでOpenStreetMap上にヒートマップ作成
Foliumでヒートマップを作るにはfolium.pluginからHeatMapをimportして使います。
まずは地図自体を作ります。
例によって地図の中心は品川駅とします。
1 2 3 4 5 6 7 |
from folium.plugins import HeatMap # 品川駅 緯度経度 lat = 35.6291112 lon = 139.7389313 map = folium.Map(location=[lat, lon], zoom_start=13) |
プロットする地図ができたら、そこにヒートマップを加えます。
ヒートマップを作るには、まず点(緯度, 経度)をデータ数分並べたリストを作成し、HeatMap関数に渡します。
このとき、リストの中の緯度経度は(経度, 緯度)の順番ではなく(緯度, 経度)の順番にしましょう。
1 2 3 4 5 6 7 8 9 |
#foliumでヒートマップを作る場合は、listに(緯度, 経度)の順で入れるので、 #元のデータがgeometryのように経度, 緯度になっていると逆にする必要がある pointlist = [] for index, row in df.iterrows(): pointlist.append((row.緯度, row.経度)) HeatMap(pointlist, radius=20, blur=5).add_to(map) map |
これでヒートマップができました!
radiusやblurなどを変えるとヒートマップの感じも変わりますので、いろいろ試してみてください!
PythonによるGISデータ分析の勉強法
PythonでGISデータの分析手法を学びたい方はUdemyのコースがおすすめです。日本語の書籍は全然ないです。。。
(追記)
2024/9/20にこんなのが出るそうです。読んでみたいですね!