13349 Многоугольник геометрии ошибки Oracle пересекает сам себя

У меня есть таблица в Oracle, в которой хранятся данные для полигонального слоя. я подтвердил это

--validate layer
CREATE TABLE Geom_Valid_Neighbour (SDO_ROWID ROWID, STATUS VARCHAR2(2000) );   
EXECUTE MDSYS.SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT ('OTTAWANEIGHBOUR', 'GEOMETRY', 'Geom_Valid_Neighbour'); 
SELECT * FROM Geom_Valid_Neighbour;

и получил следующие ошибки:

+----------------------+----------------------------------------------------------+
|     SDO_ROWID        |                STATUS                                    |  
+----------------------+----------------------------------------------------------+
|         (null)       |  Rows Processed <50>                                     |   
| AAA2EHAANAAB76nAAA   |  13349 [Element <1>] [Ring <1>][Edge <112>][Edge <109>]  |   
| AAA2EHAANAAB76rAAC   |  13349 [Element <1>] [Ring <1>][Edge <51>][Edge <55>]    |    
+----------------------+----------------------------------------------------------+

Какую функцию можно использовать для исправления геометрии этого полигонального слоя и как ее использовать?


person Toronto23    schedule 08.06.2015    source источник


Ответы (1)


Как правило, выполнение самообъединения или самопересечения исправляет такие ошибки: вызовите SDO_GEOM.SDO_UNION(GEOMETRY,GEOMETRY,0.05) для обновления формы (при условии, что ваш допуск действительно равен 0,05).

НО: на самом деле это может просто скрыть ошибку. Код ошибки возвращается, когда граница полигона пересекает саму себя, т.е. она была неправильно оцифрована. Описанная выше операция просто скрывает ошибку (= многоугольник больше не диагностируется как неправильный), но не изменяет визуальную форму.

Поэтому я советую визуально посмотреть на эти две фигуры и увидеть, в чем заключается фактическая ошибка.

Ошибка также может возникнуть, если многоугольник просто касается самого себя = его граница удваивается и касается себя где-то еще — например, в форме полумесяца, где два конца касаются друг друга. Такую форму можно безопасно исправить описанным выше способом: она превратится в многоугольник с отверстием там, где отверстие касается внешнего кольца.

Вы также можете взглянуть на функцию SDO_UTIL.RECTIFY_GEOMETRY(). Он пытается исправить три наиболее распространенные геометрические ошибки:

  • Повторяющиеся точки
  • Неправильная ориентация (полигоны)
  • самокасающиеся/самопересекающиеся полигоны
person Albert Godfrind    schedule 09.06.2015