Posted at

【Python】任意の位置情報がGeoJSONのどの区画に属しているか判定する方法

任意の位置情報がGeoJSONデータ内のどの地域に含まれているのか判定する方法を見つけるのに時間がかかったのでまとめ。

サンプルとして東京都のGeoJSONデータを用意する。日本の行政区画のShapeファイルやGeoJSONデータは以下のサイトから入手出来る。

- http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03-v2_3.html

以下のような環境で実装しています。

python  3.6.5

pip 18.1
Shapely 1.6.4.post2

必要なライブラリは以下

pip install shapely

ソースコードは以下

# coding: UTF-8


import json
import os
from shapely.geometry import shape, Point

SOURCE_PATH = os.path.dirname(os.path.abspath(__file__))
GEO_JSON = SOURCE_PATH + "/tokyo.geojson"

# 任意の位置情報がどの市区町村に属するか判定するメソッド
def belong(geo_json, lat, lon):
point = Point(lon, lat)
for feature in geo_json['features']:
polygon = shape(feature['geometry'])
if polygon.contains(point):
return feature['properties']['N03_004'] # 市区町村名へアクセス
return None

### main
if __name__ == '__main__':

f = open(GEO_JSON,'r')
geo_json = json.load(f)

# 東京駅
lat = 35.681167
lon = 139.767052
city = belong(geo_json, lat, lon)
print(city) # => 千代田区

# 東京スカイツリー
lat = 35.710063
lon = 139.8107
city = belong(geo_json, lat, lon)
print(city) # => 墨田区

# 小笠原村
lat = 27.094366
lon = 142.191918
city = belong(geo_json, lat, lon)
print(city) # => 小笠原村

# 大阪 梅田
lat = 34.699134
lon = 135.495218
city = belong(geo_json, lat, lon)
print(city) # => None

大阪は今回GeoJSONデータに含まれていないのでNoneを返すのが正常です。