如何更新通过FME Workbench导入的Oracle中图层的元数据?

时间:2015-06-08 23:43:12

标签: oracle oracle-spatial

我使用FME Workbench将ESRI要素类导入Oracle。我通过FME导入时使用了原始的ESRI SRID。既然该表在Oracle中,我想更改元数据和SRID以匹配Oracle。首先我使用了以下代码,但它给了我一个错误,因为OTTAWAPROVRDS中已经USER_SDO_GEOM_METADATA(我猜它是通过FME导入时自动添加的)

INSERT INTO USER_SDO_GEOM_METADATA 
(TABLE_NAME, COLUMN_NAME, DIMINFO, SRID) 
VALUES 
('OTTAWAPROVRDS', 'GEOM',
 MDSYS.SDO_DIM_ARRAY 
 ( MDSYS.SDO_DIM_ELEMENT('X', -180, 180, 0.5), 
 MDSYS.SDO_DIM_ELEMENT('Y', -90, 90, 0.5) 
 ), 
 8307
);

然后我使用以下代码更改SRID

UPDATE USER_SDO_GEOM_METADATA a
SET a.SRID = 8307
WHERE a.TABLE_NAME = 'OTTAWAPROVRDS';

哪个有效但当我尝试迁移到当前时出现以下错误:

Error report -
ORA-29877: failed in the execution of the ODCIINDEXUPDATE routine
ORA-13365: layer SRID does not match geometry SRID
ORA-06512: at "MDSYS.SDO_MIGRATE", line 423
ORA-06512: at "MDSYS.SDO_MIGRATE", line 474
ORA-06512: at line 1
29877. 00000 -  "failed in the execution of the ODCIINDEXUPDATE routine"
*Cause:    Failed to successfully execute the ODCIIndexUpdate routine.
*Action:   Check to see if the routine has been coded correctly.

这让我相信只更新SRID不起作用,我必须更新整个元数据。我试过这段代码:

UPDATE USER_SDO_GEOM_METADATA
SET DIMINFO =  MDSYS.SDO_DIM_ARRAY 
 ( MDSYS.SDO_DIM_ELEMENT('X', -180, 180, 0.5), 
 MDSYS.SDO_DIM_ELEMENT('Y', -90, 90, 0.5) 
 ),
 SRID = 8307
WHERE COLUMN_NAME = 'OTTAWAPROVRDS';

但结果是0 rows updated

1 个答案:

答案 0 :(得分:1)

FME确实自动为您的表格插入了正确的元数据。我认为没有理由改变这一点。

除非,如果我告诉你,你真正想做的是将你加载的数据转换成SRID 8307,即long / lat WGS84。那是对的吗 ?什么是当前的SRID?

要将表格转换为新的坐标系,您需要执行以下操作:

1)删除现有的空间索引

drop index <your index name>;

2)使用SDO_CS_TRANSFORM()函数更新所有几何,如下所示:

update ottawaprovrds
set geom = sdo_cs.transform (geom, 4326);
commit;

注意我使用4326(EPSG代码)而不是8307,Oracle / OGC代码,因为它是“更标准”,即几乎所有GIS工具包都能直接理解。

3)更新元数据:

UPDATE USER_SDO_GEOM_METADATA SET
DIMINFO = SDO_DIM_ARRAY (
  SDO_DIM_ELEMENT('Long', -180, 180, 0.5), 
  SDO_DIM_ELEMENT('Lat', -90, 90, 0.5) 
),
SRID = 4326
WHERE TABLE_NAME = 'OTTAWAPROVRDS';
commit;

注意:选择器适用于 TABLE_NAME 而不是 COLUMN_NAME

4)重新创建空间索引

create index <your index name> on ottawaprovrds (geom)
indextype is mdsys.spatial_indextype;