上一篇记录对转换器编制过程进行了简单复盘,并对存在问题进行记录(点击直达)。这篇记录将详细记录整个转换器设计的思路。
一、转换器设计思路
现在工作考核都讲究以结果为导向,结果不对一切都是P。这次就先介绍需求(即自定义转换器的功能【目的】):通过选择行政区名称(或输入矢量面文件)和选择/输入关键词(或POI分类),即可下载该行政区(矢量面)范围内的高德(百度)POI、公交路线或行政区。接下来就将需求分解成模板编制需要的参数及模板流程。
(一)自定义发布参数需求分析
1、由于这个转换器要达到获取多个数据源POI的目的,这就需要设置用于控制POI数据源的参数:
A、“POI数据源”:用于指定POI数据来源(API接口类型),图5。
图5 POI数据源参数
2、要达到选择行政区名称进行下载数据。一是需要具有行政区名称选择的参数;二是行政区具有不同级别,这还需要设定一个用于指定行政区级别的参数;三是由于整合了百度矩形POI接口,百度没有行政区矢量面获取接口,这就需要有其它数据源,这里采用了“地图选择器”这个数据源,第三个参数用于控制行政区域的数据源(结果图6);三个参数:
A、“选择行政区”:用于设定需要下载的区域;
B、“行政区级别”:为“选择行政区”的辅助参数,用于指定行政区级别;
C、“获取范围的数据源”:用于确定行政区矢量面的数据来源。“DATAV”数据源不需要许可,因此任一种“POI数据源”都可用;“高德WEB/JS”接口需要许可(key),如选择“高德WEB”,“POI数据源”也同样的选择“高德WEB”;“自有矢量数据”由用户加载自有的面状矢量数据确定下载范围,选择此选项,“选择行政区”“行政区级别”两个参数将失效(即不用特别设置)。这个参数还可以在增加一个选项,由用户输入需要下载范围的左下右上角坐标(或左上右下),但增加这个选项,就至少的增加1个(或4个)参数,增加一个容易输入错误,4个又太多,因此放弃此选项。
图6 数据下载范围设定涉及的3个参数
3、由于高德与百度搜索规则不同,根据其规则设定了3个参数:
A、“高德POI类型”:可以达到按照类型获取POI数据,具体的类型见高德开发者手册(高德POI分类编码和城市编码表:https://lbs.amap.com/api/webservice/download),同时这个选项只能按照一级分类获取POI数据,公交路线下载也是通过这个选项指定。
B、“高德关键词”:按照关键词进行检索,如果“高德POI类型”不为空,则搜索的关键词必须为POI类型所包含,否则达不到想要的结果数据,关键词相当于二次筛选。
C、“百度分类”:将百度的POI分类作为关键词,达到精确搜索的目的,同时支持多关键词。(百度POI分类:http://lbsyun.baidu.com/index.php?title=lbscloud/poitags)
4、由于POI下载需要先下载行政区,本着功能最大化的原则设定了“获取数据类型”参数,这样如只需下载行政区就不用再通过其他转换器;公交路线下载的功能没在此处体现,而是通过“高德POI类型”选项实现,放在这里更为合理但转换器内部需要更为复杂的关联设置。
5、调用POI接口需要许可,因此设定了用于输入高德key/百度ak的参数。
6、由于需要整合高德百度POI多边形/矩形接口,每次查询有返回POI数据量有限制,因此设定了两个参数:
A、“起始网格大小”:按照行政区查询(县级及以上),一般范围较大,如果直接进行递归划分将浪费大量的key,通过这个参数可以将查询区域划分成合理大小的网格,为递归划分做准备;
B、“POI分隔阈值”:高德每次查询最多返回900条数据,而百度最多返回400条数据;因此,将此参数暴露出来由用户自行决定网格递归四分条件,大于设定值将进一步四等分。
7、由于现在网站对POI接口调用进行严格的管理,如果短时内频繁调用(不清楚具体的规则)将导致账号封禁;因此设定了两次调用的时间间隔;“最小延时”“最大延时”用于产生一个介于两者之间的随机数,这样每两次调用的间隔时间为上述的随机数。
(二)转换器所需模块(自定义转换器)分析
实现各项功能所需参数厘清后,就是对功能实现的设计分析,分析每个参数需要采用的转换器,或自行构建的自定义转换器,并对各项功能进行细化。
1、行政区选择功能。在FME中没有能直接实现的转换器,需要通过设置“Choice(Multiple)”自定义发布参数,同时编制流程对获取的参数行进分析,这就需要编制自定义转换器(1)。
2、下载范围矢量面的获取。这个首先是对用“TestFilter”对“获取范围的数据源”传入参数进行判断,明确数据源。调用高德行政区查询接口(WEB服务/JS端)需要构建自定义转换器(2);如果数据源是“地图选择器”也需要构建自定义转换器(3),采用“地图选择器”是由于百度没有面状矢量行政区数据源,如果直接采用高德行政区接口作为数据源就需要两种类型的key,又需要增加一个参数进行区分,因此采用“地图选择器”作为POI获取范围的数据源。
3、“POI数据源”在多个步骤中需要使用,具体记录模板流程时再介绍。
4、“获取数据类型”在行政区获取完后,只要通过“Tester”转换器进行简单判断分流,如果下载“行政区”就输出数据,流程结束,如果是“POI”就进入下一步流程。
5、POI下载时,行政区下载完后,就需要对下载范围的面进行分割,这首先需要根据“起始网格大小”传入的参数对面进行第一次分割(4);其次就是按照“POI分割阈值”传入的参数对第一次分割后的面进行递归分割(5)。这可以构建成一个自定义转换器,也可以构建成两个,本记录采用两个自定义转换器。
6、面分割完成后,接下来就是各个获取面内的POI的JSON数据,如果多页还需要翻页,单页就直接将需要的属性提取出来,这也需要构建自定义转换器;高德与百度的格式/属性字段不同,需要按其格式各自编制自定义转换器(6、7)。
7、公交路线的获取,首先需要获取公交路线名单,这个通过属性拆分及去重就可以实现;其次就是按照公交路线名单获取每条公交路线及站点的JSON数据(8);最后是对将JSON数据解析成矢量数据(9);这个可以构建成一个转换器也可以拆成三个部分。
8、POI及高德行政区的下载都需要许可,要达到多个key/ak循环使用就需要构建自定义转换器,对传入的key/ak串进行拆分循环使用(9)。
9、随机休眠时间(两次调用间隔时长)的设定,通过“RandomNumberGenerator”“Decelerator”就可以达到设定休眠时间随机的目的,由于需要多次使用,记录中也构建成自定义转换器(10)。
10、百度分类选择。百度行业分类共分两级,与“1、行政区选择功能”相似,需要制作成属性选择菜单,构建自定义转换器(11)。
通过上述的分析,构建这个转换器需要15个参数,10个自定义转换器。需要构建的大部分自定义转换器在以前的记录中有过记录,为了保证整个转换器记录的完整性,接下来几遍记录将再次详细的记录各个自定义转换器模板的编制,模板调试。模板的编制记录中有的会对不同方案进行简单的分析,以及一些转换器/函数进行比较或介绍。