前言:在此方法前尝试过java代码用geotools转换,发现这种方法实现的是将shape文件转换成sql文件,新增数据时候地图存的数据串超过4000报字符串太长,后面使用拼接方式和存储过程又爆出拼接字符串太长所以不得已转战shp2sdo。
1.首先你得有shp2sdo去百度下下载即可,资源后面贴出,正在审核。
2.解压打开文件夹目录如下,我是用的shp2sdo_nt下的文件,将其放到自己需要用的地方
4.win+R输入cmd 到达对应文件夹
5.执行命令生成对应创建表语句文件(.sql)和数据插入文件(.ctl)
①shp2sdo C:\Users\HP\Desktop\我是测试文件 shp_t1 -i id -g geom -s 4326 -d
②shp2sdo 调用的exe文件名固定格式
③C:\Users\HP\Desktop\我是测试文件文件路径(记住不要带后缀,还有文件要齐全,像我这边就有.dbf,.prj,.shp等文件)
④shp_t1需要创建的表名
⑤-i 设定id列
⑥id id列字段(记住图层中没有的,我这边图层中就有已经有id字段导致重名无法导入)
⑦-g 设定存储地理位置
⑧geom 设定存储地理位置的字段(同不能重复)
⑨-s 设置地理坐标系
⑩4326 地理坐标系值(我这边都是4326的)
⑩-d代表含义是将分解后的 ctl文件(控制文件)和data文件(数据存储文件)分别生成,否则不会有单独的data文件生成,数据存储和控制都在ctl一个文件。
6.运行完生成这样的一些文件,log和bad是生成日志,真正有用的是sql和ctl。
7.创建表:方法1:plsql或navicat直接执行创建语句部分(记得删掉drop table xxx部分不然报错)
方法2:通过cmd 连接对应数据库执行sql,c##linzuo是我用户名 123456是密码
2.1 sqlplus c##linzuo/123456@localhost:1521/orcl;
2.2@F:\shp2do\shp_t1.sql;
执行sql文件即可创建表注意这里有可能出现字段问题,因为图层中的数据字段有可能是中文导致乱码之类的建议在sql和ctl文件中全文替换对应字段可以修正,还有数据导入阶段我还出现数据缺失问题后发现是字段长度不够,在这里提出。
8.新增数据
8.1sqlldr c##linzuo/123456@localhost:1521/orcl
8.2control=F:\shp2do\shp_t1.ctl
8.3查看数据是否和原先数目一致,像我这边就有一半数据没有入库,后面通过输出日志发现是字段长度不够输出日志方法如下,会在对应文件夹下输出bad.text:输入失败的数据;resulthis.out:失败的原因;
sqlldr c##linzuo/123456@localhost:1521/orcl log=resulthis.out bad=bad.txt
9.查询数据,我这边是要判断点位是否在某个面内如果在面内返回这个面的数据
SELECT *
FROM SHP_T1 A
WHERE SDO_GEOM.RELATE(A.GEOM, 'ANYINTERACT', MDSYS.SDO_GEOMETRY(2001,4326,SDO_POINT_TYPE(119.897728,26.62588,NULL),NULL,NULL),1 )='TRUE'
这时候出现问题维数超出范围,去网上查了是面太小之类的,通过cmd sqlplus运行
EXECUTE SDO_MIGRATE.TO_CURRENT('SHP_T1','GEOM');
参数1是表名,参数2是字段名。
10.创建索引(别人都用就上一个呗,不过加了不知道为什么查询还是要三秒)
create index shp_index1556 on shp_t1(geom)indextype is mdsys.spatial_index;
11.扩展
使用mubatis+druid查询会出现
java.sql.SQLException: sql injection violation, deny object : sdo_geom
经查询可能是druid产生的问题,但是改了配置文件并没有啥用
只能将将方法变成一个函数了
create or replace function inShape(geom in MDSYS.SDO_GEOMETRY,lon in number,lat in number)
return varchar2
as
begin
return MDSYS.SDO_GEOM.RELATE(geom, 'ANYINTERACT', MDSYS.SDO_GEOMETRY(2001,4326,SDO_POINT_TYPE(lon,lat,NULL),NULL,NULL),1 );
end inShape;