原文发表时间:2016-09-06 14:46:09
作者:雷中华
案例一通过系列文章,讲述了借助FME平台实现web数据采集,获取肯德基中国的所有门店地址、电话、服务等信息。方法两种,一个是借助PythonCaller、PythonCreator基于部分python脚本的做法;另外是完全无编程的HttpCaller。
本文通过爬取谷歌poi的实战,再次巩固web应用的一些常用模块。另外,分享在处理过程中遇到的几个问题和解决办法,供参考和讨论。
附:
[FME]如何采集肯德基中国的所有门店地址(一)问题分析
http://url.cn/2HJWA2s
[FME]如何采集肯德基中国的所有门店地址(二)Python、HttpCaller获取门店Json
http://url.cn/2HkzeVY
[FME]如何采集肯德基中国的所有门店地址(三)Json处理
http://url.cn/2Ggm41u
[FME]如何采集肯德基中国的所有门店地址(四)地理编码
http://url.cn/2AuqZ6r
[FME]如何采集肯德基中国的所有门店地址(五)零编码实现数据采集
http://url.cn/2850krg
案例:获取GoogleMap POI名称、地址、经纬度等信息
背景
谷歌地图自2005年横空出世,借助地图切片和Ajax异步加载技术,秒杀gis专业领域里绝大多数产品。11年来,更是引领泛大众webgis大踏步向前发展:卫片、街景、导航、室内地图。数据的极大丰富详实以及使用方式的遍历,互联网、移动互联网上地图应用现在是遍地开花。
那么,最基础的POI数据,我们如何从google map上根据范围和类型获取呢?
分析
GoogleMap提供places api webservices(https://developers.google.com/places/web-service/),包含place Search、place details、add places三大块功能,我们获取poi的需求,需要用到search和details这两部分。
一、Place Search
https://maps.googleapis.com/maps/api/place/nearbysearch/output?parameters
主要参数
· location,搜索中心位置的经纬度,"纬度,经度"
· radius,搜索半径,单位米
· types,类型,多个类型中间用"|"连接
· key,许可(默认1000次/天)
输出结果
二、Place Details
https://maps.googleapis.com/maps/api/place/details/output?parameters
主要参数
· placeid,从search的输出中获取到的poi唯一标识码
· key,许可(默认1000次/天)
输出结果
以上两个api都是可以用FME HttpCaller模块实现访问并获取Json结果,具体用法请关注本公众号后回复“kfc”获取。
难点一 GoogleAPI及结果解析
本案例中最难得地方就是这里——Place Search API最多一次返回60个结果,每页最多20条。这条规则意味着:
1、Radius搜索半径的参数,不能过大,否则每次只返回60个无疑会漏掉很多。
2、每页只有20条结果,每页的Json结果里有next_page_token。
https://maps.googleapis.com/maps/api/place/nearbysearch/json?pagetoken=@Value(next_page_token)&key=@Value(keys_list)
主要参数
· pagetoken,从上一页获取来的next_page_token属性
· key,许可(默认1000次/天)
3、可能某次搜索有60条结果,可能没有,所以这里不能写成固定的读3页。FME自定义转换器里有个功能是循环(Loop)。跳出这个循环的条件就是,next_page_token没有值
Input → Tester→①Loop ②Output,至于Loop,最终也会走到Output
参考:FME创建循环 http://blog.163.com/antufme@126/blog/static/14049249220141199247349/
4、每次placeSearch只返回60条结果,意味着一个大的区块,就需要切分成小的格子。
难点二 网格化拆分
输入的范围较大,而每次的Search只能返回60条记录,解决之道就是拆分成较小的网格。ArcGIS里有个Fishnet(渔网)工具,FME里没有,但是FME里有2DGridAccumulator,可以根据长宽来切分,至于输出,可以选择切分后网格的中心点(Type of Grid to Create,Points Centers)
难点三 输入的经纬度,如何按照长宽来网格化?
输入的是经纬度,长宽是投影后的结果,解决办法是投影——ReProjector转换器。我们可以先投影到web墨卡托,切分好之后,再投影回wgs84.
难点四 Google Map API Keys
根据谷歌的规矩,每个Key每天只能访问1000次。当所需要分析较大范围的时候,势必需要更多的Keys。如果输入多个Keys组成一个池子,用逗号分隔。每次遍历使用Key去访问谷歌API的时候,依次使用每个Key,均匀地使用。
①AttributeSplitter,根据逗号分隔字符;
②ListElementCounter,获取输入了多少个Keys;
③Counter,设置Global模式,总共是第几次使用谷歌API;
④ListIndexer,共 Counter获取的次数和Keys个数取余数来获取第几个Key拿来用,即可实现遍历的效果。
难点五 Types过多如何选择?
前面几个都是由于谷歌API输出Json导致的,Types却是input参数带来的问题。谷歌place search的输入types枚举多达数十个。
好在,FME平台的参数里可以设置Choce with Alias,设置如下:
整个工具,最终运行时输入界面: