Google 地理编码网络服务(JSON 响应)
先决条件: Python中的JSON格式
Google 拥有出色的网络服务,使我们能够利用其庞大的地理信息数据库。在这里,我们将使用 Google Maps API。在过去,这个 Maps API 是免费的,每天会处理 2、500 个请求,但现在他们已经做到了,所以它的一部分在 API 密钥后面,你开始不得不使用 OAuth 和其他东西。我们可以向他们的地理编码 API 提交一个地理搜索字符串,例如“密歇根州安娜堡”,然后让谷歌返回它的最佳猜测,即我们可以在地图上的哪个位置找到我们的搜索字符串,并告诉我们附近的地标。
地理编码服务是免费的,但速率有限,因此您不能在商业应用程序中无限制地使用 API。但是,如果您有一些最终用户在自由格式输入框中输入位置的调查数据,您可以使用此 API 很好地清理您的数据。
当您使用像 Google 的地理编码 API 这样的免费 API 时,您需要尊重使用这些资源。如果有太多人滥用该服务,谷歌可能会放弃或大幅缩减其免费服务。
您可以阅读此服务的在线文档,但它非常简单,您甚至可以通过在浏览器中输入以下 URL 来使用浏览器对其进行测试:
http://maps.googleapis.com/maps/api/geocode/json?address=Ann+Arbor%2C+MI
确保在将 URL 粘贴到浏览器之前打开 URL 并删除 URL 中的所有空格。
以下是一个简单的应用程序,用于提示用户输入搜索字符串、调用 Google 地理编码 API 并从返回的 JSON 中提取信息。
# Libraries used to grab the URL web stuff and import json
import urllib.request, urllib.parse, urllib.error
import json
# Note that Google is increasingly requiring keys
# for this API
# service URL for Google Maps API
serviceurl = 'http://maps.googleapis.com/maps/api/geocode/json?'
while True:
address = input('Enter location: ')
if len(address) < 1: break
# Concatenate the serviceurl and urllib.parse.urlencode
# which give a dictonary of address equal and this bit
# right here
url = serviceurl + urllib.parse.urlencode(
{'address': address})
print('Retrieving', url)
# urlopen() to get a handle
uh = urllib.request.urlopen(url)
# Read the whole document in UTF-8
data = uh.read().decode()
print('Retrieved', len(data), 'characters')
# Load internal strings
try:
js = json.loads(data)
except:
js = None
# If false then quit and print data
if not js or 'status' not in js or js['status'] != 'OK':
print('==== Failure To Retrieve ====')
print(data)
continue
# Call json dump and print it with an indent of four
print(json.dumps(js, indent = 4))
# Parsing and printing
lat = js["results"][0]["geometry"]["location"]["lat"]
lng = js["results"][0]["geometry"]["location"]["lng"]
print('lat', lat, 'lng', lng)
location = js['results'][0]['formatted_address']
print(location)
输出 :
Enter location: Dehradun
Retrieving http://maps.googleapis.com/maps/api/geocode/json?address=dehradun
Retrieved 1743 characters
{
"results": [
{
"address_components": [
{
"long_name": "Dehradun",
"short_name": "Dehradun",
"types": [
"locality",
"political"
]
},
{
"long_name": "Dehradun",
"short_name": "Dehradun",
"types": [
"administrative_area_level_2",
"political"
]
},
{
"long_name": "Uttarakhand",
"short_name": "UK",
"types": [
"administrative_area_level_1",
"political"
]
},
{
"long_name": "India",
"short_name": "IN",
"types": [
"country",
"political"
]
}
],
"formatted_address": "Dehradun, Uttarakhand, India",
"geometry": {
"bounds": {
"northeast": {
"lat": 30.4041936,
"lng": 78.1089305
},
"southwest": {
"lat": 30.2466633,
"lng": 77.92533879999999
}
},
"location": {
"lat": 30.3164945,
"lng": 78.03219179999999
},
"location_type": "APPROXIMATE",
"viewport": {
"northeast": {
"lat": 30.4041936,
"lng": 78.1089305
},
"southwest": {
"lat": 30.2466633,
"lng": 77.92533879999999
}
}
},
"place_id": "ChIJr4jIVsMpCTkRmYdRMsBiNUw",
"types": [
"locality",
"political"
]
}
],
"status": "OK"
}
lat 30.3164945 lng 78.03219179999999
Dehradun, Uttarakhand, India
该程序获取搜索字符串并使用搜索字符串作为正确编码的参数构造一个 URL,然后使用 urllib 从 Google 地理编码 API 检索文本。与固定网页不同,我们获得的数据取决于我们发送的参数和存储在 Google 服务器中的地理数据。
一旦我们检索到 JSON 数据,我们使用 json 库对其进行解析并进行一些检查以确保我们收到了良好的数据,然后提取我们正在寻找的信息。