使用Python(Google Maps API)从地理编码结果列表中提取lat / lon

时间:2016-05-18 23:32:19

标签: list python-2.7 google-maps-api-2 matplotlib-basemap geocode

我尝试将Google Maps API与GoogleMaps Python库一起使用,以便在提供全部或部分地址时对纬度/经度进行地理编码(在此示例中,我使用城市/州,但是我也有只有邮政编码的数据集,我需要将其用于下线。

 import googlemaps
 gmaps = googlemaps.Client(key=[insert API key here])
 geocode_result = gmaps.geocode('Sacramento, CA')
 print(geocode_result)

Result:[{u'geometry': {u'location_type': u'APPROXIMATE', u'bounds': {u'northeast': {u'lat': 38.685507, u'lng': -121.325705}, u'southwest': {u'lat': 38.437574, u'lng': -121.56012}}, u'viewport': {u'northeast': {u'lat': 38.685507, u'lng': -121.325705}, u'southwest': {u'lat': 38.437574, u'lng': -121.56012}}, u'location': {u'lat': 38.5815719, u'lng': -121.4943996}}, u'address_components': [{u'long_name': u'Sacramento', u'types': [u'locality', u'political'], u'short_name': u'Sacramento'}, {u'long_name': u'Sacramento County', u'types': [u'administrative_area_level_2', u'political'], u'short_name': u'Sacramento County'}, {u'long_name': u'California', u'types': [u'administrative_area_level_1', u'political'], u'short_name': u'CA'}, {u'long_name': u'United States', u'types': [u'country', u'political'], u'short_name': u'US'}], u'place_id': u'ChIJ-ZeDsnLGmoAR238ZdKpqH5I', u'formatted_address': u'Sacramento, CA, USA', u'types': [u'locality', u'political']}]

我的问题是,我不确定如何从此列表中提取适当的lat / lon值。我尝试使用以下代码解析列表(取自this question on SO的答案):

import operator
thirditem=operator.itemgetter(3)(geocode_result)
print(thirditem)

当我运行它时,我得到一个IndexError,指出索引超出范围。我也通过调试器运行它,但是我得到了相同的错误而没有任何其他信息。我已经用Google搜索并查看其他SO问题,但我仍然不确定问题出在哪里。

作为旁注,我也尝试使用this tutorial中的代码示例,但我得到了一个" 0"作为我尝试运行时的答案,不幸的是,它比IndexError更有帮助。

我的目标是能够从这里解析相应的lat / lon值并将它们动态插入到这个底图脚本中。值目前是硬编码的,但最终我希望能够将值变量用于值llcrnrlon,llcrnrlat,urcrnrlon,urcrnrlat,lat_0和lon_0:

map = Basemap(projection='merc',
          # with high resolution,
          resolution= 'h',
          # And threshold 100000
          area_thresh = 100000.0,
          # Centered on these coordinates
          lat_0=37, lon_0=119,
          #and using these corners to specify the lower left lon/lat and upper right lon/lat of the graph)
          llcrnrlon=-130, llcrnrlat=30,
          urcrnrlon=-110, urcrnrlat=45)

我是所有这一切的新手,所以可能有一个我没有看到的简单答案。欢迎任何帮助!谢谢。

1 个答案:

答案 0 :(得分:3)

我能够向我的一些开发者寻求帮助,我在这里回答我自己的问题,希望它能帮助那些也在努力解决同样问题的人。

地理编码结果返回一个JSON对象,在Python中它被视为只包含单个对象(结果)的字典。因此,为了提取适当的lat-lon值,需要使用“geocode_result [0] [”geometry“] [”location“] [”lat“]”,其中[0]是数组中的第一个对象(结果)。

我编写了这个函数,用于我的Basemap脚本,从作为参数传入的位置提取lat / lon值。

def geocode_address(loc):
    gmaps = googlemaps.Client(key=[insert your API key here])
    geocode_result = gmaps.geocode(loc)
    lat = geocode_result[0]["geometry"]["location"]["lat"]
    lon = geocode_result[0]["geometry"]["location"]["lng"]
    #test - print results
    print (lat,lon)

当我使用Sacramento测试它时,CA作为loc:

geocode_address('Sacramento, CA')

这是我的结果:

Result: 38.5815719, -121.4943996