とある科学の備忘録

とある科学の備忘録

CやPythonのプログラミング、Arduino等を使った電子工作をメインに書いています。また、木製CNCやドローンの自作製作記も更新中です。たまに機械学習とかもやってます。

【Python】無料でジオコーディング(住所→緯度経度etc.)

住所⇔緯度&経度の変換をしたい、目的地までのルート検索や所要時間を調べたい、と思い良いものがないかなぁと思っていました。
すると、↓の記事でGoogle Maps APIというものがあることを知り、
qiita.com

使ってみよ~~、と思ったのですが、なんと有料でした!


一学生として有料は厳しい、、、、。で調べていくと、OSM(Open Street Map)が提供しているデータを使えばジオコーディングが無料でできるらしい。おお~~(≧▽≦)


geopyというものを使うと、住所→緯度&軽度の取得ができます

  • Python 3.7.3 on win32
  • geographiclib-1.50 geopy-2.0.0
$ pip install geopy

でgeopyを入れます。

プログラム

# -*- coding: utf-8 -*-
from geopy.geocoders import Nominatim

def main():
  geolocator = Nominatim(user_agent="test-dayo")
  location = geolocator.geocode("日本 北九州")
  print("Lat, long = ",location.latitude, location.longitude)
  print("full address = ", location.address)

  # 辞書として読み取る
  loc_dict = dict(location.raw)
  print("Lat, long = ", loc_dict["lat"], loc_dict["lon"])
  print("full address = ", loc_dict["display_name"])
  print("class and type = ", loc_dict["class"], loc_dict["type"])

  url = f"https://www.google.com/maps/search/?api=1&query={location.latitude, location.longitude}"
  
  import webbrowser
  webbrowser.open(url)

main()

上のプログラムを実行すると、

Lat, long =  35.675886399999996 139.74505141191034
full address =  国会議事堂, 1, 国道246号, 永田町1, 永田町, 千代田区, 100-0014, 日本 (Japan)
Lat, long =  35.675886399999996 139.74505141191034
full address =  国会議事堂, 1, 国道246号, 永田町1, 永田町, 千代田区, 100-0014, 日本 (Japan)
class and type =  office government

 
と表示され、ブラウザで国会議事堂のGoogleMapが開くと思います。
f:id:pythonjacascript:20201024111219j:plain


ほかのライブラリ

他にも数種類GeoCodingをするPythonライブラリがあるみたいです。

GeoCoder

$ pip install geocoder

でgeocoderを入れます。

import geocoder

# 下のコードはGoogleAPIの登録が必須になってから動かなくなっている
# g = geocoder.google('Mountain View, CA')
# print(g.latlng)

location = '日本 国会議事堂'
ret = geocoder.osm(location, timeout=5.0)
print(ret.latlng)

# 出力結果:[35.675886399999996, 139.74505141191034]

medium.com