🗾

GeoJSON上の複数区域のgeometryデータを一つにまとめる

2023/02/03に公開

こんにちは、株式会社スペースマーケットのMiotavaです。

最近地理情報を扱うフォーマットであるGeoJSONに触れる機会があったのですが、CSVなどに比べて知識も経験も少なくどう処理しようかと迷っていたところ、PythonライブラリのGeoPandasが便利だったので紹介したいと思います。

今回やりたいこと

  • GeoJSON形式のデータをより慣れ親しんだDataFrame形式で扱いたい
  • 細かい単位で格納されている市区町村データの区域情報(POLYGONなどのgeometryデータ)を親地区単位でまとめたい
    • 例えば、以下の市区町村の地理データ(POLYGON形式データ)を親市区町村の地理データとしてまとめたい、と言ったケースをここでは考えます。

before

「富山県中新川郡」を親市区町村とする「舟橋村」「上市町」「立山町」のPOLYGONデータが格納されているが、「富山県中新川郡」自体のPOLYGONデータは格納されていない。

after

「舟橋村」「上市町」「立山町」のPOLYGONデータから、親市区町村である「富山県中新川郡」のPOLYGONデータが生成されている。

やってみた

0. 準備

今回はサンプルとして、下記で公開されているGeoJSONデータのうち、富山県の市区町村データを使ってみます。

また、PythonライブラリのGeoPandasを利用するのでインストールしておきます。

pip install geopandas

これは地理情報をDataFrame形式で扱うのに便利なライブラリとなります。

1. GeoJSONデータの読み込み

まずは、ファイルを読み込みます。
GeoPandasを利用すればGeoJSONファイルをDataFrame形式(より正確にはGeoDataFrame)で簡単に読み込めます。

import geopandas as gpd

DATA_FILE_NAME = "N03-21_16_210101.json"
gdf = gpd.read_file(DATA_FILE_NAME)

データとしては以下のようなデータが入っています。

わかりやすさのために、カラムをリネームします。

renamed_gdf = gdf.rename(
    columns={
        "N03_001": "prefecture",
        "N03_002": "bureau",
        "N03_003": "parent_city",
        "N03_004": "child_city",
        "N03_007": "city_id"
    }
)
renamed_gdf.head()

2. 統合対象のレコードを抽出

その中で 親市区町村が格納されているカラム parent_city にデータが入っているレコードを抽出してみます。

has_parent_gdf = renamed_gdf.dropna(subset=["parent_city"])
has_parent_gdf

3. 統合

ここでやりたいことは、上記データの都道府県(prefecture)と親市区町村(parent_city)をキーにgeometryデータを統合したレコードを作ることです。

ではどうするかというと、GeoPandas.dissolveメソッドを使えば一発でできます。

grouped_gdf = renamed_gdf.dissolve(by=["prefecture", "parent_city"], as_index=False)

まとめた結果、不要となったカラムを削ったりカラム名を変更(parent_city → city)します。

parent_city_gdf = grouped_gdf[["parent_city", "prefecture", "geometry"]].rename(
    columns={"parent_city": "city"}
)
parent_city_gdf

本当に統合されたgeometryデータとなっているのか?

GeoDataFrame.plotを利用して描画する

GeoDataFrameではgeometryカラムのデータを使って簡単にplotメソッドで領域情報を描画できます。便利!

統合前

has_parent_gdf[has_parent_gdf["parent_city"] == "中新川郡"].plot(color=['#FF9800', '#C62828', '#283593'])

統合後

parent_city_gdf[parent_city_gdf["city"]=="中新川郡"].plot()

参考:専用サイトでも綺麗に可視化できます

POLYGONデータを可視化してくれるサイト(https://kepler.gl/demo )で、「富山県中新川郡」のPOLYGONが統合されているかを確認してみると・・・

統合前

統合後

最後に

スペースマーケットでは一緒にサービスをより良くしていくメンバーを募集中です。
ご興味ありましたらぜひご覧ください。

https://spacemarket.co.jp/recruit/engineer/
https://www.wantedly.com/projects/1113570
https://www.wantedly.com/projects/1113544
https://www.wantedly.com/projects/1061116

スペースマーケット Engineer Blog

Discussion