9.11. Геометрические функции и операторы
Для геометрических типов point, box, lseg, line, path, polygon и circle разработан большой набор встроенных функций и операторов, представленный в Таблице 9.35, Таблице 9.36 и Таблице 9.37.
Таблица 9.35. Геометрические операторы
Оператор Описание Пример(ы) |
|---|
Добавляет координаты второго аргумента типа
|
Соединяет два открытых пути (если один из путей замкнутый, возвращает NULL).
|
Вычитает координаты второго аргумента типа
|
Умножает координаты каждой точки первого аргумента на координаты второго аргумента типа
|
Делит координаты каждой точки первого аргумента на координаты второго аргумента типа
|
Вычисляет общую длину. Имеется для типов
|
Вычисляет центральную точку. Имеется для типов
|
Возвращает количество точек. Имеется для типов
|
Вычисляет точку пересечения, а если пересечения нет, возвращает NULL. Имеется для типов
|
Вычисляет пересечение двух прямоугольников, а если пересечения нет, возвращает NULL.
|
Вычисляет ближайшую к первому объекту точку, принадлежащую второму объекту. Имеется для следующих пар типов: (
|
Вычисляет расстояние между объектами. Имеется для всех геометрических типов кроме
|
Первый объект содержит второй? Имеется для следующих пар типов: (
|
Первый объект содержится во втором? Имеется для следующих пар типов: (
|
Объекты пересекаются? (Для выполнения этого условия достаточно одной общей точки.) Имеется для типов
|
Первый объект строго слева от второго? Имеется для типов
|
Первый объект строго справа от второго? Имеется для типов
|
Первый объект не простирается правее второго? Имеется для типов
|
Первый объект не простирается левее второго? Имеется для типов
|
Первый объект строго ниже второго? Имеется для типов
|
Первый объект строго выше второго? Имеется для типов
|
Первый объект не простирается выше второго? Имеется для типов
|
Первый объект не простирается ниже второго? Имеется для типов
|
Первый объект ниже (или касается снизу) второго?
|
Первый объект выше (или касается сверху) второго?
|
Объекты пересекаются? Имеется для следующих пар типов: (
|
Линия является горизонтальной?
|
Точки выровнены по горизонтали (имеют одинаковую координату y)?
|
Линия является вертикальной?
|
Точки выровнены по вертикали (имеют одинаковую координату x)?
|
Линии перпендикулярны?
|
Линии параллельны?
|
Объекты совпадают? Имеется для типов
|
[a] При «повороте» прямоугольника эти операторы только перемещают его угловые точки: стороны прямоугольника считаются всегда параллельными осям. Таким образом, эта операция, в отличие от настоящего поворота, изменяет размер прямоугольника. |
Внимание
Заметьте, что оператор «идентичности», ~=, представляет собой обычную проверку равенства значений point, box, polygon и circle. Для некоторых геометрических типов определён также оператор =, но = проверяет только равенство площадей. Другие скалярные операторы сравнения (<= и т. д.) для тех типов, для которых они реализованы, тоже сравнивают площади.
Примечание
До Postgres Pro 14 применявшиеся к точкам операторы point <<| point (строго ниже) и point |>> point (строго выше) назывались <^ и >^ соответственно. Эти имена по-прежнему доступны, но считаются устаревшими и в конце концов будут удалены.
Таблица 9.36. Геометрические функции
Таблица 9.37. Функции преобразования геометрических типов
К двум компонентам типа point (точка) можно обратиться, как к элементам массива с индексами 0 и 1. Например, если t.p — столбец типа point, SELECT p[0] FROM t вернёт координату X, а UPDATE t SET p[1] = ... изменит координату Y. Таким же образом, значение типа box или lseg можно воспринимать как массив двух значений типа point.
9.11. Geometric Functions and Operators
The geometric types point, box, lseg, line, path, polygon, and circle have a large set of native support functions and operators, shown in Table 9.35, Table 9.36, and Table 9.37.
Table 9.35. Geometric Operators
Operator Description Example(s) |
|---|
Adds the coordinates of the second
|
Concatenates two open paths (returns NULL if either path is closed).
|
Subtracts the coordinates of the second
|
Multiplies each point of the first argument by the second
|
Divides each point of the first argument by the second
|
Computes the total length. Available for
|
Computes the center point. Available for
|
Returns the number of points. Available for
|
Computes the point of intersection, or NULL if there is none. Available for
|
Computes the intersection of two boxes, or NULL if there is none.
|
Computes the closest point to the first object on the second object. Available for these pairs of types: (
|
Computes the distance between the objects. Available for all geometric types except
|
Does first object contain second? Available for these pairs of types: (
|
Is first object contained in or on second? Available for these pairs of types: (
|
Do these objects overlap? (One point in common makes this true.) Available for
|
Is first object strictly left of second? Available for
|
Is first object strictly right of second? Available for
|
Does first object not extend to the right of second? Available for
|
Does first object not extend to the left of second? Available for
|
Is first object strictly below second? Available for
|
Is first object strictly above second? Available for
|
Does first object not extend above second? Available for
|
Does first object not extend below second? Available for
|
Is first object below second (allows edges to touch)?
|
Is first object above second (allows edges to touch)?
|
Do these objects intersect? Available for these pairs of types: (
|
Is line horizontal?
|
Are points horizontally aligned (that is, have same y coordinate)?
|
Is line vertical?
|
Are points vertically aligned (that is, have same x coordinate)?
|
Are lines perpendicular?
|
Are lines parallel?
|
Are these objects the same? Available for
|
[a] “Rotating” a box with these operators only moves its corner points: the box is still considered to have sides parallel to the axes. Hence the box's size is not preserved, as a true rotation would do. |
Caution
Note that the “same as” operator, ~=, represents the usual notion of equality for the point, box, polygon, and circle types. Some of the geometric types also have an = operator, but = compares for equal areas only. The other scalar comparison operators (<= and so on), where available for these types, likewise compare areas.
Note
Before Postgres Pro 14, the point is strictly below/above comparison operators point <<| point and point |>> point were respectively called <^ and >^. These names are still available, but are deprecated and will eventually be removed.
Table 9.36. Geometric Functions
Table 9.37. Geometric Type Conversion Functions