0

验证折线图层时出现 13356 错误。我知道我可以用它SDO_UTIL.REMOVE_DUPLICATE_VERTICES来解决这个问题,但我将如何编写这个折线层的语法?

+----------------------+----------------------------------------+
|     SDO_ROWID        |                STATUS                  |  
+----------------------+----------------------------------------+
|         (null)       |  Rows Processed <4035>                 |   
| AAA2EVAANAAB8ccAAJ   |  13356 [Element <1>] [Coordinate <3>]  |   
| AAA2EVAANAAB8cvAAK   |  13356 [Element <1>] [Coordinate <5>]  |    
| AAA2EVAANAAB8cwAAD   |  13356 [Element <1>] [Coordinate <4>]  |   
| AAA2EVAANAAB8dBAAJ   |  13356 [Element <1>] [Coordinate <1>]  |  
| AAA2EVAANAAB8dBAAO   |  13356 [Element <1>] [Coordinate <4>]  |   
| AAA2EVAANAAB8d/AAP   |  13356 [Element <1>] [Coordinate <3>]  |  
+----------------------+----------------------------------------+

我可以写一个如下的语法:

update my_geometries
set geometry = sdo_util.remove_duplicate_vertices(geometry)
where rowid in (
  select sdo_rowid 
  from GEOM_VALID_COLLECTORS   --table that was created to store results
  where substr(status,1,5) = '13356'
);

然后再次迁移到当前的重新验证:

--migrate to current
EXECUTE SDO_MIGRATE.TO_CURRENT('OTTAWACOLLECTORS', 'GEOMETRY', 4035);   

--validate layer
CREATE TABLE Geom_Valid_Collectors (SDO_ROWID ROWID, STATUS VARCHAR2(2000) );                       --some error, go back because I did this with the buildings accidentally
EXECUTE MDSYS.SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT ('OTTAWACOLLECTORS', 'GEOMETRY', 'Geom_Valid_Collectors'); 
SELECT * FROM Geom_Valid_Collectors;
4

1 回答 1

1

点图层中的重复点是不可能的。还是那些多点?

此外,一个点被视为另一个点的副本这一事实意味着该点和随后的点比您在调用验证函数时指定的容差更接近。如果您以 0.5 的容差进行验证,则意味着没有两个连续点必须接近 50 厘米。错误消息的确切含义是:

ORA-13356: adjacent points in a geometry are redundant

以不同的容差进行验证将检测到不同的错误。因此,以您期望的数据容差进行验证非常重要。

当然,当两个连续点完全相同时,也会被诊断为重复。

考虑到这一点,您可以通过执行以下操作从几何图形中删除那些“重复”点:

update ottawacollectors
set geometry = sdo_util.remove_duplicate_vertices(geometry, 0.05)
where rowid in (
  select sdo_rowid 
  from geom_valid_collectors
  where substr(status,1,5) = '13356
);

(我使用了 0.05 = 5cm 的容差。将其替换为数据的实际容差,正如您在元数据中指定的那样)。

请注意,每个形状可能在不同位置包含多个重复点。验证只报告第一个。形状也可能包含其他错误:验证在第一个错误时停止。因此,删除重复项后,您需要重新验证。

您不需要sdo_migrate.to_current. 这是一个旧功能,仅在很久以前的 8i 时间范围内使用。它有时仍用于纠正方向错误。

于 2015-06-08T07:59:33.800 回答