程序将提示输入位置,联系Web服务并检索Web服务的JSON并解析该数据,并从JSON中检索第一个place_id。地点ID是一个文本标识符,用于在Google地图中唯一标识地点。
API终点
要完成此分配,您应使用具有Google数据静态子集的此API端点:
http://python-data.dr-chuck.net/geojson
此API使用与Google API相同的参数(传感器和地址)。此API也没有速率限制,因此您可以根据需要进行测试。如果您访问没有参数的URL,您将获得可以与此API一起使用的所有地址值的列表。
import urllib
import json
serviceurl = 'http://python-data.dr-chuck.net/geojson'
while True:
address = raw_input('Enter location: ')
if len(address) < 1 : break
url = serviceurl + urllib.urlencode({'sensor':'false', 'address': address})
print 'Retrieving', url
uh = urllib.urlopen(url)
data = uh.read()
print 'Retrieved',len(data),'characters'
js = json.loads(str(data))
我很困惑place_id在哪里?我只能看到一个包含许多大学名字的名单。我该如何解决这个问题?
答案 0 :(得分:2)
阅读你的作业:
如果您访问没有参数的网址,会获得可以与此API一起使用的所有地址值的列表。
该服务认为您没有传递参数,那是因为您没有正确形成您的网址:
url = serviceurl + urllib.urlencode({'sensor':'false', 'address': address})
您需要?
个问号来将URL路径与查询字符串分开; 使用问号,URL返回带有results
键的完整JSON对象:
url = serviceurl + '?' + urllib.urlencode({'sensor':'false', 'address': address})
生成的JSON对象看起来有点像这样:
{
"results" : [
{
"address_components" : [
# component dictionaries
],
"formatted_address" : "Virginia Tech Trail, Virginia Beach, VA 23455, USA",
"geometry" : {
# geometry dictionary
},
"partial_match" : true,
"place_id" : "ChIJw0P35CuUuokROoH5mxE5Pyg",
"types" : [ "route" ]
}
],
"status" : "OK"
}
所以results
键是一个列表,包含字典。每个这样的字典都有一个'place_id'
密钥。