Google地图API - 地址转坐标(纬度,经度)

16 投票
3 回答
25762 浏览
提问于 2025-04-17 18:21

这让我快疯了。 到目前为止,我已经删除了这个密钥1000次。 昨天它还好好的,今天却不行了。 这是我的Python代码:

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秒)……但还是得到了同样的错误。

有没有人知道我该怎么解决这个问题? 如果你能推荐一个我现在用的模块的替代品,换一个模块也没问题。

谢谢 C

附言:这个密钥是有效的,它是一个客户端密钥,当我在应用控制台启用GoogleMAP API3时,它会自动启用。没有域名或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']
                }  

Jason推荐给我的那个库也很有意思,但因为我的代码是为了修复某个问题(一次性使用),所以我没有尝试他的解决方案。如果我再写代码的话,我一定会考虑这个 :-)

3 个回答

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
11

自2013年9月起,Google Maps API v2 不再可用。下面是适用于API v3的代码(基于这个回答):

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

查看官方文档,可以找到完整的参数列表和更多信息。

11

虽然谷歌已经停止支持V2版本的googlemaps调用(这就是你看到调用失败的原因),但他们最近宣布给开发者一个六个月的缓冲期(直到2013年9月8日),让大家可以从V2版本迁移到V3版本的API。想了解更多细节,可以查看关于地理编码API V2的更新

与此同时,可以看看pygeocoder,这可能是一个适合Python的V3解决方案。

撰写回答