Shapefile内に不正なジオメトリが含まれているかを判断するプログラムを作りました。
データ処理や解析を行う場合に不正なジオメトリが含まれると処理がうまくいかない場合があります。
Shapefileのジオメトリを検証する手順を解説します。
プログラムの概要
今回紹介するプログラムは、Shapefile内のポリゴンジオメトリが正当かどうかを検証し、不正なポリゴンの数と正しいポリゴンの数をカウントするものです。
これには、osgeoのIsValidメソッドを利用します。
コードの実装
import argparse
from osgeo import ogr
# コマンドライン引数の解析を行う
parser = argparse.ArgumentParser(description='Shapefileを解析して、正しいポリゴンと不正なポリゴンの数を数えます。')
parser.add_argument('filepath', type=str, help='解析するShapefileのパスを指定します。')
args = parser.parse_args()
# Shapefileを開く
shapefile = ogr.Open(args.filepath)
layer = shapefile.GetLayer()
# 正しいポリゴンと不正なポリゴンの数を数えるための変数
invalid_count = 0
valid_count = 0
# 各フィーチャーをチェックして、ポリゴンが有効か無効かを確認する
for feature in layer:
geom = feature.GetGeometryRef()
if not geom.IsValid():
invalid_count += 1 # 不正なポリゴンが見つかった場合のカウント
else:
valid_count += 1 # 正しいポリゴンが見つかった場合のカウント
# 結果を表示する
print(f"不正なポリゴン数: {invalid_count}")
print(f"正しいポリゴン数: {valid_count}")
# Shapefileを閉じる
shapefile = None
実行コマンド
python check.py input.shp
実行結果は下記の通りです。不正なポリゴン数と正しいポリゴン数が表示されます。
Warning 1: Ring Self-intersection at or near point 144174.9188000006 -17498.815199998593
Warning 1: Ring Self-intersection at or near point 144746.40630000021 -14205.870200001678
Warning 1: Ring Self-intersection at or near point 144592.58889999884 -13202.194299999781
・・・・
不正なポリゴン数: 89
正しいポリゴン数: 520
まとめ
チェックにより、ジオメトリが地理情報システム(GIS)などで使用される際に問題が発生しないかどうかを確認することができます。不正なジオメトリは、ジオメトリ処理の際にエラーを引き起こす可能性があるため、データの整合性を保つために重要なチェックなので参考になれば。