LoginSignup
8
10

More than 5 years have passed since last update.

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

Posted at

任意の位置情報が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を返すのが正常です。

8
10
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
8
10