🗺️

Geolonia 住所データを使って本物っぽい住所を生成する

2022/05/28に公開

動機

日本国内のサンプル住所データを作りたく、faker を使って作ったけど、都道府県と市区町村の組み合わせがおかしくて(福島県横浜市鶴見区って何?)扱いづらいので、もうちょっと本物っぽく作りたい。
faker で作成した際に参考にしたページ。

https://qiita.com/ohbarye/items/452fefa2be5d56268b50

ではどうするか?

Geolonia 住所データ(https://geolonia.github.io/japanese-addresses/)を使って、ランダムに実際に存在する市区町村の住所を生成する。
(ただし、番地以降は存在しないものにする)

https://geolonia.github.io/japanese-addresses/

使用するパッケージのインストール

pip install requests faker

コード

real_jp_address.py
import sys
import random
import requests
from faker import Faker
fake = Faker('ja_JP')


geolonia_api_base = 'https://geolonia.github.io/japanese-addresses/api'
prefectures = requests.get(f'{geolonia_api_base}/ja.json').json()
prefecture_choices = list(prefectures.keys())
address_details = {}
def random_address_jp():
    prefecture = random.choice(prefecture_choices)
    cities = prefectures[prefecture]
    city = cities[random.randrange(0, len(cities) - 1)]

    if prefecture not in address_details or city not in address_details[prefecture]:
        url = f'{geolonia_api_base}/ja/{prefecture}/{city}.json'
        new_entry = requests.get(url).json()
        if prefecture not in address_details:
            address_details[prefecture] = {}

        address_details[prefecture][city] = new_entry

    towns = address_details[prefecture][city]
    town = towns[random.randrange(0, len(towns))]['town']
    koaza = towns[random.randrange(0, len(towns))]['koaza']
    ban = fake.ban()
    gou = fake.gou()

    return f'{prefecture}{city}{town}{koaza}{ban}{gou}'


def main(args):
    for _ in range(30):
        address = random_address_jp()
        print(address)


if __name__ == "__main__":
    main(sys.argv)

特定の都道府県の住所のみ生成したい場合

特定の都道府県や、指定した都道府県(例:関東地方の都道府県のみ)の住所を作成したい場合は、上記のコードの prefecture_choices をうまく設定してあげればできます。

富山県のみ指定してみた(富山県は最も市区町村が少ないらしい; 2022年5月現在)。

prefecture_choices = ['富山県']

関東地方の都道府県のみ指定してみる。

prefecture_choices = [
    '茨城県',
    '埼玉県',
    '千葉県',
    '東京都',
    '神奈川県',
]

Discussion