Перейти к содержимому
Последнее обновление

ST_DISJOINT

Описание​

Определяет, являются ли две геометрические фигуры полностью непересекающимися (то есть не имеют общих точек). Возвращает 1, если границы и внутренние области двух фигур не пересекаются (общих точек нет); возвращает 0, если имеется хотя бы одна общая точка (в том числе при касании границ или перекрытии внутренних областей).

Примечание

Поддерживается начиная с Apache Doris 3.0.6.

Синтаксис​

ST_DISJOINT( <shape1>, <shape2> )

Параметры​

ПараметрОписание
<shape1>Первая геометрическая фигура, для которой определяется отсутствие пересечения с другой фигурой. Поддерживаются такие типы, как Point, Line, Polygon, Circle.
<shape2>Вторая геометрическая фигура, для которой определяется отсутствие пересечения с другой фигурой. Поддерживаются такие типы, как Point, Line, Polygon, Circle.

Возвращаемое значение​

1: shape1 полностью отделена от shape2 (общих точек нет). 0: shape1 пересекается с shape2 (имеется хотя бы одна общая точка).

ST_DISJOINT обрабатывает следующие особые случаи:

  • Возвращает NULL, если хотя бы один входной параметр равен NULL.
  • Возвращает NULL, если входные геометрические фигуры некорректны.
  • Возвращает 1 для пустых геометрических фигур (пустые фигуры не содержат точек и не пересекаются ни с одной фигурой).

Пример​

Многоугольник и точка внутри него (пересекаются, возвращается 0)

SELECT ST_Disjoint(ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_Point(5, 5));
+------------------------------------------------------------------------------------+
| ST_Disjoint(ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_Point(5, 5)) |
+------------------------------------------------------------------------------------+
| 0 |
+------------------------------------------------------------------------------------+

Многоугольник и точка вне его (не пересекаются, возвращается 1)

SELECT ST_Disjoint(ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_Point(50, 50));
+--------------------------------------------------------------------------------------+
| ST_Disjoint(ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_Point(50, 50)) |
+--------------------------------------------------------------------------------------+
| 1 |
+--------------------------------------------------------------------------------------+

Точка и линия не пересекаются (точка не лежит на линии)

mysql> SELECT ST_Disjoint(ST_Linefromtext("LINESTRING (0 0, 10 10)"), ST_Point(1, 2));
+-------------------------------------------------------------------------+
| ST_Disjoint(ST_Linefromtext("LINESTRING (0 0, 10 10)"), ST_Point(1, 2)) |
+-------------------------------------------------------------------------+
| 1 |
+-------------------------------------------------------------------------+

Точка и линия пересекаются (точка лежит на линии)

mysql> SELECT ST_Disjoint(ST_Linefromtext("LINESTRING (0 0, 10 10)"), ST_Point(5, 5));
+-------------------------------------------------------------------------+
| ST_Disjoint(ST_Linefromtext("LINESTRING (0 0, 10 10)"), ST_Point(5, 5)) |
+-------------------------------------------------------------------------+
| 0 |
+-------------------------------------------------------------------------+

Линии пересекаются

mysql> SELECT ST_Disjoint(  ST_Linefromtext("LINESTRING (0 0, 10 10)"),  ST_Linefromtext("LINESTRING (0 10, 10 0)"));
+--------------------------------------------------------------------------------------------------------+
| ST_Disjoint( ST_Linefromtext("LINESTRING (0 0, 10 10)"), ST_Linefromtext("LINESTRING (0 10, 10 0)")) |
+--------------------------------------------------------------------------------------------------------+
| 0 |
+--------------------------------------------------------------------------------------------------------+

Линии не пересекаются (параллельны и не перекрываются)

mysql> SELECT ST_Disjoint(  ST_Linefromtext("LINESTRING (0 0, 10 0)"),  ST_Linefromtext("LINESTRING (0 1, 10 1)"));
+------------------------------------------------------------------------------------------------------+
| ST_Disjoint( ST_Linefromtext("LINESTRING (0 0, 10 0)"), ST_Linefromtext("LINESTRING (0 1, 10 1)")) |
+------------------------------------------------------------------------------------------------------+
| 1 |
+------------------------------------------------------------------------------------------------------+

Многоугольники не пересекаются (полностью отделены друг от друга)

mysql> SELECT ST_Disjoint(  ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"),  ST_Polygon("POLYGON ((20 20, 30 20, 30 30, 20 30, 20 20))"));
+------------------------------------------------------------------------------------------------------------------------------------+
| ST_Disjoint( ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_Polygon("POLYGON ((20 20, 30 20, 30 30, 20 30, 20 20))")) |
+------------------------------------------------------------------------------------------------------------------------------------+
| 1 |
+------------------------------------------------------------------------------------------------------------------------------------+

Многоугольники пересекаются (частично перекрываются)


mysql> SELECT ST_Disjoint( ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_Polygon("POLYGON ((5 5, 15 5, 15 15, 5 15, 5 5))"));
+------------------------------------------------------------------------------------------------------------------------------+
| ST_Disjoint( ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_Polygon("POLYGON ((5 5, 15 5, 15 15, 5 15, 5 5))")) |
+------------------------------------------------------------------------------------------------------------------------------+
| 0 |
+------------------------------------------------------------------------------------------------------------------------------+

Пустая геометрическая фигура не пересекается ни с одной фигурой

mysql> SELECT ST_Disjoint(  ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"),  ST_GeometryFromText("POINT EMPTY"));
+-----------------------------------------------------------------------------------------------------------+
| ST_Disjoint( ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_GeometryFromText("POINT EMPTY")) |
+-----------------------------------------------------------------------------------------------------------+
| NULL |
+-----------------------------------------------------------------------------------------------------------+

Некорректная геометрическая фигура (самопересекающийся многоугольник) в качестве параметра

mysql> SELECT ST_Disjoint(  ST_Polygon("POLYGON ((0 0, 1 1, 0 1, 1 0, 0 0))"),  ST_Point(0.5, 0.5));
+---------------------------------------------------------------------------------------+
| ST_Disjoint( ST_Polygon("POLYGON ((0 0, 1 1, 0 1, 1 0, 0 0))"), ST_Point(0.5, 0.5)) |
+---------------------------------------------------------------------------------------+
| NULL |
+---------------------------------------------------------------------------------------+

При значении параметра NULL возвращается NULL


mysql> SELECT ST_Disjoint(ST_Point(0,0), NULL);
+----------------------------------+
| ST_Disjoint(ST_Point(0,0), NULL) |
+----------------------------------+
| NULL |
+----------------------------------+

Круг пересекается с многоугольником

mysql> SELECT ST_Disjoint(  ST_Polygon("POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))"),  ST_Circle(5, 2.5, 2000));
+--------------------------------------------------------------------------------------------+
| ST_Disjoint( ST_Polygon("POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))"), ST_Circle(5, 2.5, 2000)) |
+--------------------------------------------------------------------------------------------+
| 0 |
+--------------------------------------------------------------------------------------------+

Круг не пересекается с многоугольником

mysql> SELECT ST_Disjoint(  ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"),  ST_Circle(20, 5, 5));
+--------------------------------------------------------------------------------------------+
| ST_Disjoint( ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_Circle(20, 5, 5)) |
+--------------------------------------------------------------------------------------------+
| 1 |
+--------------------------------------------------------------------------------------------+