YU2TA7KA's BLOG ~take one step at a time~

派生開発、組み込み開発周りのこと。

農研機構の簡易逆ジオコーディングサービスを使ってみた

はじめに

アニメ聖地領域を抽出するために、GoodClues_DBのカラムに無い市区町村名の情報が必要でした。そこで、農研機構の簡易逆ジオコーディングサービスを使って市区町村名を取得しました。アニメ聖地領域抽出のステップ1です。

アニメ聖地領域抽出の流れ

  1. GoodClues_DBに登録されている緯度経度から市区町村名を逆ジオコーディング*1
  2. GoodClues_DBよりタイトル一覧を作成*2
  3. GoodClues_DBに対して、タイトルごとに最頻出するアニメ聖地領域(県名、市区町村名)を抽出

ジオコーディングとは

各種情報に対して、関連する地理座標(典型的には緯度・経度)を付加すること。 付加された地理座標のことをジオコードと称する。
ジオコーディング - Wikipedia

逆ジオコーディングとは

地理座標から住所を取得することとします。*3

逆ジオコーディングサービス

逆ジオコーディングサービスを提供している所はいくつかあるのですが、下記記事を参考に農研機構の簡易逆ジオコーディングサービスを利用させていただくことにしました。農研機構さん素敵なサービスをありがとうございます。

緯度経度から住所を取得してリスト化したい【逆ジオコーディング】

無料 逆ジオコーディング 使用制限数が多い 二次利用
国土交通省
農研機構
Yahoo ×
Google × ×

市区町村名の取得ソースコード

#GoodClues_DBより緯度経度を取得し、農研機構サービスにて逆ジオコーディングを行う。
#緯度経度から住所取得に失敗した場合は、失敗したレコードIDを出力する。
import requests
import json
import csv
import codecs

#Open csv file
csv_file = open('seichi.csv','r',encoding = 'utf-8')
f = csv.DictReader(csv_file,delimiter=",",doublequote=True,lineterminator="\r\n", quotechar='"', skipinitialspace=True)
csv_out_file = open('seichi_t.csv','w',encoding = 'utf-8')

for row in f:
    #Reverse geocoding
    lat = row['緯度']
    lon = row['経度']
    url = 'https://www.finds.jp/ws/rgeocode.php?json&lat='+lat+'&lon='+lon
    response = requests.get(url)
    json_resp = json.loads(response.text)
    #print (json_resp['result']['municipality']['mname'])
    #print (json_resp)

    #Write csv file
    try:
        csv_out_file.write(json_resp['result']['municipality']['mname']+"\n")
    except KeyError as err_message:
        print (err_message)
        print (row['ID'])
        csv_out_file.write(row['ID']+"error \n")
        #look at https://www.finds.jp/rgeocode/index.html.ja

csv_file.close()
csv_out_file.close()

プログラミング言語:Python 3.5.3

GoodClues_DBの一部

ID,タイトル,コード,場所,県名,住所,緯度,経度
1,けいおん,241215,豊郷小学校,滋賀,滋賀県犬上郡豊郷町石畑518,35.203373,136.232871
2,けいおん,241215,四条Mojo,京都,京都府京都市下京区四条新町月鉾町39-1四条烏丸大西ビル,35.003973,135.756867

出力結果の一部

犬上郡 豊郷町
京都市 下京区

つまづいたところ

逆ジオコーディングという言葉を知らなかった。

 当初は「google api 住所取得」という単語から検索していました。そうすると、「逆ジオコーディング」という単語が出現せず、有用な情報に全くアクセスできませんでした。そして、Google APIは2次利用禁止されているだけでなく、逆ジオコーディングで取得できる情報も私にとって不十分でした。市区町村名がリターンjsonの決まった要素に入っていない。。(所要時間:1時間)

文字コードの意識が必要

日本語を扱うので、文字コードの意識が常に必要でした。英語圏が羨ましい。(所要時間:XX)

Python 2と3で実装コードが異なる

Pythonに関する情報はWeb上に多いのですが、Python 2と3は完全互換していないため、その記事が2か3のどちらか確認して、適宜利用する必要がありました。csvをエンコーディングして読み込む方法がpython3しかわからなかったです。(所要時間:30分)

おわりに

農研機構の簡易逆ジオコーディングサービスを使って、市区町村名を取得した流れをまとめました。いらんところに時間も使っており、もう少しさっとできれば良かったなぁと思っている次第です。Python完全に理解した。


*1:https://www.finds.jp/rgeocode/index.html.ja

*2:アニメ聖地箇所ごとに登録されている

*3:ジオコーディングの定義からすると建物名や郵便番号などの取得も含まれると思います。