9.11. Геометрические функции и операторы #
Для геометрических типов point, box, lseg, line, path, polygon и circle разработан большой набор встроенных функций и операторов, представленный в Таблице 9.36, Таблице 9.37 и Таблице 9.38.
Таблица 9.36. Геометрические операторы
Оператор Описание Пример(ы) |
|---|
Добавляет координаты второго аргумента типа
|
Соединяет два открытых пути (если один из путей замкнутый, возвращает NULL).
|
Вычитает координаты второго аргумента типа
|
Умножает координаты каждой точки первого аргумента на координаты второго аргумента типа
|
Делит координаты каждой точки первого аргумента на координаты второго аргумента типа
|
Вычисляет общую длину. Имеется для типов
|
Вычисляет центральную точку. Имеется для типов
|
Возвращает количество точек. Имеется для типов
|
Вычисляет точку пересечения, а если пересечения нет, возвращает NULL. Имеется для типов
|
Вычисляет пересечение двух прямоугольников, а если пересечения нет, возвращает NULL.
|
Вычисляет ближайшую к первому объекту точку, принадлежащую второму объекту. Имеется для следующих пар типов: (
|
Вычисляет расстояние между объектами. Имеется для всех семи геометрических типов, для всех сочетаний типа
|
Первый объект содержит второй? Имеется для следующих пар типов: (
|
Первый объект содержится во втором? Имеется для следующих пар типов: (
|
Объекты пересекаются? (Для выполнения этого условия достаточно одной общей точки.) Имеется для типов
|
Первый объект строго слева от второго? Имеется для типов
|
Первый объект строго справа от второго? Имеется для типов
|
Первый объект не простирается правее второго? Имеется для типов
|
Первый объект не простирается левее второго? Имеется для типов
|
Первый объект строго ниже второго? Имеется для типов
|
Первый объект строго выше второго? Имеется для типов
|
Первый объект не простирается выше второго? Имеется для типов
|
Первый объект не простирается ниже второго? Имеется для типов
|
Первый объект ниже (или касается снизу) второго?
|
Первый объект выше (или касается сверху) второго?
|
Объекты пересекаются? Имеется для следующих пар типов: (
|
Линия является горизонтальной?
|
Точки выровнены по горизонтали (имеют одинаковую координату y)?
|
Линия является вертикальной?
|
Точки выровнены по вертикали (имеют одинаковую координату x)?
|
Линии перпендикулярны?
|
Линии параллельны?
|
Объекты совпадают? Имеется для типов
|
[a] При «повороте» прямоугольника эти операторы только перемещают его угловые точки: стороны прямоугольника считаются всегда параллельными осям. Таким образом, эта операция, в отличие от настоящего поворота, изменяет размер прямоугольника. |
Внимание
Заметьте, что оператор «идентичности», ~=, представляет собой обычную проверку равенства значений point, box, polygon и circle. Для некоторых геометрических типов определён также оператор =, но = проверяет только равенство площадей. Другие скалярные операторы сравнения (<= и т. д.) для тех типов, для которых они реализованы, тоже сравнивают площади.
Примечание
До Postgres Pro 14 применявшиеся к точкам операторы point <<| point (строго ниже) и point |>> point (строго выше) назывались <^ и >^ соответственно. Эти имена по-прежнему доступны, но считаются устаревшими и в конце концов будут удалены.
Таблица 9.37. Геометрические функции
Таблица 9.38. Функции преобразования геометрических типов
К двум компонентам типа 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.36, Table 9.37, and Table 9.38.
Table 9.36. 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 seven geometric types, for all combinations of
|
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.37. Geometric Functions
Table 9.38. Geometric Type Conversion Functions