当前位置: 首页 > 面试题库 >

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

公西姚石
2023-03-14
问题内容

我正在尝试通过服务器端反向地理编码来获取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代码,现在我想知道如何解析它以获取

  • Administrative_area_level_1 long_name(即州或地区名称)
  • 地区名称(即城市名称)
  • 了解如何解析我的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"]))

提前致谢

更新资料

这是我预期的结果很好的答案。在等待答案的同时,我也尝试自己实现一个似乎可以解决的解决方案

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"]

问题答案:

处理回应

没有必要解析JSON -它已经被解析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))


 类似资料:
  • 但这样我就无法访问eureka仪表盘,只是使用默认配置: 在我的客户端中,同样的事情也发生了,我不能指向另一个不同于默认(localhost:8761)的eureka服务器,请参阅我的配置: 查看客户端日志,我得到了以下内容: 无论我在客户端配置什么端口或主机,都要尽量达到默认值。 重要提示:我在以下版本中使用eureka:https://mvnrepository.com/artifact/or

  • 我是GWT的新手,我有一个在GWT上开发的应用程序。我需要在服务器端集成一个用python开发的程序。用python开发的应用程序必须取一个MalLab文件,然后按格式生成一些文件。PNG。目前,我对python程序进行了更改,因为它必须将文件放在特定的网址上。你是如何在服务器端将GWT应用程序与python集成的?。 python中的程序是:

  • 当我的网卡连接到网络A时,我正在启动我的RMI服务器。运行我的客户端按预期成功并打印“Hello World”。一旦我将网络连接更改为网络B(无需重新启动RMI服务器!)我无法再连接到服务器。服务器和客户端总是在同一台主机上运行,所以使用localhost地址就足够了。 服务器: 客户: 例外是: 它指的是在连接到网络A时分配给我的IP地址。注册表查找按预期工作,只有对的调用失败,但有上述异常。

  • 我正在尝试让这个gRPC服务器示例与Google Asylo(https://github.com/google/asylo/tree/master/asylo/examples/grpc_server)一起工作。.要初始化服务器,我需要在此配置文件中指定server_address(https://github.com/google/asylo/blob/master/asylo/example

  • 问题内容: 我的客户端PC通过以太网上的套接字作为服务器PC连接,如何从服务器端代码中找到该客户端的IP。 服务器在新线程中为每个客户端分配一个套接字。 当我在客户端套接字上执行操作时,我仍然会获得服务器IP地址。(是服务器在当前客户端连接上产生的套接字,并将其传递给新的线程)。 问题答案: 我相信您想改用远程地址:

  • 问题内容: 因此,已经有一个必须在控制台上运行的Python程序设置了。我将使用Javascript为应用程序构建Web GUI界面。我将如何: 一种。开始处理此Python程序的输入/输出,而无需触摸原始代码。 b。通过Javascript调用将控制台输入发送到Python程序。我已经研究了原始的HTTP请求/ AJAX,但不确定如何将其作为输入发送到Python程序。 问题答案: 一种。处理程

  • websocket客户端(使用Autobahn/Python和Twisted)需要连接到websocket服务器:客户端需要向服务器提供其客户端证书,客户端需要检查服务器的证书。例如,这些证书是在Kubernetes minikube安装过程中创建的。特别地: 服务器证书(据我所知为X509格式) 客户端证书~/。minikube/客户。按键 我已经检查过,我可以成功地使用这些证书密钥使用发出库伯

  • 问题内容: 我有一个正在开发的“具有社会地理意义”的应用程序,而百万美元的问题是我如何列出“我的位置”“在X英里内”的一组项目,因为有数百万个应用程序在执行此操作惊讶地发现只有Google Maps API对此提供了免费的网络服务,更糟糕的是,只有在Google Map中使用了该服务才受支持。那我必须开发自己的距离计算器吗?是否有任何免费/收费服务可以让我至少将地址转换为XY坐标? 我确定有一个行