使用geotools时的若干注意点

geotools 是开源的gis java库。详见官网:http://geotools.org/。本次使用geotools要实现的功能是将shp文件里的要素批量导入到基于oracle数据库的arcgis(10.4) sde的空间数据库里。具体的操作官网上有详细的文档,这边不再介绍。下面主要说自己碰到的容易出错的地方。

1.arcgis 和oracle数据库的连接在10.x之后是通过arcsde插件以直连的方式进行的,arcsde模块已经集成到server里面,不再是一个单独安装的插件(10.x之前好像是单独一个安装包,没用10.x之前的版本所以不太清楚)。也不再提供通过sde访问oracle的接口。对于这个问题,因为geotools官网中提供了一个叫arcsde的插件,乍看这个插件挺好的,可以直接通过这个插件来操作sde里面的数据,不需要直接操作oracle数据库了,其实不然,从这个插件链接到arcgis官网的arcsde的帮助可以看到版本还是9.x的。一看版本那么旧,能行吗?抱着试一试的态度折腾了一上午,最后证明果然版本太旧不行了,也就是上面说的,10.x以后不再提供arcsde服务来让你通过arcsde来操作数据库了。所以如果是用10.x的arcsde数据库的话,不要用这个插件。

2.arcsde 和oracle数据库中的空间数据类型是不同的,arcsde中是st_geometry,而oracle中是sdo_geometry。这两者是有区别的,具体区别可以直接在网上搜,这边不累述。幸好arcsde支持这2种格式,但因为通过arcgis desktop 创建的表格空间数据类型默认是st_geometry,而geotools中的oracle插件只支持oracle中的空间数据类型即sdo_geometry,所以造成的问题是只能从数据库里面读不能写入(至于为什么能读不太清楚,至少是能读出属性字段)。这个问题的解决办法就是在desktop里面创建FeatureClass(也就是表)的时候空间数据类型要选择sdo_geometry类型(默认是st_gemoetry),否则的话不会报错,但有warning 提示因为某些原因表变成只读,无法插入。这个问题也是当初折腾了好久,调试进源码里面发现geotools的oracle插件里面是没有st_geometry这个类型的。

3.数据库里面有个叫schema(模式)的东西,不要把他和数据库实例,或者表空间混起来。具体他是什么也可以直接网上搜,这边不再说了。当用geotools的oracle插件连接数据库时有个参数叫schema,这边设置要注意,如果你的数据库没有特别的创建schema 那么把他设置成跟用户名一样,他默认跟用户名一样。数据库里面一般都是默认的,除非你手动创建了schema。如果连接时不设置或者设置错误都无法通过getfeaturesource等获取你想要的表,而且不报错。不报错,能连上,至于连上的是哪个schema就不知道了,可能是数据库默认的schema.所以里面没有你的表格。就是下面这个东西

params.put( "schema", "sde");

特别是不要把他当成是表空间 而里面的每张表又有对应的schema,所以也不要和表里面的schema混起来。

4.要素插入到数据库,看到网上很多把要素转成text然后再通过oracle的自带的接口用sql语句的方式插入,这种方法在要素很大的时候可能会出错,比如一个多边形有几千个点时,你的sql拼起来就很长,也容易出错。建议还是通过插件自带的事务插入,这样既方便又不容易出错,代码如下:

SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource;
Transaction session = new DefaultTransaction("Adding");
featureStore.setTransaction( session );
try {
     java.util.List<FeatureId> added = featureStore.addFeatures( features );
//features,要插入的要素数组
     System.out.println( "Added "+added );
       session.commit();
     }catch (Throwable t){
       System.out.println( "Failed to add features: "+t );
       session.rollback();
}

 

转载自:https://blog.csdn.net/lh1162810317/article/details/84585866

You may also like...