美文网首页Kettle
借助kettle(PDI)的POST功能同步POI到arcgis

借助kettle(PDI)的POST功能同步POI到arcgis

作者: marksman_e902 | 来源:发表于2018-09-13 16:16 被阅读0次

    零,应用场景

    刚刚接触arcgis不久,最近有需求增量同步其他数据库的地理数据到arcgis server 使用的sql server数据库中,升级为Geodatabase的sqlserver数据库不方便直接往数据表中更新数据,更新数据只能通过其预制的存储过程(猜想),提供的feature access接口,或者重新发布更新后的要素,要从其他数据库自动同步数据到已经发布的图层,本文介绍一种kettle+feature access的方案。

    为什么用kettle呢?1. 快,接触水壶两天就走通技术路线了;2.能够Post;3.水壶好像很受欢迎。

    feature access提供的rest api有增删查改操作,怎么发布feature access服务这里就不再描述,可以参考arcgis文档。

    feature access REST接口

    增量同步数据的具体需求尚不明确,但无非是:1,只更新,2,只新增,3,更新又新增,4,增删改,这个以后再深入探讨,本文主要讨论通过kettle的post请求功能来进行要素的同步。

    本文将从kettle小白的角度实现一个简单的技术demo,有待完善的地方欢迎一起研究。

    一,kettle安装

    kettle是一款不错的ETL工具,可以省下写原生代码进行ETL的功夫。

    首先下载kettle,下载页在这里:下载页,找到Downloads下载即可。

    下载页

    下载完毕,解压压缩包,双击运行Spoon.bat就可进入kettle的可视化操作界面,忘了说了,要想使用kettle得先准备好java环境,本人使用的是64位jdk1.8.1,如果启动过程出现问题可以使用SpoonDebug.bat进行启动,然后检查SpoonDebug.txt进行排错。

    调试工具

    二,数据库连接和表输入

    进入勺子(Spoon.bat),新建一个“转换(transformation)”任务,这个“转换”就负责执行我们同步数据的具体流程。新建“表输入”,在“编辑”中设置好数据库连接(这里以mysql为例),

    数据库连接

    设置好数据库字符集,不设置字符集可能导致乱码,

    设置字符集

    点击“获取SQL查询语句”选择需要导入的表和选择需要同步的字段,在增量更新的应用场景中需要在SQL中限制数据的更新日期或创建日期,并使用kettle记录最近一次同步的日期,这个以后再讨论。这里可以限制从表导入的数据的行数。

    数据选择

    三,POST请求参数的封装

    在“转换”中新建一个JavaScript脚本,然后按住Shift从刚刚建立的“表输入”中拖拉一个箭头指向JS脚本,这个箭头将表输入的数据传输给JS脚本,一行一行地传输的,因此在JS脚本中是一行一行地处理的(有多行同时处理的方法吗?)。

    JS脚本建设

    通过这个JS脚本完成下一步POST请求的参数的封装,这里需要查看一下Feature Access接口的API Reference,在熟悉Kettle之前建议先使用Postman确认接口参数的正确性。本文以新增要素(Add Features)功能作为示范,这个接口是可以同时更新多个要素的,但是由于JS脚本是一条一条处理数据的(由于懒),本文示范一条一条地POST。在这里我们拼装features(待更新要素),f(返回值格式),rollbackOnFailure(失败后回滚)三个参数。其中features参数的拼装最为麻烦,需要将数据放入json,然后再调用JSON.stringify(str);。

    API REFRENCE

    KETTLE中JS脚本的流程是输入一行数据,经过一番处理后指定输出的字段,JS脚本将指定的字段通过箭头输出到下一步操作。左侧红框内是上一步输入到该步的数据,可以在脚本中直接操作,下面红框是指定的输出字段,这些字段将输出到下一步作为参数。我们也将POST请求的URL和Header在这里生成。“获取变量”按钮可以自动从代码中指定输出字段,同时还可以自动检查语法错误。

    JS脚本


    四,每一条记录POST的设置

    加入一个“Http Post”任务,或者“Rest Client”也可以,从上一步拉出箭头来接上。

    Post参数传递

    从上一步输入的字段中选择好请求地址,设置好字符集,在Output fields里面指定该步骤输出字段的名称,后面日志输出要用。

    General设置

    点击进入Fields,设置好请求的参数,设置好Header参数。注意请求的参数名要和Feature Access中参数名对应哦。

    POST参数的Mapping

    五,POST结果当做日志输出

    新建“文本文件输出”,从上一步输入“result”字段作为日志内容。

    更新日志的输出

    选择好存放的文件夹,扩展名,本案例中其他参数使用默认就行了。

    文本输出

    在“字段”中选择输出到日志中的字段,该文本将会累计所有的行的日志并将它们一口气输出为一个文件。调试过程中日志的打印尤其关键。

    字段输出


    六,测试结果

    完成,调试一条数据,成功运行!是不是很方便呢,比徒手写原生代码同步快多了。

    总体过程

    测试1000条数据,耗时16.4秒。这个案例每一条数据post一次,在生产环境中可以积累所有的数据post一次完成。

    运行记录

    数据源字段如图,来源百度地图POI。

    数据源

    更新结果可以马上在arcgis server 中查看。

    效果

    七,OVERVIEW

    乱码问题:

    在调试中遇到数据提交到sqlserver乱码的情况,最后检查为Arcgis Server内置Tomcat配置的问题,折腾了半天加上一段配置解决问题。

    Tomcat配置

    重复并作为本地程序运行:

    作为本地程序(或服务)更轻便,更方便启停。

    在勺子中建立一个job,job中调用刚刚创建的转换,在START设置循环时间:

    循环时间

    同步前检查网络状况,同步结束后将日志发送到邮箱内。

    检查网络,发送邮件

    新建一个批处理程序(.bat),编辑内容如下(根据实际情况修改盘符和kitchen.bat所在位置):

    d:

                    cd D:\data-integration

          kitchen /file:D:\data-integration\samples\jobs\firstjob.kjb

    也可以通过命令行运行该job: 

    参考文献

    总结:

    第一次写技术文章,刚刚上手kettle两天还不知道怎么一次处理多行数据,后面会继续记录使用kettle进行增量同步的过程。

    相关文章

      网友评论

        本文标题:借助kettle(PDI)的POST功能同步POI到arcgis

        本文链接:https://www.haomeiwen.com/subject/dlmvgftx.html