为什么要同步oracle空间数据到postgresql?(1)公司之前的所有空间数据都是存储到oracle数据库中,大家都知道oracle数据库费用很高,(2)项目处于前期阶段,空间数据内容还不太确定,在后期需要重新编辑;(3)最终数据会用skyline SFS发布出来,在前端加载。(4)趁机会学习点新的东西。
下面来说说postgresql空间扩展与kettle spoon同步oracle空间数据到postgresql。
至于kettle spoon、postgresql、postGIS的安装不作记录,只是新手需要注意的是postgresql空间扩展安装是有顺序的。需要安装的空间扩展与顺序如下:
CREATE EXTENSION postgis;
CREATE EXTENSION pgrouting;
CREATE EXTENSION postgis_topology;
CREATE EXTENSION fuzzystrmatch;
CREATE EXTENSION postgis_tiger_geocoder;
CREATE EXTENSION address_standardizer;
或在PG里按上面的顺序添加,如下图:
创建空间数据表最快的方法是从oracle中把相应的表结构导出来,打开文本复制到postgresql中,替换一下字段类型,添加一个geom空间字段。需要注意的是,geom 数据类型。在创建该字段时,可以:
1、geom geometry;
2、geom geometry(Point);
3、geom geometry(Point,4326);
4、geom geometry(PointZM);
第三个包含了空间参考,如果用这个类型,在后面数据同步的脚本中,也是需填写要这个4326参数的,导致Point与4326之间有一个逗号,在拼接字符串时,不知道如何拼接逗号,出了很多问题,所以我干脆用了geom geometry(Point),只是没有了空间参考。
由于postgresql与oracle数据库中的空间字段类型并不一样,所以是不能直同步过来的。最初的想法是,在oracle数据库中新建两个字段,用来存放点的x,y坐标,在同步到postgresql后,利用postgis函数创建适合postgresql点空间字段的值。主要流程如下:
1、kettle spoon创建转换
主要目的是把oracle数据库中点的属性数据同步到postgresql中。
先新建一个转换,添加表输入,即添加oracle数据库中需要同步的表和需要同步的字段。如下图:
双击上面图标进行表输入编辑,如下图:
再从输出中拖入 插入/更新,并与表输入建立连接,按住shift拖动鼠标从表输入到插入/更新,编辑插入/更新,保存转换。如下图:
最终结果如下图:
2、另新建一个转换,用于空间数据计算并更新脚本,主要目的是在空间数据表中,按geom geometry(Point)数据类型存入相应的值。本来是打算把这个脚本放与第一步放一起,不知道什么原因,连接之后,脚本执行成功,但是数据表中没有任何更新,所以把脚本单独放到一个转换中。
从脚本中拖入执行SQL脚本,并编辑参数,并保存转换文件,SQL脚本最好是先在pg里执行测试一下,成功之后再拷贝过来。我的Sql脚本内容为:
UPDATE tablename SET geom=( ST_GeomFromText( (select 'POINT('||CAST(longitude AS CHAR(12))||' '||CAST(latitude AS CHAR(12))||')' FROM tablename q where tablename.objectid=q.objectid ORDER BY objectid LIMIT 1))),其中longitude字段为X坐标字段,latitude为Y坐标字段
设置如下图:
需要注意的是里面有个”执行每一行?“复选框。按照我的理解应该是要勾上,结果不是这样。
3、从文件中新建作业,从通用中拖入start和两个转换控件,编辑start,可以设置作业的执行参数,如下图:
编辑第转换,如下图:
最终结果如下图: