首先介绍背景,公司用的Java后台,oracle数据库,gis服务用的是ARCgis,公司项目前期,给S省中的两市部署并应用过
,通过多年表现出色,服务令客户满意,后来全省也要使用这个系统,然后全省使用这个系统一两个月之后,两个市想将
自己的前两年的数据导入省库,这是就有很多头疼的问题:
一,由于公司各类资源的ID使用的是oracle序列,所以所以,你懂得,其他两个库的数据的id导入进来肯定会出现和
省库id重复的冲突!
二,由于不仅仅是普通表,还有各种图层要素表,所以不能使用oracle,最好使用arccatalog进行数据迁移。
三,要导入的时候发现有一张已经注册为图层的要素表居然在catalog里面显示为普通表(原因还不明确,
在a市系统正常使用,该类资源图层空间信息正常,只是要迁移数据时发现表的图标类型为普通表,而不是
要素表)。迁移过来后会发现shape字段丢失。
下面开始填坑:
由于id使用的是序列,但是发现存储这个字段的类型是varchar2,真是不幸中·的万幸,想了个办法就是在两个市库
要入库数据的id前拼接上一个字母,这样就可以避免id重复的问题,当然这个过程很繁琐,你懂得各表之间各种引用
,都需要刷一便。而且很容易出错,导致数据关联性失效,
所以建议就是能用uuid,guid等等的就别用序列,不然id太容易重复了。
用arccatalog迁移数据就不多说了,在市库导出表至自己建的地理数据库,方便管理,然后关闭catalog才能复制该gdb文件夹
不然会出现未知错误,将该gdb文件夹在省库catalog打开,相应的表加载数据,避免objectid重复。
第三个问题应该不常见,至于为什么会把要素表识别为普通表的图标,但是系统还正常使用,没找到原因资料,只有自己想
办法解决,好在这个表是个点图层的表只需要知道他的投影x,y,即shape.minx,shape.miny,就可以利用
sde.st_geometry('point ('|| x||' '|| y|| ')',sid)就可以重新生成空间信息,
想到这个思路,在市库该表字段上新建两个字段,project_x,project_y并分别
将shape.minx , shape.miny 的值赋予这两个字段,然后省库也的加这两个字段,
然后通过catalog加载数据进省库,然后
update 表名 g set g.shape=sde.st_geometry('point ('||project_x||' '||
project_y|| ')',sid) where g.shape.minx is null;
至此数据丢失的空间信息恢复,至于线和面的数据没出现这种错误所以没处理,但是如果出现这种问题
方法应该和这个类似,只是更复杂一点。同样利用sde.st_geometry()方法重新赋值空间信息。
同时还有个很重要的事,就是记住数据迁移入库前对各表都加一个字段用来区分数据来源,
以便入库后区分同一张表里面的数据是那个库来的,方便操作。例如该字段为s的就是s市迁移过来的数据,
有y的就是y市去迁移过来的,为空的就是省库本来就存在的。其实自己刚开始想的是用各表本来就有regionID来区分,
后来发现想到很不方便,首先区域得用in遍历子区域效率极低。其次如果省库同样存在正常录入的其他市的数据呢,
那根据区域id操作迁移数据就会影响到不是迁移过来的同区域数据。
最后最后最后,最重要的一点就是别忘了提前备份!