本文章参考https://www.cnblogs.com/naaoveGIS/p/4199006.html
一、准备工作:
软件准备:
1、oracle(安装的时候选择支持OracleSpatial);
2、geoserver;
3、shp2sdo;
4、geoserver的Oracle插件(与geoserver版本一致)。
环境准备:
1、将shp2sdo压缩包解压,把shp2sdo_nt文件夹下的shp2sdo.exe拷贝至Oracle环境变量所指的目录下,方便后续直接调用shp2sdo命令;
2、将geoserver-xx-oracle-plugin.zip包解压后,gt2-oracle jar 放到 [GEOSERVER_HOME]/server/geoserver/WEB-INF/lib/目录下, ojdbc14.jar放到[GEOSERVER_HOME]/lib目录下;
二、shp导入oracle步骤:
1、使用shp2sdo将shp转换为导入文件
①进入到要导入的shp文件目录下,执行 shp2sdo shp名 生成的表名 –i id –s 指定生成的epsgCode –g GEOMETRY –d,如图;
②查看在shp文件夹下生成*.ctl和*.sql两个文件,其中*.sql是一个与shp相关空间元数据的文件,而*.ct为插入的数据;
参数含义:
-i id_colum指定id序列列,默认是id,即作为生成数据的唯一性标志;
-s 指定生成srid(即采用什么坐标),默认是null(虽默认为null,导入后值是0,因此要注意将插入的元数据表的该条记录的srid更新为null,否则0值在MDSYS.CS_SRS表中没有记录,在后面会出错);
-g geometry column指定sdo_geometry,默认是GEOM;
-d 代表含义是将分解后的 ctl文件(控制文件)和data文件(数据存储文件)合并到一个文件,数据存储和控制都在ctl一个文件中。如果没有该选项,则会有单独的data文件生成,即ctl文件(控制文件)和data文件(数据存储文件);
2、创建对应shp表并注册到USER_SDO_GEOM_METADATA(利用*.sql文件)
①登录数据库,sqlplus 用户名/密码@实例名;
②输入“@*.sql文件的路径”创建表并注册到USER_SDO_GEOM_METADATA,如图:
3、通过sqlldr将数据导入到创建的表中(利用*ctl)
①退出数据库:exit;
②进入到shp文件所在的目录,执行“sqlldr 用户名/密码@实例名 表名”命令导入数据
4、将数据升级到与oracle对应的版本上
①登录数据库;
②输入execute sdo_migrate.to_current('表名');
5、给表添加空间索引,没有空间索引在geoserver中无法显示:
CREATE INDEX INDEX_landusetest_SPATIAL ON landusetest(GEOMETRY) INDEXTYPE IS MDSYS.SPATIAL_INDEX PARAMETERS('LAYER_GTYPE=POLYGON') NOPARALLEL
出现上图现象,登录plsql,连接对应的数据库,查询该表的信息:select * from 表名,发现srid并未全部变为4326
解决:将srid为1的行全部删除掉,我是在ArcMap中只选取了少许表中srid显示为4326的要素,然后重新执行上面的步骤,导入成功
附:可查询表的空间索引,DOMIDX_OPSTATUS为FAILED,则说明创建空间索引失败。
三、geoserver发布oracleSpatial数据
1、登录geoserver,新建Oracle数据源的存储:
2、输入oracle数据库的链接信息:
3、从oracle数据源中选择导入的表,新建图层并发布:
4、要选择计算数据集的bounds:
5、浏览地图: