とあるWebサイトで、施設のGoogleマップの旗がずれているような気がしたので、
住所や施設名から計算した緯度経度と、Googleマップで指定された緯度経度を比較してみる。
#東京タワーの緯度経度をGeocodingサイトで調べる
Geocodingサイトで東京タワーを検索すると、住所と座標が分かる。
〒105-0011 東京都港区芝公園4丁目2−8 東京タワー
座標: 35.658581, 139.745433
#Geocoderで住所から緯度経度を取得
まずは geocoder をインストール。
pip install geocoder
Pythonコードはとっても簡単。
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コード]
(http://blogs.yahoo.co.jp/qga03052/33991636.html)を借りて、距離を計算。
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))]```
という正規表現で見つければよいようです。