実行環境
Windows10
Python 3.9.5
geopandas 0.10.2
shapely 1.8.0
はじめに
GIS ソフトなどで行政界を破線で表示したいのに実線になってしまうことが多々あります。
上の図は、e-Stat 政府統計の総合窓口 からダウンロードした国勢調査統計の小地域データを破線で表示したものです。
シェープファイル形式の東京都千代田区のポリゴンデータを ArcGIS Pro で表示しています。
見てわかる通り、破線間隔が場所によってバラバラで美しくありません。
この現象は、隣接するポリゴン境界上に2本の破線が重なっているため発生します。
なお、隣接するポリゴンのない境界の破線間隔は均一になっています。
対策
ArcGIS Pro のテクニカルサポートに記事が載っていました。
「ポリゴン境界シンボルを同期する」方法と「ポリゴン フィーチャをライン フィーチャに変換する」方法が載っています。
ただし上記の方法を行う場合、ArcGIS Pro の3つのライセンスのうち最高ランクの Advanced ライセンスが必要になり敷居が高いです。
そこで本記事では、GIS ソフトのツールを使わずに破線間隔を均一に表示する方法について書きたいと思います。
処理としては、ポリゴンから「重なりのないライン」への変換になります。
※実際は ArcGIS Pro の Basic ライセンスでも、「同じ2つのポリゴンデータを入力としてラインタイプでインターセクト」すると、破線間隔を均一に表示できるようです。(ただし、重なるラインの数は倍になります)
コード
使用する python ライブラリは geopandas と shapely です。
先述の千代田区のポリゴンを入力ファイルとしています。
"""
geopandas 0.10.2
shapely 1.8.0
"""
import geopandas as gpd
from shapely.ops import linemerge
shp_poly = r'r2ka13101.shp'
shp_line = r'r2ka13101_line.shp'
# ポリゴン読み込み
gs_poly = gpd.GeoSeries.from_file(shp_poly)
# ラインに変換
gs_line = gs_poly.boundary
# ジオデータフレームに格納
gdf = gpd.GeoDataFrame({'geometry': gs_line})
# クリーニング(ディゾルブしてからシングルパートに分解)
gdf = gdf.dissolve().explode(index_parts=True)
# 共有線をマージ(頂点の並びをそろえるためにノーマライズ)
lines = linemerge([line.normalize().coords for line in gdf['geometry']])
# シェープファイルに出力
gpd.GeoSeries(lines).to_file(shp_line)
確認
変換前後のデータを破線表示しています。
変換後の破線間隔が均一になっていることが確認できました。
最後に
GIS ソフトで破線間隔を均一に表示するために、ポリゴンを「重なりのないライン」に変換する方法について書きました。
行政界は破線や一点鎖線で表現されることが多いので、実線にならないように注意したいところです。