这几天因为其他事务,打断了自己的学习计划,今天继续我的翻译,避免又中途而废。

注:文章原文为Dr. Charles Severance 的 《Python for Informatics》。文中代码用3.4版改写,并在本机测试通过。

13.7 谷歌的 geocoding 网页服务

  谷歌公司有一个非常优秀的网页服务叫做geocoding。这个服务允许我们使用他们庞大的地理信息数据库。当我们向geocoding API提交一个"Ann Arbor, MI"的地理位置查找字符串后,谷歌将返回它推测出来的,在地图上可能找到搜索字符串的最佳地理位置,并告诉我们周边的地标。

  geocoding网页服务是免费的,但是为了防止盈利性程序无限制使用此API,它对速率进行了限制。如果你拥有的一些调查数据,是终端用户通过自由格式的输入框输入位置信息的,那么你可以利用这个API很好的整理你的数据。

  当你们使用类似像谷歌 geocoding 免费API时,你需要尊重使用这些资源。如果太多的人滥用这个服务,谷歌可能停止或者显著减少它的免费服务。

  你可以阅读这个服务的在线文档,但它非常简单,你甚至在你的浏览器中输入以下URL来测试它。
http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=Ann+Arbor%2C+MI

  在复制粘贴这个URL到你的浏览器之前,请确认解包和删除中间的任何空格。
  下面这个简单的程序,首先提示用户输入搜索的字符串,然后调用geocoding API,并从返回的JSON中抓取信息。
  

import urllib.request
import urllib.parse
import json serviceurl='http://maps.googleapis.com/maps/api/geocode/json?' while True:
address = input('Enter location: ')
if len(address) < 1 :
break
url = serviceurl + urllib.parse.urlencode({'sensor':'false','address':address})
print('Receiving', url)
try:
uh = urllib.request.urlopen(url)
except:
print('Can not connect the server')
break
data = uh.read()
print('Received',len(data),'characters') try:
js = json.loads(data.decode('utf-8'))
except:
js = ''
if 'status' not in js or js['status'] != 'OK':
print('==== Failure To Retriev ====')
print(data.decode('utf-8'))
continue print(json.dumps(js, indent = 4)) 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)

  这个程序先获取查找字符串,然后创建一个URL,并将这个字符串进行适当编码作为参数包含在URL中,之后用urllib从geocoding API处获得文本信息。我们得到的数据依赖于我们发送的这个参数和存储在谷歌中的数据,而不是一个固定的网页。

  一旦我们获取了JSON数据,我们就可以用JSON库来分析它,并做一些检验,来确保我们获取的是正确的数据,然后我们抓取寻找的数据。

  程序的输出如下:

Enter location: china
Receiving http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=china
Received 1182 characters
{
"results": [
{
"formatted_address": "China",
"types": [
"country",
"political"
],
"address_components": [
{
"types": [
"country",
"political"
],
"long_name": "China",
"short_name": "CN"
}
],
"geometry": {
"viewport": {
"southwest": {
"lat": 18.1576156,
"lng": 73.4994136
},
"northeast": {
"lat": 53.56097399999999,
"lng": 134.7728099
}
},
"location_type": "APPROXIMATE",
"bounds": {
"southwest": {
"lat": 18.1576156,
"lng": 73.4994136
},
"northeast": {
"lat": 53.56097399999999,
"lng": 134.7728099
}
},
"location": {
"lat": 35.86166,
"lng": 104.195397
}
},
"place_id": "ChIJwULG5WSOUDERbzafNHyqHZU"
}
],
"status": "OK"
}
lat 35.86166 lng 104.195397
China

  你可以从www.py4inf.com/code下载geojson.py和geoxml.py,浏览比较谷歌geocoding API JSON格式和XML格式的区别。

(译者注:因为国际出口拥堵的原因,访问geocoding API成功率较低,需要多试几次)

Python for Infomatics 第13章 网页服务四(译)的更多相关文章

  1. Python for Infomatics 第13章 网页服务三(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 13.6 应用程序接口API 现 ...

  2. Python for Infomatics 第13章 网页服务二(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 13.4 JavaScript ...

  3. Python for Infomatics 第13章 网页服务一(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 一旦利用程序通过HTTP协议获得 ...

  4. Python for Infomatics 第12章 网络编程四(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.7 用BeautifulS ...

  5. #Python学习笔记:1-3章 (基于《python编程,从入门到实践)

    第1-3章 这个文档是记录我学习python时一些学习笔记以及一些想法也可以称作复习笔记 第一章:起步这一章主要是从第一个"hello world"程序到python环境的搭建与配 ...

  6. Python for Infomatics 第12章 网络编程六(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.9 词汇表 Beautif ...

  7. Python for Infomatics 第12章 网络编程一(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 本书中的许多例子关注的是读取文件 ...

  8. Python for Infomatics 第14章 数据库和SQL应用一(译)

    14.1 什么是数据库 数据库一种存储结构数据的文件.绝大多数数据库类似字典——映射键和值的关系.最大的区别是数据库是保存在硬盘或其它永久性的存储上,所以在程序结束后它仍然存在.而保存在内存中的字典容 ...

  9. Python for Infomatics 第12章 网络编程三(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.5 HTML分析和网页抓取 ...

随机推荐

  1. angularJs 控制文本长度,超出省略号过滤器

    1.控制文本长度,超出省略号 在模版中: <label>{{item.abbr| cut:true:20:' ...' }}<label> js: angular.module ...

  2. kali 安装ss代理客户端的方法(纯属个人总结)

    1.声明版本,因为别的版本没测试过 2.下载客户端安装包 wget https://github.com/shadowsocks/shadowsocks/archive/master.zip 这个是代 ...

  3. C#在二维码中添加圆角logo

    public class QRCodeHelper { #region 合并用户QR图片和用户头像 /// <summary> /// 合并用户QR图片和用户头像 /// </sum ...

  4. jeecg bootstrap修改单列模版

    在作者原来的模版上增强单列模版 <%@ page language="java" import="java.util.*" contentType=&qu ...

  5. mongodb 数据库查询

  6. testng 失败自动截图

    testng执行case failed ,testng Listener会捕获执行失败,如果要实现失败自动截图,需要重写Listener的onTestFailure方法 那么首先新建一个Listene ...

  7. NodeJS+Express下构建后端MVC文件结构

    关于MVC的结构大体上有两种方式,其一按照层级进行文件夹分类,其二是按照业务进行文件夹分类.关于这个demo相关的业务简单,所以暂采用第一种的方式,当然实际当中很恨复杂的项目可以采用两种方式相结合的方 ...

  8. Qt5.5.1编译出来的程序出现libgcc_s_dw2-1.dll的解决方案

    问题如图: 输入"myudp2016.exe 1  " 后出现 这是因为没有在系统环境变量path里加上相关路径,我们添加如下路径: 比如说WIN7系统-开始-计算机-右键-属性- ...

  9. MFC序列化与反序列化

    #pragma once #include "afx.h" #include <vector> using std::vector; class HzyData : p ...

  10. javascript中的对象

    除了字符串,数字,布尔值(true,false),null,undefined,js中的值都是对象. 操作一个对象 var o = {name: 'man', value: 99} o.name = ...