2013-03-08 161 views
15

這讓我瘋狂。 到目前爲止我已經刪除了這個密鑰1000次。 昨天它的工作就像一個魅力,今天不再 這裏是Python代碼:GoogleMaps API - 座標(經度,緯度)地址

from googlemaps import GoogleMaps 
gmaps = GoogleMaps("AIzaSyBIdSyB_td3PE-ur-ISjwFUtBf2O0Uo0Jo") 
exactaddress ="1 Toronto Street Toronto" 
lat, lng = gmaps.address_to_latlng(exactaddress) 
print lat, lng 

GoogleMapsError: Error 610: G_GEO_BAD_KEY 

它現在返回上面的錯誤沒有明顯的原因。 我不認爲我已達到請求限制或最大速率 爲了保持安全,我甚至引入了延遲(1秒)...仍然得到相同的錯誤

有沒有人有任何想法我可以如何解決這個? 如果您可以指出我正在使用的替代方案,那麼必須使用不同的python模塊才行。

感謝 Ç

PS:關鍵是有效的,它是一個客戶端密鑰,當我啓用的GoogleMap API3在App控制檯卻自動啓用。對於域或IP地址

編輯沒有限制:所以這是我最後使用

def decodeAddressToCoordinates(address): 
     urlParams = { 
       'address': address, 
       'sensor': 'false', 
     } 
     url = 'http://maps.google.com/maps/api/geocode/json?' + urllib.urlencode(urlParams) 
     response = urllib2.urlopen(url) 
     responseBody = response.read() 

     body = StringIO.StringIO(responseBody) 
     result = json.load(body) 
     if 'status' not in result or result['status'] != 'OK': 
       return None 
     else: 
       return { 
         'lat': result['results'][0]['geometry']['location']['lat'], 
         'lng': result['results'][0]['geometry']['location']['lng'] 
       } 

傑森指着我也很有趣,但因爲我的代碼是爲了解決某個問題庫(一個時間使用)我還沒有嘗試過他的解決方案。我肯定會考慮如果我再次編寫代碼:-)

+0

不確定python實現是否相似,但使用v2地理編碼的人由於v2的生命週期結束而遇到問題。切換到v3似乎可以解決一些問題。 python有版本區別嗎? – Rafe 2013-03-11 18:38:24

+0

從2013年3月10日開始,對v2的支持下降了,據我所知,googlemaps包似乎在使用v2,它具有不同的查詢地址,理論上,更改查詢地址應該足夠了(在googlemaps包中)。 – 2013-03-11 19:30:30

回答

11

儘管Google不贊成使用googlemaps進行V2調用(這就是爲什麼你會看到打破的調用),但他們最近宣佈他們正在爲開發者爲期六個月的延期(至2013年9月8日)從V2轉移到V3 API。詳情請參閱Update on Geocoding API V2

與此同時,請檢查pygeocoder作爲可能的Python V3解決方案。

+0

非常感謝您的更新。我會試一試。當我看到沒有人能夠幫助我搜索更多的內容時,我發現現在最初的問題中粘貼了這個函數,這非常有效: – MiniMe 2013-03-11 21:35:52

11

自2013年9月起,Google Maps API v2 no longer works。下面是代碼,API V3(基於this answer)工作:

import urllib 
import simplejson 

googleGeocodeUrl = 'http://maps.googleapis.com/maps/api/geocode/json?' 

def get_coordinates(query, from_sensor=False): 
    query = query.encode('utf-8') 
    params = { 
     'address': query, 
     'sensor': "true" if from_sensor else "false" 
    } 
    url = googleGeocodeUrl + urllib.urlencode(params) 
    json_response = urllib.urlopen(url) 
    response = simplejson.loads(json_response.read()) 
    if response['results']: 
     location = response['results'][0]['geometry']['location'] 
     latitude, longitude = location['lat'], location['lng'] 
     print query, latitude, longitude 
    else: 
     latitude, longitude = None, None 
     print query, "<no results>" 
    return latitude, longitude 

的參數和其他信息的完整列表,請參閱official documentation

1

做了一些代碼打高爾夫球,並以此版本結束。根據你的需要,你可能想區分一些更多的錯誤條件。

import urllib, urllib2, json 

def decode_address_to_coordinates(address): 
     params = { 
       'address' : address, 
       'sensor' : 'false', 
     } 
     url = 'http://maps.google.com/maps/api/geocode/json?' + urllib.urlencode(params) 
     response = urllib2.urlopen(url) 
     result = json.load(response) 
     try: 
       return result['results'][0]['geometry']['location'] 
     except: 
       return None