#やりたいこと
任意の地点の緯度経度情報のみから、当地点の市町村名を取得するプログラムを作りました。ポイントは、シェープファイルの読み込み、点の内外判定の2点です。
#用意するもの
pyshpとSympyという2種類のモジュールを使用しました(pipでインストール)。
・pyshp (shpファイル読み込みに使用)
・Sympy (内外判定に使用)
・市町村区界のシェープファイル
(参考:https://www.esrij.com/products/japan-shp/)
#プログラムの作成と実行
ソースコードは以下の通りです。
import shapefile
from sympy.geometry import Point, Polygon
#
LONG=140.0
LAT=36.5
RPOINT=Point(LONG,LAT) #➀判定対象地点設定
#
src=shapefile.Reader('.\\shp\\japan_ver821.shp',encoding='SHIFT-JIS') #ファイル読み込み
SRS=src.shapeRecords() #➁shpデータ読み込み
for srs in SRS:
shp=srs.shape #➁地物情報取得
rec=srs.record #➁属性情報取得
box=shp.bbox #➁各オブジェクトを囲む矩形の取得
#
#➂対象地点が矩形内にあるなら、より詳細な内外判定を実施
if box[0]<LONG<box[2] and box[1]<LAT<box[3]:
pnt=shp.points #➃各オブジェクトの座標情報取得
points=[] #➃各オブジェクトの節点を抽出
for pp in pnt:
points.append((pp[0],pp[1]))
poly=Polygon(*points) #➃sympyポリゴンデータを作成
#
if poly.encloses_point(RPOINT): #➃内外判定を実施
print(rec) #➄市町村情報を出力
break
以下の処理を順番に実施しています。
① 判定対象地点設定
② shpデータ読み込み
③ 各オブジェクトの矩形範囲内に判定対象地点があるかをチェック
④ ③範囲内に対象地点があればさらに詳細に内外判定を実施
⑤ 内外判定に成功したら属性情報を出力
######実行結果
Record #469: ['栃木県', '', '', '', '宇都宮市']
市町村名を取得することができました。
※注意点※
2つ以上の閉曲線から成るドーナツ型のポリゴンがshpデータに含まれている場合、この方法ではうまくいかないようです。このような場合には、以下を参考にして頂けると幸いです。
https://qiita.com/Pooh-A/items/6b4fcb15a790f6ee6e79