#GIS#[FME]不懂编程怎么批量根据地址获取经纬度?

原文发布时间:2016-08-10 11:21:26

作者:雷中华

 

借助FME,可以像搭积木一样,不需要编程,就可以完成数据ETL操作。

背景一:FME Desktop

加拿大safe公司出品,最好用最趁手的ETL工具,没有之一。

加拿大官网 www.safe.com

中文官网 http://www.fme-china.com/

背景二:地理编码接口(以百度云地理编码为例)

百度地图开放平台
http://lbsyun.baidu.com/index.php?title=lbscloud

问题

最近遇到2个问题,一个汽车行业的数据分析,首先需要根据详细地址获取到经纬度(约3000条记录);另一个交通行业的数据可视化,第一步也是根据“交叉路口”获取经纬度(约1000条记录)。

分析

根据详细地址或者交叉路口来获取经纬度,术语叫“地理编码”,来个简单例子:

百度-拾取坐标系统 http://api.map.baidu.com/lbsapi/getpoint/index.html

step1 输入待查询地址

step2 百度一下

step3 鼠标滑动或者在地图点击,会有具体经纬度出来

#GIS#[FME]不懂编程怎么批量根据地址获取经纬度?_第1张图片

以上是纯手工办法,完成。借助百度地图开放平台的地理编码API,我们试试http://api.map.baidu.com/geocoder/v2/?ak=xxxxxxx&output=json&address=来福士广场&city=上海市

       其中ak为Application Key,已隐去,回车获取结果 

{"status":0,"result":{"location":{"lng":121.48329150361512,"lat":31.238958826715167},"precise":1,"confidence":80,"level":"商务大厦"}}

   url里的各参数以及输出结果的含义,均可在API介绍页面上详细看。不难得知,上海市来福士广场这个地址的经纬度为

(121.48329150361512,31.238958826715167),完成。

   再接下来,就是把上面接口调用的动作批量化,就该FME Desktop出场了。FME有HttpCaller函数,结合JSONExtractor实现输出结果Json的抽取,至于批量,对于FME就不是个事儿。

实现

#GIS#[FME]不懂编程怎么批量根据地址获取经纬度?_第2张图片

批量:FME最擅长批量,体现在各方面,比如数据源读取支持通配符,比如\*\*待处理.xlsx;比如还可以Batch Deploy等

准备:为了防止web访问过频导致访问失败,在访问之前使用RandomNumberGenerator函数来生成随机数,Decelerator函数来等待

API调用和结果处理:HttpCaller,就是把http://api.map.baidu.com/geocoder/v2/?ak=xxxxxxx&output=json&address=来福士广场&city=上海市这个地址里的Address和City2个参数用数据源的字段代替。特别注意的是,在交叉路口经纬度获取的时候,需要 “A路B路交叉口”,效果更佳。至于JsonExtractor可以借助Notepad++的JsonViewer插件先格式化掉再来整理。此处,lat =json["result"]["location"]["lat"],lng=json["result"]["location"]["lng"]

后续

1、结果的准确性,拿百度的地理编码API为例,返回的结果里,precise、confidence、level三个参数可以来判别结果的准确性,因为获取到了经纬度,不见得是精准的,可能是部分匹配的结果。

2、异常处理,对于无法获取经纬度的结果,需要单独输出。如果量大就找共性再修改fme模板,如果少量建议就手工处理。

结语

FME在数据源的支持上、在函数颗粒度完整度的支持上日臻化境,是大数据挖掘、空间数据处理的不二之选。

你可能感兴趣的:(FME应用案例)