Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

国土地理院APIで住所から緯度・経度を取得(ジオコーディング)

今回は住所から緯度・経度を取得する方法をまとめていきたいと思います。
f:id:Elsammit:20210711122900p:plain



Google Maps APIの有料化

すでに皆さんご存じの通り、Google Maps APIが有料化しました。。
有料化といっても、無料枠も用意されておりAPIコール数が数千程度であれば無料の範囲で利用できます。
また、使用制限を掛けることも出来るみたいなので無料枠の範囲で使い続けることも出来るようです。

だだ、、、
制限が入ってしまったり、無料枠で使っていきたい人には不便になってしまいました泣。

ということで他に方法がないか調べてみたところ、
国土地理院にて無料でAPIが提供されていることを発見!!
こちらを使わせていただくことにしました!!
APIですが、東京大学CSIS シンプルジオコーディング実験サービス及び地名データを格納したデータベースで検索した結果を配信しているようです。

API仕様のチェック

API仕様のついてまとめていきます。

まずAPIのURLですがこちらの通りです。

http://[server]/address-search/AddressSearch?q=https://msearch.gsi.go.jp/address-search/AddressSearch?q=[検索文字列]

こちらの検索文字列ですが、住所をURLエンコードした文字列である必要があります。
例えば札幌駅の住所である、
北海道札幌市北区北6条西4丁目
を検索したい場合、
一度、北海道札幌市北区北6条西4丁目をURLエンコードし、

北海道札幌市北区北6条西4丁目
↓ URLエンコード
%E5%8C%97%E6%B5%B7%E9%81%93%E6%9C%AD%E5%B9%8C%E5%B8%82%E5%8C%97%E5%8C%BA%E5%8C%97%EF%BC%96%E6%9D%A1%E8%A5%BF%EF%BC%94%E4%B8%81%E7%9B%AE

こちらをAPIのURLに与えます。

http://[server]/address-search/AddressSearch?q=%E5%8C%97%E6%B5%B7%E9%81%93%E6%9C%AD%E5%B9%8C%E5%B8%82%E5%8C%97%E5%8C%BA%E5%8C%97%EF%BC%96%E6%9D%A1%E8%A5%BF%EF%BC%94%E4%B8%81%E7%9B%AE

次にresponseですが、json形式でデータ出力され、
構成は、

[{'geometry': {'coordinates': [141.349243, 43.068455], 'type': 'Point'}, 'type': 'Feature', 'properties': {'addressCode': '', 'title': '北海道札幌市北区北六条西四丁目'}}]

といった形になります。
今回緯度、経度を取得したいので、
geometry配下のcoordinates、

[141.349243, 43.068455]

をGet出来ればよいです。

今回の住所の場合にはjsonが1つでしたが、場合によっては、複数返ってくるようです。
その場合にはjson形式のデータが配列で格納されます。

■環境

今回使用する言語はpythonとしました。
pythonのバージョンは、Python 3.7.3です。

さらにライブラリとして、
urllib、requestsを用います。
まだインストールされていない場合には下記でインストールを実行してください。

pip3 install urllib3
pip3 install requests

国土地理院APIで住所から緯度・経度を取得

ではpythonで先ほどのAPIをコールして緯度・経度を取得します。
まずはコードですが、こちらになります。

Address = "北海道札幌市北区北6条西4丁目"
makeUrl = "https://msearch.gsi.go.jp/address-search/AddressSearch?q="
s_quote = urllib.parse.quote(Address)
response = response = requests.get(makeUrl + s_quote)
print(response.json()[0]["geometry"]["coordinates"])

実施していることですが、
Addressに格納された住所を

s_quote = urllib.parse.quote(Address)

によりURLエンコードし、エンコード結果をAPIのURLと結合してget requestを実行。

makeUrl = "https://msearch.gsi.go.jp/address-search/AddressSearch?q="
response = requests.get(makeUrl + s_quote)

requestした結果のresponseですが、先ほど記載しました通りjson形式となります。
また、緯度・経度はjsonはgeometry⇒coordinatesの配下になるため、

response.json()[0]["geometry"]["coordinates"]

で取得可能です。
先ほどご説明しました通り配列でjson形式のデータが格納されているので、
先頭データとしてresponse.json()[0]としております。

最後に緯度・経度を別々に分離する方法です。
response.json()[0]["geometry"]["coordinates"]により得られる結果は、

[141.349243, 43.068455]

といったように配列で得られるため、
緯度:response.json()[0]["geometry"]["coordinates"][0]
経度:response.json()[0]["geometry"]["coordinates"][1]
で分離した形でデータを取得できます。

■コード紹介

こちらにcsvファイルにまとめた住所データから緯度・経度を算出するコードを格納しました。
よろしければご覧ください。
GitHub - Elsammit/SearchAddressToMapInfo

※細かい解説は後でまとめたいと思います!!

■最後に

今回は国土地理院APIで住所から緯度・経度を取得するコードをまとめました。
無料枠でしか使わないのであればGoogle Maps APIを用いてもいいかとおもいますが、
API Keyが必要になったり、少し手間になりますので個人的にはこちらの方がおすすめかな?と思っております。
もしGoogle Maps APIを用いたい場合にはこちらをご参考いただくとよいかもしれません。
qiita.com