🙌

Python+Geopandasでシェープファイル(shpファイル)を処理した (PolygonとMultiPolygonの分岐)

2022/10/25に公開

背景

以前このような記事を書きました。

https://zenn.dev/takilog/articles/0d355bbb80f79848da8d

国土地理院データのシェープファイル (*.shp) の外周部をPython+Geopandasで読み込む方法を説明しました。この実装を久しぶりに試したら、長野以外の都道府県だとPolygonがMultiPolygonになることが結構あって、ムムムとなったので追加の記事を書くことにしました。

やったこと

基本的にやったことは以前の記事の処理を同じですが、Polygon or MultiPolygonの判定をやります。内陸の都道府県は比較的Polygonになりますが、例えば北海道や東京都など明らかに離島を含むような場所で unary_union を計算しても、もちろん単一のPolygonにはなりません。そのため処理が必要になりました。

悩んだ結果、unary_unionを計算した後に

  • 結果がPolygonになってたらそのまま外周を取得する
  • 結果がMultiPolygonだったら
    • 各構成要素のPolygonに_geoms_からアクセスして、面積の大きい順に並び替える
    • 最大面積のPolygonを対象と仮定して、その外周を取得する

という処理を行います。実装としてはこういう感じの雑なものです。

import geopandas as gpd
from shapely import geometry

# shape file を読み込む
poly = gpd.read_file(path) 

if isinstance(poly, geometry.polygon.Polygon):
    target_poly = poly
elif isinstance(poly, geometry.multipolygon.MultiPolygon):
    area_list = [(p.area, p) for p in poly.geoms]
    area_list = sorted(area_list, key=lambda x: -x[0])
    largest_poly = area_list[0][1]
    target_poly = largest_poly

結果

北海道に適用してみたものです。

Geopandasの可視化 取得した最大面積部分の外周
生のデータ 取得したデータ

無事にだいたいそれっぽいメインな都道府県部分の外周を取得することができました。

真面目なドキュメントについては、このあたりを読んでもらっても良いです。

コード

47都道府県処理するために書いたコードです。

https://github.com/cocomoff/process_GML_by_geopandas

Discussion