Python テスト用生データ生成（住所編）

# 背景
[faker-python](https://github.com/joke2k/faker) の `address()` を使って住所生成したら，

```
兵庫県中野区松石4丁目14番7号 クレスト千塚106
```
こんな感じで兵庫県の中に中野区がある、凄まじいフェイク住所が出て来てますが，実際マップを使用したアプリケーションでテストをする際など，これらの情報を検索にかけてもピンポイントで実行結果が出ません．

なので


**1.　フェイクデータではなく実際の住所データを生成する．**
**2.　またダミーデータとして一度の実行にの多くの住所を取得する．**

今回はこの２点を抑えてデータを生成したいと思います．

#どうやって作るか

すぐに思いついたのが，住所情報を提供するAPI経由で，情報を整形して生成する方法．
とりあえずやってみます．

# HeartRails Geo API
今回お世話になるAPIは，[HeartRails Geo API](http://geoapi.heartrails.com/api.html) さんです．
ここの`緯度経度による住所検索 API`を使ってダミー住所を生成していきます．
![zyuusyof.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155592/ebde44e6-9f34-5b32-8601-6680cf804b05.png)

# 住所生成プログラム
```python
import requests
import random
import json

#xml_url = 'httpi://geoapi.heartrails.com/api/xml?method=searchByGeoLocation'
json_url = 'http://geoapi.heartrails.com/api/json?method=searchByGeoLocation'

# APIリクエスト関数
def get_data(lug,lat):
    payload = {'method': 'searchByGeoLocation', 'x': lug, 'y': lat}
    try:
        ret = requests.get(json_url, params=payload)
        json_ret = ret.json()
    except requests.exceptions.RequestException as e:
        print("ErrorContent: ",e)

    return json_ret

# 住所データの整形関数
def serealize_data(data):
    try:
        dic = data['response']['location'][0]
        det = dic['prefecture'] + dic['city'] + dic['town']
        return det
    except KeyError as e:
        print(e)

# 軽度・緯度に使う乱数の生成
def gene_number(lug_fnum, lug_lnum, lat_fnum, lat_lnum):
    lug = round(random.uniform(lug_fnum,lug_lnum),6)
    lat = round(random.uniform(lat_fnum,lat_lnum),6)
    return lug,lat

def main():
    for i in range(10):
        lug,lat = gene_number(123,154,20,46)
        ret = get_data(lug,lat)
        print("経度： " + str(lug) + "," + "緯度： " + str(lat))
        print("%s\n" %serealize_data(ret))

if __name__ == '__main__':
    main()                                                                                                                                                                                                                                                                                                     
```
データフォーマットは今回`json形式`を選びました．理由は特にありません．

・　get_data関数は，データを取ってくる関数．
・　serealize_data関数は，取ってきたデータを整形します．
・　gene_number関数は，日本国内の経度緯度を自動生成して，それをget_data関数に渡します．

#検証
```bash

経度： 149.691295,緯度： 20.525873

'location'
None
経度： 146.369748,緯度： 23.905043

'location'
None
経度： 128.552226,緯度： 28.268003

'location'
None
経度： 138.839354,緯度： 36.14651

群馬県甘楽郡甘楽町秋畑
経度： 128.442362,緯度： 24.173392

'location'
None
経度： 149.328955,緯度： 35.501685

'location'
None
経度： 143.701187,緯度： 31.806533

'location'
None
経度： 152.518577,緯度： 38.932277

'location'
None
経度： 131.0144,緯度： 38.670175

'location'
None
経度： 149.70269,緯度： 36.445081

'location'
None

```

一度のプログラムの実行に10個のデータを生成するように指定しましたが，ほとんどのデータがNoneの表示されています．生成できたのは4番目の`群馬県甘楽郡甘楽町秋畑`のデータのみです．

どういうわけか．．．

あ．．

試しに２番目の座標データを調べてみました．

![zyuusyoo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155592/0174e0a9-4beb-f086-b027-2882f69b9bfb.png)

海ですね．

# 経緯度の設定値を東京都内中心に変える

```python
lug,lat = gene_number(139.51,139.76,35.68,35.87)
```

```bash
経度： 139.699048,緯度： 35.780655
東京都板橋区小豆沢四丁目

経度： 139.739455,緯度： 35.733378
東京都豊島区巣鴨一丁目

経度： 139.542504,緯度： 35.711219
東京都武蔵野市関前五丁目

経度： 139.591343,緯度： 35.718665
東京都杉並区善福寺三丁目

経度： 139.683952,緯度： 35.787578
東京都板橋区坂下三丁目

経度： 139.624341,緯度： 35.795323
埼玉県和光市新倉三丁目

経度： 139.543935,緯度： 35.771779
東京都東久留米市上の原二丁目

経度： 139.517793,緯度： 35.718969
東京都小平市花小金井南町二丁目

経度： 139.674748,緯度： 35.687898
東京都中野区弥生町三丁目

経度： 139.606371,緯度： 35.746559
東京都練馬区石神井町四丁目

```

ヒットしました．


# 結論

どうやら，日本国土の経緯度レンジは大体(経度123-154),(緯度20-46)の範囲あるということで設定してみたら，海が含まれていることを忘れていた．

なので，設定する経緯度は，国土内の経度に的を絞ったほうが良さそうです．
後は，自作の関数や微調整なりでなんとかなりそう．