はじめに
以下の投稿で、場所の名称から緯度経度の情報を取得することをしました(JavaScript)
Pythonライブラリを使用し、より簡単に複数の場所の緯度経度を取得してみたいと思います。今回使用するのは、Geocoder/OpenStreetMap と Googlemapsです。
前提
Google Maps API keyの取得
環境
python 3.7
インストール
$pip install geocoder
$pip install googlemaps
やったこと・コード
①Pythonでジオコーディング(Geocoder/OpenStreetMap)
geo01.py
import geocoder
place = '清水寺'
ret = geocoder.osm(place, timeout=5.0)
print(place, ret.latlng)
清水寺 [34.994303, 135.784438886419]
複数の場所をローカルのtxtファイルからアップロードして、結果を見てみる
geo02.py
import geocoder
import csv
with open("./mylist1.txt", "r", encoding="utf-8_sig") as f:
reader = csv.reader(f, delimiter='\t')
for row in reader:
print(row[0])
ret = geocoder.osm(row[0], timeout=5.0)
print(ret.latlng)
アマゾン川
[43.197963, 141.771885]
アマルフィ海岸
[35.7728747, 139.519887]
アルダブラ環礁
None
アルベロベッロのトゥルッリ
None
アンコールワット
[13.41249965, 103.866569373055]
アンダルシアのひまわり畑
None
アンテロープ・キャニオン
None
アンナプルナ
[34.47401005, 133.30666803559]
イースター島
[-27.12595935, -109.349576422058]
イエローストーン国立公園
None
イエローナイフのオーロラ
None
イグアスの滝
[-25.73602815, -54.4746500826546]
- OpenStreetMapでは、結果がとれない、結果がとれていても精度がよくなかったです。
- 同じ内容をgooglemapsでもやってみようと思います。
②Pythonでジオコーディング(Googlemaps)
geo03.py
import googlemaps
import csv
import time
googleapikey = 'API keyを設定する'
gmaps = googlemaps.Client(key=googleapikey)
with open("./mylist1.txt", "r", encoding="utf-8_sig") as f:
reader = csv.reader(f, delimiter='\t')
for row in reader:
print(row[0])
result = gmaps.geocode(row[0])
lat = result[0]["geometry"]["location"]["lat"]
lng = result[0]["geometry"]["location"]["lng"]
print (lat,lng)
time.sleep(0.5)
アマゾン川
-3.2996216 -60.6646509
アマルフィ海岸
40.6333389 14.6028963
アルダブラ環礁
-9.4236984 46.3432781
アルベロベッロのトゥルッリ
40.7826344 17.2363428
アンコールワット
13.4124693 103.8669857
アンダルシアのひまわり畑
37.5442706 -4.7277528
アンテロープ・キャニオン
36.8619103 -111.3743302
アンナプルナ
28.596111 83.820278
イースター島
-27.112723 -109.3496865
イエローストーン国立公園
44.427963 -110.588455
イエローナイフのオーロラ
62.4551975 -114.3688018
イグアスの滝
-25.695259 -54.4366662
- OpenStreetMapよりも結果の取得、取れた結果の精度、ともに上回りました。
- ただ、Googlemapsでは、ジオコーディングを短時間に実施するとエラーになりましたので、すこし時間を開けています。
まとめ
- pythonライブラリを使用するととても簡単にジオコーディングできることがわかりました。
- 以下の投稿で、場所のピン打ちをしていますが、緯度経度情報がなく、場所名称しかわからない場合は、ジオコーディングが有効ですが、「緯度経度を算出すること」と「地図への表示」はプログラムをわけることもありかとも思いました。
参考URL
- Geocodeing API
- Python 製ジオコーディングライブラリ Geocoder を試す