FME实战案例-定个小目标,零编码爬取GoogleMap POI

原文发表时间: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,设置如下:

整个工具,最终运行时输入界面:

猜你喜欢

转载自blog.csdn.net/fmechina/article/details/81389005
poi
今日推荐