Help us understand the problem. What is going on with this article?

pythonでGeocoding

久しぶりにPythonのライブラリを試したので、備忘録として。
使ったのはgeopy と geocoder
Google Colabを使ったのでpythonのversionは3です。
https://colab.research.google.com/drive/1LlQ2131p4JV3IY9xOyZcGp_Wg3fRk2p3

インストール パッケージ

$ pip install geopy geocoder

https://github.com/geopy/geopy
https://github.com/DenisCarriere/geocoder

code geocoder

import geocoder

my_location = geocoder.ip('me')
my_location.geojson

Colabで実行したので、orgがGoogleになっています。
西の方のアドレスが出てくるのかと思ったんですが、ちゃんと自動で物理的に近いサーバに繋がるようになっているっぽいです。
ちなみに、コードを実行した場所はNYのダウンタウンです。

{'features': [{'geometry': {'coordinates': [-74.006, 40.7143],
    'type': 'Point'},
   'properties': {'address': 'New York City, New York, US',
    'city': 'New York City',
    'country': 'US',
    'hostname': '169.205.229.35.bc.googleusercontent.com',
    'ip': '35.229.205.169',
    'lat': 40.7143,
    'lng': -74.006,
    'ok': True,
    'org': 'AS15169 Google LLC',
    'postal': '10004',
    'raw': {'city': 'New York City',
     'country': 'US',
     'hostname': '169.205.229.35.bc.googleusercontent.com',
     'ip': '35.229.205.169',
     'loc': '40.7143,-74.0060',
     'org': 'AS15169 Google LLC',
     'postal': '10004',
     'readme': 'https://ipinfo.io/missingauth',
     'region': 'New York',
     'timezone': 'America/New_York'},
    'state': 'New York',
    'status': 'OK'},
   'type': 'Feature'}],
 'type': 'FeatureCollection'}
# 緯度経度
my_location.latlng

# 住所
my_location.address

住所は番地までは出てこないので、対応するデータの粒度が都市サイズとかだと、
ゴニョゴニョ簡単に出来そうです。

[40.7143, -74.006]
'New York City, New York, US'

code geopy

from geopy.geocoders import Nominatim
# locator作成
geolocator = Nominatim(user_agent="user", timeout=10)
location = geolocator.geocode('New York City, New York, US')
location.latitude, location.longitude
location = geolocator.reverse("40.7127281 -74.0060152")
location.address

比較のためにgeocoderが表示した住所を使ってみました。
geopyの方が細かく出るみたいです、Googleマップで見る限り、アドレスの精度は結構良さげです。
https://www.google.com/maps/place/40%C2%B042'45.8%22N+74%C2%B000'21.7%22W/@40.7127281,-74.0066803,18z/data=!3m1!4b1!4m5!3m4!1s0x0:0x0!8m2!3d40.7127281!4d-74.0060152

(40.7127281, -74.0060152)
'New York City Hall, 260, Broadway, Civic Center, Manhattan Community Board 1, Manhattan, New York County, New York, 10000, United States of America'

最後に東京タワーとタイムズスクウェアの距離を確認してみました。

from geopy import distance

loc_tokyo = geolocator.geocode("Tokyo tower, Tokyo, Japan")
loc_times_square = geolocator.geocode("Times Square, Manhattan, NY")
src = (loc_tokyo.latitude, loc_tokyo.longitude)
dist = (loc_times_square.latitude, loc_times_square.longitude)
distance.distance(src, dist).km
distance.distance(src, dist).miles

簡単に出せました。ただ、loc_tokyoの住所を見たら、
'東京タワー, 東京タワー通り, 麻布, 南青山6, 港区, 東京都, 105-0011, 日本 (Japan)'という知らない住所になりました。
多分、lat & lon でちゃんと東京とNYの場所を設定するば、精度は上がるのだと思います。

10870.216621346974 # km
6754.439461884453 # mile
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした