PythonでShapeファイルを読む―GeoPandas, Folium

プログラミング
Sponsored

概要

地理空間情報を記録したShapeファイル.shpを開くためには、通常ArcGISやQGISなどの専用ソフトウェアが必要となる。

ここでは、それらのソフトウェアを使わずに、Shapeファイルの内容を確認する方法について説明する。

また、ファイルの情報を地図上に表示する方法についても解説する。

Shapeファイルを開く

必要なモジュール

  • geopandas

geopandasは地理空間情報を扱う上で非常に便利だが、インストールにやや手間取ることが多い。

インストール手順については以下の記事を参照のこと。

GeoPandasのインストールに失敗した場合の対処法(Fiona/GDALのエラー + Rtreeのインストール)
この記事は Pythonの環境によっては、pipを用いたGeoPandasのインストールに失敗するみたいです。 私は失敗しました。 というわけで、解決策を記録しておきます。 (この記事では、GeoPandasのインストール中にFiona関連...

使用するデータ

例として、ここでは「国土地理院|国土数値情報ダウンロード」にある「都道府県地価調査データ」を用いる。

国土数値情報 | 都道府県地価調査データ

上記サイトから「富山県・令和1年」のデータをダウンロードして展開すると、以下の構成のファイルが得られる。

L02-19_16_GML
├ L02_19_16.dbf
├ L02_19_16.prj
├ L02_19_16.shp
├ L02_19_16.shx
├ L02_19_16.geojson
└ L02_19_16.xml

L02_19_16.shpファイルには、L02_006のカラムに地価の情報が格納されている。

コード

上記L02-19_16_GMLフォルダをカレントディレクトリとして、以下のコードを実行するとL02_19_16.shpの内容を表示できる。

(ここでは、Jupyter Notebookを使用して表示した)

import geopandas as gpd

price = gpd.read_file("L02_19_16.shp")
price

データを地図上にプロット

必要なモジュール

地図を表示するために

  • folium

を使用する。また、各種計算や調整を行うために、ここでは

  • numpy
  • matplotlib

を用いる。

これらのモジュールはすべて、pip installからインストールできる。

コード

# マップの中心を決める(手打ちで丁度よい緯度経度を探しても良い)
y_mass, x_mass = np.array([[geo.y, geo.x] for geo in price["geometry"]]).mean(axis=0)

# マップの作成
map1 = folium.Map(location=[y_mass, x_mass], zoom_start=10)
# カラーマップと対応する数値の範囲を設定する
norm = cl.Normalize(vmin=np.log(price["L02_006"]).min(), vmax=np.log(price["L02_006"]).max())
# カラーマップとして viridis (青→黄)を使用
convert = plt.get_cmap('viridis')
# map1 の上に点を打っていく
for geo, pri in zip(price["geometry"], np.log(price["L02_006"])):
    folium.Circle(location=(geo.y, geo.x),
        radius = 100,
        color = cl.to_hex(convert(norm(pri))),
        fill = True 
    ).add_to(map1)
# map1 を表示
map1

地価の数値は対数を取り、分散が大きくなりすぎないようにしている。

また、地図上に丸マーカーを表示するfolium.Circle()colorを指定する際には、その値を16進数で渡さなければならない。

そこでcl.to_hex(convert(norm(pri)))では

  1. norm()priの値を「最小値~最大値」の範囲にノーマライズする
  2. convert()でカラーマップに対応する数値に変換する
  3. cl.to_hex()で値を16進数に変換する

の一連の作業を行っている。

Comments