Nik*_*ntz 6 python reverse-geocoding google-maps-api-3
我正在尝试服务器端反向地理编码,它可以让我得到一个json响应,现在我想从json响应中获得2或3个变量:
我想解析这个数据并以例如结束.
administrative_area_level_1 = 'Stockholm'
jsondata = json.load(urllib2.urlopen('http://maps.googleapis.com/maps/api/geocode/json?latlng=59.3,18.1&sensor=false'))
这是我的获取json的python代码,现在我想知道如何解析它以获得json
我可以解析它,但并不总是以administrative_area_1的形式出现:
jsondata["results"][0]["address_components"][5]["long_name"]
上面的行正确输出"纽约"作为纽约的一个点,但对于斯德哥尔摩,它输出一个邮政城市,即Johanneshow,而不是administraive_area_1(地区/州).那么如何保证函数总是返回administrative_area_1,最好不要循环?
我希望它可以像以下一样工作,直接访问国家,地区和城市:
logging.info("country:"+str(jsondata["results"][9]["formatted_address"]))
logging.info("administrative_area_level_1:"+str(jsondata["results"][8]["formatted_address"]))
logging.info("locality:"+str(jsondata["results"][8]["formatted_address"]))
Run Code Online (Sandbox Code Playgroud)
提前致谢
更新
对于我预期的结果,这是一个很好的答案.在等待答案的同时,我也试着自己实现一个解决方案:
jsondata = json.load(urllib2.urlopen('http://maps.googleapis.com/maps/api/geocode/json?latlng='+str(ad.geopt.lat)+','+str(ad.geopt.lon)+'&sensor=false'))
logging.info("geography:"+str(jsondata["results"][1]["formatted_address"]))
region = None
city = None
for result in jsondata["results"]:
#logging.info("result:"+str(result))
for component in result["address_components"]:
logging.info("components:"+str(component))
logging.info("components type:"+str(component["types"]))
if 'administrative_area_level_1' in component["types"]:
#logging.info(unicode('found admin area:%s' % component["long_name"]))
region = component["long_name"]
if 'locality' in component["types"]:
logging.info("found locality:"+str(component["long_name"]))
city = component["long_name"]
Run Code Online (Sandbox Code Playgroud)
Tad*_*eck 14
有没有必要解析JSON -它已经被解析json.load()并返回Python的数据结构.使用它就像简单的字典,其中包含列表或不同的字典.
要访问您应该使用的数据,可以使用以下内容:
jsondata['results'][0]['address_components']
Run Code Online (Sandbox Code Playgroud)
这是包含所有地名信息的地方:
[{u'long_name ':U的\ xf6dra大号\ xe4nken',u'types ':[u'route'],u'short_name ':U的\ xf6dra大号\ xe4nken'},{u'long_name':u'Stockholm 'u'types ':[u'locality',u'political '],u'short_name':u'Stockholm '},{u'long_name':u'Stockholm',u'types':[u'administrative_area_level_1 'u'political '],u'short_name':u'Stockholm '},{u'long_name':u'Sweden',u'types ':[u'country',u'political'],u'short_name ':u'SE'},{u'long_name ':u'12146',u'types ':[u'postal_code'],u'short_name ':u'12146'},{u'long_name ':U' Johanneshov',u'types':[u'postal_town'],u'short_name':u'Johanneshov'}]
正如您所看到的,有大量您不需要的数据,但您只需要locality和administrative_area_level_1信息.您可以使用filter()Python函数过滤数据:
>>> mydata = jsondata['results'][0]['address_components']
>>> types = ['locality', 'administrative_area_level_1']
>>> geonames = filter(lambda x: len(set(x['types']).intersection(types)), mydata)
Run Code Online (Sandbox Code Playgroud)
基本上,您只能在其"类型"列表中获得具有"locality"或"administrative_area_level_1"的元素.完成上述操作后,geonames将包含您需要的词典列表:
[{u'long_name ':u'Stockholm',u'types ':[u'locality',u'political '],u'short_name':u'Stockholm '},{u'long_name':u'Stockholm" ,u'types':[u'administrative_area_level_1',u'political'],u'short_name':u'Stockholm'}]
要显示他们的名字,您可以例如.迭代它们,显示long_names和各自的types值:
>>> for geoname in geonames:
common_types = set(geoname['types']).intersection(set(types))
print '{} ({})'.format(geoname['long_name'], str(', '.join(common_types)))
Stockholm (locality)
Stockholm (administrative_area_level_1)
Run Code Online (Sandbox Code Playgroud)
这是你所期望的吗?
代码可能如下所示:
import json
import urllib2
def get_geonames(lat, lng, types):
url = 'http://maps.googleapis.com/maps/api/geocode/json' + \
'?latlng={},{}&sensor=false'.format(lat, lng)
jsondata = json.load(urllib2.urlopen(url))
address_comps = jsondata['results'][0]['address_components']
filter_method = lambda x: len(set(x['types']).intersection(types))
return filter(filter_method, address_comps)
lat, lng = 59.3, 18.1
types = ['locality', 'administrative_area_level_1']
# Display all geographical names along with their types
for geoname in get_geonames(lat, lng, types):
common_types = set(geoname['types']).intersection(set(types))
print '{} ({})'.format(geoname['long_name'], ', '.join(common_types))
Run Code Online (Sandbox Code Playgroud)