LoginSignup
31
49

More than 3 years have passed since last update.

Pythonで内外判定:任意地点の緯度経度情報から市町村名を取得

Last updated at Posted at 2020-09-05

やりたいこと

任意の地点の緯度経度情報のみから、当地点の市町村名を取得するプログラムを作りました。ポイントは、シェープファイルの読み込み、点の内外判定の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

31
49
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
49