我使用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
答案 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;