LoginSignup
3
5

More than 5 years have passed since last update.

GeocoderでGoogle Map上の座標を検証する

Last updated at Posted at 2015-11-16

とあるWebサイトで、施設のGoogleマップの旗がずれているような気がしたので、
住所や施設名から計算した緯度経度と、Googleマップで指定された緯度経度を比較してみる。

東京タワーの緯度経度をGeocodingサイトで調べる

Geocodingサイトで東京タワーを検索すると、住所と座標が分かる。

〒105-0011 東京都港区芝公園4丁目2−8 東京タワー
座標: 35.658581, 139.745433

Geocoderで住所から緯度経度を取得

まずは geocoder をインストール。

pip install geocoder

Pythonコードはとっても簡単。

geocode.py
import geocoder
n = "東京タワー"
a = "東京都港区芝公園4丁目2−8"
p = [35.658581, 139.745433]

g = geocoder.google(a)
print(a, p,"<-->", g.latlng)

g = geocoder.google(n)
print(n, p,"<-->", g.latlng)

地点間の距離を算出する

これだけだと、どれ位ずれているか、よく分からないので、
2点の緯度経度から距離を算出するpythonコードを借りて、距離を計算。

geocode.py
import geocoder
import math

# 2地点間の距離の計算(Python)
# http://blogs.yahoo.co.jp/qga03052/33991636.html
def deg2rad(deg):
    return( deg * (2 * math.pi) / 360 )

def Hubeny(lat1, lon1, lat2, lon2) :
    a =6378137.000
    b =6356752.314140
    e =math.sqrt( (a**2 - b**2) / a**2 )
    e2 =e**2
    mnum =a * (1 - e2)

    my =deg2rad((lat1+lat2) /2.0)
    dy =deg2rad( lat1-lat2)
    dx =deg2rad( lon1-lon2)
    sin =math.sin(my)
    w =math.sqrt(1.0-e2 * sin *sin)
    m =mnum /(w *w *w)
    n =a/w
    dym =dy*m
    dxncos=dx*n*math.cos(my)
    return( math.sqrt( dym**2 + dxncos**2) )

n = "東京タワー"
a = "東京都港区芝公園4丁目2−8"
p = [35.658581, 139.745433]

g = geocoder.google(a)
dist = Hubeny(p[0], p[1], g.latlng[0],g.latlng[1])
print(a, p,"<-->", g.latlng,dist)

g = geocoder.google(n)
dist = Hubeny(p[0], p[1], g.latlng[0],g.latlng[1])
print(n, p,"<-->", g.latlng,dist)

その結果、完全に一致するかと思ったら、数mのずれがありました。

東京都港区芝公園4丁目2−8 [35.658581, 139.745433] <--> [35.6585817, 139.7454636] 2.771940296311124
東京タワー [35.658581, 139.745433] <--> [35.6585696, 139.745484] 4.78817294783698

この程度のずれなら十分ですが、Google Map上で数百mずれている施設があったので、
BeautifulSoap等で当該箇所をWebスクレイピングして、検証するとよいでしょう。

> var myLatLng = new google.maps.LatLng(37.695042, 140.127955);

で記述されていることが多いので、

r = re.compile(r'LatLng\((.*),(.*)\)')
m = re.search(r, str)
   if m:
      p = [float(m.group(1)),float(m.group(2))]```

という正規表現で見つければよいようです。

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5