行政区画の境界のポリゴン抽出する

Linked Open Addresses Japan が提供する JSON データから境界ポリゴンを抽出する。

階層

階層は下記の通り。

├─prefecture_polygon.py
├─README.md
├─areas
│      東京都.json
│      東京都世田谷区.json
│      東京都中央区.json
│      ...
└─extracted_polygons
       東京都.json
       東京都世田谷区.json
       東京都中央区.json
       東京都中野区.json
       ...

areas

Linked Open Addresses Japan から取得した JSON ファイルを設置する。

extracted_polygons

境界ポリゴンが下記の JSON ファイルで保存される。

[
    {
        "lat": 24.284078400000002,
        "lng": 153.97357438
    },
    {
        "lat": 24.28297405,
        "lng": 153.97858222
    },
    {
        "lat": 24.282955490000003,
        "lng": 153.97858711
    },
    ...
]

prefecture_polygon.py

areas 内のファイルから境界ポリゴンを抽出加工し extracted_polygons に保存する。

import json
import os
import re
target_file_names = os.listdir(path='./areas')
for target_file_name in target_file_names:
    result = []
    json_open = open(f"./areas/{target_file_name}", "r", encoding="utf-8")
    prefecture_dict = json.load(json_open)
    for url in prefecture_dict.values():
        for statuses in url.values():
            for status in statuses:
                if "POLYGON" in status["value"]:
                    polygon = status["value"]
                    coordinates = polygon.split(",") # ['POLYGON((139.81666667000002 35.74978875', '139.81667097 35.74978311'...]
                    for coordinate in coordinates: 
                        coordinate = re.findall("\d+\.\d+", coordinate)
                        latlng = {
                            "lat": float(coordinate[1]),
                            "lng": float(coordinate[0]),
                        }
                        result.append(latlng)
    with open(f"./extracted_polygons/{target_file_name}", "w") as file:
        json.dump(result, file, indent=4)