博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python for Infomatics 第13章 网页服务四(译)
阅读量:4649 次
发布时间:2019-06-09

本文共 3620 字,大约阅读时间需要 12 分钟。

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

注:文章原文为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.requestimport urllib.parseimport jsonserviceurl='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: chinaReceiving http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=chinaReceived 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.195397China

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

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

 

转载于:https://www.cnblogs.com/zhengsh/p/5459463.html

你可能感兴趣的文章
安全发布的模式
查看>>
python的N个小功能(更新文件)
查看>>
【bzoj 4390】 [Usaco2015 dec]Max Flow(树上差分)
查看>>
FPGA内部硬件结构简介
查看>>
前端开发面试题总结-代码篇
查看>>
javaweb学习总结(三十一)——国际化(i18n)
查看>>
23种设计模式[1]:单例模式
查看>>
好的学习材料
查看>>
【DRF分页】
查看>>
6.1 文件对象常用方法与属性
查看>>
排列组合问题
查看>>
小知识点
查看>>
【笔记】HybridApp中使用Promise化的JS-Bridge
查看>>
模拟赛 sutoringu
查看>>
hdu 1253 胜利大逃亡 (广搜)
查看>>
华为上机试---购物单(算法:背包问题)
查看>>
PHP操作Mongodb API 及使用类 封装好的MongoDB操作类
查看>>
PHP实现经典算法
查看>>
NodeJS(四)Mac下如何安装package.json里面会产生依赖项
查看>>
MapReduce会自动忽略文件夹下的.开头的文件
查看>>