Проверка геометрии в таблицах со столбцом ST_Geometry
Проверка геометрии производится при помощи типа данных ST_Geometry посредством библиотек st_shapelib (Oracle) и st_geometry. После создания таблицы проверка выполняется при вставке или обновлении данных.
Существует два основных способа вставки данных в пространственные таблицы:
- Использование функций доступа (accessor functions) или приложений, построенных на основе этих функций
- Использование ArcGIS API или приложений, построенных на основе этого интерфейса
Функции доступа определяются реализацией каждого пространственного типа, и они могут применять для проверки геометрии данных различные методы. Функции доступа Esri ST_Geometry, так же как и ArcGIS API, используют для проверки геометрии данных библиотеку форм Esri (Esri shape library). Сторонние пространственные типы применяют свои собственные функции доступа и правила проверки формы. Поэтому за правилами проверки формы для таких пространственных типов, как SDO_Geometry, геометрия PostGIS и геометрия или география Microsoft SQL Server, следует обращаться к соответствующей документации (Oracle, PostGIS или SQL Server).
Нижеследующие правила применимы к библиотеке формы Esri и, как следствие, к Esri API и функциям доступа ST_Geometry.
Правила проверки для точечных форм (point shapes)
-
Площадь и длина точки равны 0,0.
-
Конверт (envelope) одной точки равен значениям X, Y этой точки.
- Конверт формы из нескольких точек равен минимальному ограничивающему точки прямоугольнику.
Правила проверки для простых линий (simple lines) или последовательностей линий (linestrings)
- Удаляются последовательные дублированные точки.
- Каждая часть линии должна иметь по меньшей мере две различные точки.
- Каждая часть линии не должна пересекать сама себя. Начальная и конечная точка линии могут быть одинаковыми, но полученное замкнутое кольцо (ring) не будет считаться формой площади (area shape).
- Части линии могут касаться друг друга в конечных точках.
- Длина линии равна сумме длин всех её частей.
Правила проверки для линий (lines) или слабо структурированных последовательностей линий (spaghetti strings)
- Линии могут пересекать сами себя.
- Каждая часть линии должна иметь по меньшей мере две различные точки.
- Удаляются последовательные дублированные точки.
- Длина линии равна сумме длин всех её частей.
Правила проверки и операции для форм площадей (area shapes)
- Удаляются последовательные повторы одной координатной точки.
- Удаляются висячие объекты (dangles).
- Сегменты линий должны быть замкнуты (при этом координаты Z начальной и конечной точки также должны совпадать) и не должны перекрещиваться.
- Если форма площади имеет пробелы (holes), они должны полностью располагаться внутри внешней границы площади. Все пробелы, находящиеся за пределами внешней границы, удаляются ArcSDE.
- Пробел, имеющий одну общую точку с внешней границей, преобразуется в точки внешней границы формы площади.
- Несколько пробелов, имеющих общие точки, объединяются в один пробел.
- Части составной формы площади не могут перекрываться. Однако две части могут касаться в одной общей точке.
- Части составной формы площади не могут иметь общих границ. Общие границы расформировываются.
- Если два кольца (rings) имеют общую границу, они сливаются в одно кольцо.
- В качестве длины геометрии рассчитывается общий периметр, включая границы всех пробелов в полигонах с пробелами.
- Рассчитывается площадь.
- Рассчитывается конверт (envelope).
- Точки формы площади хранятся в базе по направлению против часовой стрелки, хотя программное обеспечение ArcSDE может возвращать точки в любом направлении. Если создана форма площади, содержащая координаты в направлении по часовой стрелке, ArcSDE изменяет это направление и записывает координаты в порядке против часовой стрелки.
В этом примере начальная точка – a, и координаты должны быть перечислены в порядке a,b,c,d,a.
- Форма площади может иметь смену направления точек (inversions) в тех местах, где пустоты внутри площади касаются внешней границы формы.
- Формы площади со сменой направления имеют внутреннее кольцо, касающееся внешней границы. Они не считаются полигонами с пробелами.
- Если форма площади имеет внутри себя пробел, в первую очередь записывается внешняя граница. Точки пробелов хранятся в направлении, противоположном направлению внешней границы.
В примере на следующем рисунке внешняя граница описана в порядке a,b,c,d,a, а пробел – в порядке e,f,g,h,e. Список координат такой формы площади будет иметь порядок a,b,c,d,a,e,f,g,h,e.
- Если два пробела касаются в одной общей точке, они считаются за один пробел, а не за два.
В приведенном примере две внутренние области являются единым пробелом, так как они имеют общую точку g.
- Как показано на следующем рисунке, сочетания форм площадей, с пробелами и без, могут иметь достаточно сложную структуру. Внешняя граница представляет озеро с островом. На острове тоже есть небольшое озеро.
Эти пространственные объекты можно представить одной, двумя или тремя формами. Каждый объект может храниться отдельно. Большое озеро является полигоном с пробелом. Граница большого озера является внешней границей формы, тогда как остров представлен границей её единственного пробела. Остров также является полигоном с пробелом. Граница острова является внешней границей, тогда как маленькое озеро представлено пробелом. Маленькое озеро является одной формой площади.
Если как пространственные объекты важны именно озера, одна форма с пробелом может представлять большое озеро, а вторая форма – малое озеро. Также для отображения этих объектов можно использовать составную форму площади. Первой частью формы будет большое озеро с пробелом, представляющим остров. Второй частью будет малое озеро.
- Нулевые формы (Nil shapes) выступают как заменители реальных форм – так можно вывести атрибутивную строку без соответствующей геометрии. Например, нулевая форма может появиться как результат запроса пересечения двух непересекающихся площадей.
Так как площади A и B не касаются друг друга, в результате запроса их пересечения будет возвращена пустая геометрия.
- Формы имеют измерения. Форма, имеющая только координаты X и Y, считается двухмерной. Форма, имеющая координаты Z или другие измерения (значения M), считается трехмерной. Форма также может иметь нулевое измерение.
Идентификатор пространственной привязки
При попытке вставить значение с координатами, лежащими вне пределов идентификатора пространственной привязки (SRID), с которым была создана таблица, оператор INSERT даст сбой с подобным сообщением об ошибке:
СУБД | Сообщение об ошибке |
---|---|
Oracle | ERROR at line 1: ORA-20004: Error generating shape from text (-112) ORA-06512: at "SDE.ST_GEOMETRY_SHAPELIB_PKG", line 42 ORA-06512: at "SDE.ST_POLYGON", line 69 ORA-06512: at line 1 |
PostgreSQL | ERROR: ESRI: error generating shape [-112]: |
Informix | SQL Error (-937): Coordinates out of bounds in ST_PolyFromText. |
DB2 | GSE3416N Coordinate out of bounds |