最近要做一个地图相关的项目,用oracle作为数据源,以前都是postgresql,没用过oracle呀。上网一查,geoserver好像支持oracle。网上也有一些怎么讲shp转换到oracle的教程。按着教程一步步来,最后还是出现了一些问题,研究了半天终于发布成功,于是想把这次发布过程记录下来,顺便也能帮助有需要的同学。(当然本地先装好oracle哦)
第一步:下载geoserver和oracle插件
到官网下载最新版
我选的是web archive,就是war包,war包直接放到tomcat的webapp里面,就可以直接发布了,非常方便。在这个页面往下拉找到Extensions,扩展。
选oracle,可以看到还有对别的数据库的扩展,非常强大。
第二步:安装插件
把下载好的war包在tomcat中发布一次(要是不会发布的话,建议先去学学Orz),发布一次是为了让tomcat解压geoserver,手动解压貌似也可以。把下载的geoserver-oracle-plugin.zip解压,将里面的gt-jdbc-oracle-X.X.jar包复制到geoserver目录下web-info/lib目录中,然后再把与你数据库匹配的ojdbc驱动包也复制到这个目录里,我用的oracle10g,在oracle目录product/10.x.x/db_1/jdbc/lib里可以找到ojdbc14.jar。如果不复制ojdbc驱动,在选择数据源的时候会没有oracle-database-ng这个选项。复制完成后启动geoserver,在数据存储页面,添加新的数据存储:
看到图中的oracle ng就说明我们安装成功了。
第三步:为oracle安装空间组件,Oracle_Spatial
这一步,我找到一篇文章,按照其中介绍安装了Oracle_Spatial,很简单,没有遇到什么坑,我就不重复介绍了。文章链接。
第四步:下载工具shp2sdo
这个工具我在csdn上下载的,下载链接。下载后里面有三个版本,分别是linux,nt,sparc_solaris。
我是windows系统所以用了nt文件夹里面的shp2sdo.exe
第五步:将shp文件转换为oracle脚本
终于进入正题了,在这一步我们要把需要发布的shp文件转换成.sql文件和.ctl
文件,我先把shp2sdp.exe和我要转换的图层都复制到了一个文件夹里,这样写命令的时候比较方便。
好了,现在打开一个cmd命令行工具,先进入到这个目录
D:\oracle\oracle_gis\beisanshi就是我的目录啦。
输入命令 :
shp2sdo [shp文件名] [表名] -i id -s [坐标系编码] -g MY_GEOMETRY -d
-i 是设置主键,-g 是给空间数据字段起个名字,不写默认是geom,-d 是把dat数据文件合并到ctl文件里。
-s 是数据库编码。
这里就要注意拉,我踩的第一个坑就是这个坐标系编码,一开始看网上的一些资料说直接填4326,我就无脑填了,结果最后发布后怎么看不到图层。所以这里要按照自己shp文件的坐标系编码填写。如果你不知道你的shp文件的坐标系编码怎么办呢?没关系,我当时也不知道自己的shp文件坐标系编码,于是乎,我先在geoserver中发布了这个shp文件,在发布页面geoserver会帮我们识别出图层的坐标系,如下图
上面可以看到,本机srs是unknown说明geoserver的数据库中没有跟这个坐标系匹配的编码,但是后面我们可以看到坐标系的名字是 Xian_1980_3_Degree_GK_Zone_41,搜索一下这个坐标系,发现它的编码是2365,于是在上面的页面点击查找,搜索2365这个编码:
发现果然有这个坐标系,只是名字跟刚才那个有点区别,但都是xian 1980 3 degree,应该差不多,于是我的转换命令就写成了这样:
D:\oracle\oracle_gis\beisanshi\shp2sdo zh zhuang -s 2365 -d
执行成后是这样的:
这是我们的文件夹里生成了两个文件:zhuang.sql,zhuang.ctl,分别是建表脚本和数据脚本。好,到这里我们的第五步就完成了,胜利就在眼前!
第六步:执行脚本建表并导入数据
首先打开sqlplus,输入命令 @.../xxx.sql,就是@+我们生成的sql文件的全路径,我这里是
@D:\oracle\oracle_gis\beisanshi\zhuang.sql
这时对应shp文件的表就建好了:
然后在命令行中输入SQLLDR 用户名/密码 CONTROL=...\XXX.ctl就可以把数据恢复到表中,
我输入的命令是:SQLLDR 用户名/密码 CONTROL=D:\oracle\oracle_gis\beisanshi\zhuang.ctl
如果数据很多会执行一会,完成后是这样的:
这是去数据库里看一下数据:
可以看到已经都在数据库里了。但是现在的数据还需要转换到与当前数据库版本匹配,在sqlplus中执行命令:
EXECUTE SDO_MIGRATE.TO_CURRENT('表名');
我这里就是:EXECUTE SDO_MIGRATE.TO_CURRENT('zhuang');
等待一会,提示完成。
如果不执行这个步骤:发布后点击地图geoserver会报错:Rendering process failed/ by zero
接下来,我们需要为空间字段建立索引,由于转换的时候我没有填-g选项所以表的空间字段名是geom,
create index zhuang_index on zhuang(geom) indextype is mdsys.spatial_indes;
等待索引创建,我们数据库操作就结束啦,现在就剩下最后一步,发布!
第七步:发布图层
运行geoserver,新建数据源oracle ng:
划红线的是自己要填的东西,其他没有特殊要求保持默认就好了,填完拉到最下面点保存,之后会直接跳到发布图层的页面:
会出现一大堆可以发布的图层,我们直接在右上角搜索我们自己的表名 zhuang。
然后点发布按钮,进入发布图层配置页面:
直接拉到下面设置坐标系这里,第一个是自动识别的2386,我们转换的时候设置的坐标系,第二个我们也选2365。
选好之后,点击从数据中计算,可以算出边框,在点击下面的compute from native bounds,计算出经纬度边框:
计算完之后,把页面拉到最上面点 发布 选项卡:
拉到wms settings的位置,设置一下style:
我的图层块状的所以选择polygon,多边形。
好了,别的都不用管了,拉到最下面直接点保存。完成!
最后一步:查看!
点geoserver页面左侧的Layer Preview,点击我们刚发布的图层查看效果:
好了,到此为止大功告成,还有什么问题,欢迎大家交流~~
版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!