Python
geojson

【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を返すのが正常です。