您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何使用python,json和google maps逆向服务器端的地址解析?

如何使用python,json和google maps逆向服务器端的地址解析?

有 -它已经被解析json.load()并返回Python的数据结构。 带有列表或不同词典的 它。

要访问您应该使用的数据,可以使用以下方法

jsondata['results'][0]['address_components']

包含所有 :

[{u’long_name’:u’S \ xf6dra L \ xe4nken’,u’types’:[u’route’],u’short_name’:u’S \ xf6dra L \ 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’}]

正如你所看到的,有很多你并不需要的数据,但你只想要localityadministrative_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)

基本上,您只会获得在“类型”列表中具有“本地性”或“ 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)

这是您所期望的吗?

代码看起来像这样:

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))
python 2022/1/1 18:38:09 有261人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶