Spec-Zone.ru › MySQL 8.4

14.16.9.2 Функции пространственных отношений, использующие минимальные ограничивающие прямоугольники

MySQL предоставляет несколько функций, специфичных для MySQL, которые проверяют отношения между минимальными ограничивающими прямоугольниками (MBR) двух геометрий g1 и g2. Значения возврата 1 и 0 указывают на истинность и ложность соответственно.

MBR (также известный как ограничивающая рамка) для двумерной геометрии — это наименьший прямоугольник, содержащий все точки в геометрии и, следовательно, охватывающий область между её наибольшими значениями по обеим координатным направлениям. Другими словами, это прямоугольник, ограниченный точками (min(x), min(y)), (min(x), max(y)), (max(x), max(y)) и (max(x), min(y)), где min() и max() представляют минимальное и максимальное значения координат x или y геометрии соответственно.

При обсуждении отношений между геометриями важно различать понятия «содержания» и «охватывания», как описано ниже:

  • Геометрия g1 содержит другую геометрию g2 тогда и только тогда, когда все точки в g2 также находятся в g1, и их границы не пересекаются. То есть, все точки (a, b) в g2 должны удовлетворять условиям min(x) < a < max(x) и min(y) < b < max(y). В этом случае ST_Contains(g1, g2) и MBRContains(g1, g2), а также ST_Within(g2, g1) возвращают значение «истина».

  • Мы говорим, что g1 охватывает g2, если все точки в g2 также находятся в g1, включая граничные точки. То есть, все точки (a, b) в g2 должны удовлетворять условиям min(x) <= a <= max(x) и min(y) <= b <= max(y). В этом случае MBRCovers(g1, g2) и MBRCoveredBy(g2, g1) оба возвращают значение «истина».

Давайте определим прямоугольник g1 и точки p1, p2 и p3 с помощью представленных здесь SQL-запросов:

SET
  @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))'),

  @p1 = ST_GeomFromText('Point(1 1)'),
  @p2 = ST_GeomFromText('Point(3 3)'),
  @p3 = ST_GeomFromText('Point(5 5)');

g1 содержит и охватывает p1; p1 полностью находится внутри g1 и не касается ни одной из его границ, как видно из запроса SELECT, представленного здесь:

mysql> SELECT
    ->   ST_Contains(@g1, @p1), ST_Within(@p1, @g1),
    ->   MBRContains(@g1, @p1),
    ->   MBRCovers(@g1, @p1), MBRCoveredBy(@p1, @g1),
    ->   ST_Disjoint(@g1, @p1), ST_Intersects(@g1, @p1)\G
*************************** 1. row ***************************
  ST_Contains(@g1, @p1): 1
    ST_Within(@p1, @g1): 1
  MBRContains(@g1, @p1): 1
    MBRCovers(@g1, @p1): 1
 MBRCoveredBy(@p1, @g1): 1
  ST_Disjoint(@g1, @p1): 0
ST_Intersects(@g1, @p1): 1
1 row in set (0.01 sec)

Используя тот же запрос с заменой @p2 на @p1, мы можем увидеть, что g2 охватывает p2, но не содержит его, поскольку p2 входит в границу g2, но не лежит внутри её внутренности. (То есть, min(x) <= a <= max(x) и min(y) <= b <= max(y) истинны, но min(x) < a < max(x) и min(y) < b < max(y) ложны).

mysql> SELECT
    ->   ST_Contains(@g1, @p2), ST_Within(@p2, @g1),
    ->   MBRContains(@g1, @p2),
    ->   MBRCovers(@g1, @p2), MBRCoveredBy(@p2, @g1),
    ->   ST_Disjoint(@g1, @p2), ST_Intersects(@g1, @p2)\G
*************************** 1. row ***************************
  ST_Contains(@g1, @p2): 0
    ST_Within(@p2, @g1): 0
  MBRContains(@g1, @p2): 0
    MBRCovers(@g1, @p2): 1
 MBRCoveredBy(@p2, @g1): 1
  ST_Disjoint(@g1, @p2): 0
ST_Intersects(@g1, @p2): 1
1 row in set (0.00 sec)

Выполнение запроса — на этот раз с использованием @p3 вместо @p2 или @p1 — показывает, что p3 не пересекается с g1; у двух геометрий нет общих точек, и g1 ни содержит, ни охватывает p3. ST_Disjoint(g1, p3) возвращает значение «истина»; ST_Intersects(g1, p3) возвращает значение «ложь».

mysql> SELECT
    ->   ST_Contains(@g1, @p3), ST_Within(@p3, @g1),
    ->   MBRContains(@g1, @p3),
    ->   MBRCovers(@g1, @p3), MBRCoveredBy(@p3, @g1),
    ->   ST_Disjoint(@g1, @p3), ST_Intersects(@g1, @p3)\G
*************************** 1. row ***************************
  ST_Contains(@g1, @p3): 0
    ST_Within(@p3, @g1): 0
  MBRContains(@g1, @p3): 0
    MBRCovers(@g1, @p3): 0
 MBRCoveredBy(@p3, @g1): 0
  ST_Disjoint(@g1, @p3): 1
ST_Intersects(@g1, @p3): 0
1 row in set (0.00 sec)

Описания функций, показанные далее в данном разделе и в разделе 14.16.9.1 «Функции пространственных отношений, использующие формы объектов», предоставляют дополнительные примеры.

Ограничивающая рамка точки интерпретируется как точка, являющаяся одновременно граничной и внутренней.

Ограничивающая рамка прямой горизонтали или вертикали интерпретируется как прямая, где внутренность прямой также является границей. Концы являются граничными точками.

Если любой из параметров является коллекцией геометрий, внутренность, граница и внешность этих параметров соответствуют объединению всех элементов в коллекции.

Функции в данном разделе обнаруживают аргументы в декартовых или географических системах пространственных ссылок (SRS), и возвращают результаты, соответствующие SRS.

За исключением случаев, когда указано иное, функции в этом разделе обрабатывают свои геометрические аргументы следующим образом:

  • Если любой аргумент равен NULL или является пустой геометрией, значение возврата равно NULL.

  • Если любой геометрический аргумент не является синтаксически корректной геометрией, возникает ошибка.

  • Если любой геометрический аргумент является синтаксически корректной геометрией в неопределённой системе пространственных ссылок (SRS), возникает ошибка.

  • Для функций, принимающих несколько геометрических аргументов, если эти аргументы не находятся в одной и той же системе SRS, возникает ошибка.

  • Если любой аргумент геометрически некорректен, результат может быть истинным или ложным (не определено какое), или возникает ошибка.

  • Для геометрических аргументов географических систем SRS, если у любого аргумента долгота или широта находятся вне диапазона, возникает ошибка:

    • Если значение долготы не находится в диапазоне (−180, 180], возникает ошибка.

    • Если значение широты не находится в диапазоне [−90, 90], возникает ошибка.

    Указанные диапазоны — в градусах. Если SRS использует другую единицу, диапазон использует соответствующие значения в этой единице. Точные пределы диапазона немного отличаются из-за арифметики с плавающей запятой.

  • В противном случае возвращаемое значение является не-NULL.

Эти функции MBR доступны для проверки отношений геометрий:

  • MBRContains(g1, g2)

    Возвращает 1 или 0, чтобы указать, содержится ли минимальный ограничивающий прямоугольник g1 в минимальном ограничивающем прямоугольнике g2. Это проверяет противоположное отношение функции MBRWithin().

    MBRContains() обрабатывает свои аргументы, как описано во введении к этому разделу.

    mysql> SET
        ->   @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))'),
        ->   @g2 = ST_GeomFromText('Polygon((1 1,1 2,2 2,2 1,1 1))'),
        ->   @g3 = ST_GeomFromText('Polygon((0 0,0 5,5 5,5 0,0 0))'),
        ->   @g4 = ST_GeomFromText('Polygon((5 5,5 10,10 10,10 5,5 5))'),
        ->   @p1 = ST_GeomFromText('Point(1 1)'),
        ->   @p2 = ST_GeomFromText('Point(3 3)');
        ->   @p3 = ST_GeomFromText('Point(5 5)');
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT
        ->   MBRContains(@g1, @g2), MBRContains(@g1, @g4),
        ->   MBRContains(@g2, @g1), MBRContains(@g2, @g4),
        ->   MBRContains(@g2, @g3), MBRContains(@g3, @g4),
        ->   MBRContains(@g3, @g1), MBRContains(@g1, @g3),
        ->   MBRContains(@g1, @p1), MBRContains(@p1, @g1),
        ->   MBRContains(@g1, @p1), MBRContains(@p1, @g1),
        ->   MBRContains(@g2, @p2), MBRContains(@g2, @p3),
        ->   MBRContains(@g3, @p1), MBRContains(@g3, @p2),
        ->   MBRContains(@g3, @p3), MBRContains(@g4, @p1),
        ->   MBRContains(@g4, @p2), MBRContains(@g4, @p3)\G
    *************************** 1. row ***************************
    MBRContains(@g1, @g2): 1
    MBRContains(@g1, @g4): 0
    MBRContains(@g2, @g1): 0
    MBRContains(@g2, @g4): 0
    MBRContains(@g2, @g3): 0
    MBRContains(@g3, @g4): 0
    MBRContains(@g3, @g1): 1
    MBRContains(@g1, @g3): 0
    MBRContains(@g1, @p1): 1
    MBRContains(@p1, @g1): 0
    MBRContains(@g1, @p1): 1
    MBRContains(@p1, @g1): 0
    MBRContains(@g2, @p2): 0
    MBRContains(@g2, @p3): 0
    MBRContains(@g3, @p1): 1
    MBRContains(@g3, @p2): 1
    MBRContains(@g3, @p3): 0
    MBRContains(@g4, @p1): 0
    MBRContains(@g4, @p2): 0
    MBRContains(@g4, @p3): 0
    1 row in set (0.00 sec)
    
  • MBRCoveredBy(g1, g2)

    Возвращает 1 или 0, чтобы указать, покрывает ли минимальный ограничивающий прямоугольник g1 минимальный ограничивающий прямоугольник g2. Это проверяет противоположное отношение функции MBRCovers().

    MBRCoveredBy() обрабатывает свои аргументы, как описано во введении к этому разделу.

    mysql> SET @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
    mysql> SET @g2 = ST_GeomFromText('Point(1 1)');
    mysql> SELECT MBRCovers(@g1,@g2), MBRCoveredby(@g1,@g2);
    +--------------------+-----------------------+
    | MBRCovers(@g1,@g2) | MBRCoveredby(@g1,@g2) |
    +--------------------+-----------------------+
    |                  1 |                     0 |
    +--------------------+-----------------------+
    mysql> SELECT MBRCovers(@g2,@g1), MBRCoveredby(@g2,@g1);
    +--------------------+-----------------------+
    | MBRCovers(@g2,@g1) | MBRCoveredby(@g2,@g1) |
    +--------------------+-----------------------+
    |                  0 |                     1 |
    +--------------------+-----------------------+
    

    См. описание функции MBRCovers() для дополнительных примеров.

  • MBRCovers(g1, g2)

    Возвращает 1 или 0, чтобы указать, покрывает ли минимальный ограничивающий прямоугольник g1 минимальный ограничивающий прямоугольник g2. Это проверяет противоположное отношение функции MBRCoveredBy(). См. описание MBRCoveredBy() для дополнительных примеров.

    MBRCovers() обрабатывает свои аргументы, как описано во введении к этому разделу.

    mysql> SET
        ->   @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))'),
        ->   @g2 = ST_GeomFromText('Polygon((1 1,1 2,2 2,2 1,1 1))'),
        ->   @p1 = ST_GeomFromText('Point(1 1)'),
        ->   @p2 = ST_GeomFromText('Point(3 3)'),
        ->   @p3 = ST_GeomFromText('Point(5 5)');
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> SELECT
        ->   MBRCovers(@g1, @p1), MBRCovers(@g1, @p2),
        ->   MBRCovers(@g1, @g2), MBRCovers(@g1, @p3)\G
    *************************** 1. row ***************************
    MBRCovers(@g1, @p1): 1
    MBRCovers(@g1, @p2): 1
    MBRCovers(@g1, @g2): 1
    MBRCovers(@g1, @p3): 0
    1 row in set (0.00 sec)
    
  • MBRDisjoint(g1, g2)

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

    MBRDisjoint() обрабатывает свои аргументы, как описано во введении к этому разделу.

    mysql> SET
        ->   @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))'),
        ->   @g2 = ST_GeomFromText('Polygon((1 1,1 2,2 2,2 1,1 1))'),
        ->   @g3 = ST_GeomFromText('Polygon((0 0,0 5,5 5,5 0,0 0))'),
        ->   @g4 = ST_GeomFromText('Polygon((5 5,5 10,10 10,10 5,5 5))'),
        ->   @p1 = ST_GeomFromText('Point(1 1)'),
        ->   @p2 = ST_GeomFromText('Point(3 3)'),
        ->   @p3 = ST_GeomFromText('Point(5 5)');
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT
        ->   MBRDisjoint(@g1, @g4), MBRDisjoint(@g2, @g4),
        ->   MBRDisjoint(@g3, @g4), MBRDisjoint(@g4, @g4),
        ->   MBRDisjoint(@g1, @p1), MBRDisjoint(@g1, @p2),
        ->   MBRDisjoint(@g1, @p3)\G
    *************************** 1. row ***************************
    MBRDisjoint(@g1, @g4): 1
    MBRDisjoint(@g2, @g4): 1
    MBRDisjoint(@g3, @g4): 0
    MBRDisjoint(@g4, @g4): 0
    MBRDisjoint(@g1, @p1): 0
    MBRDisjoint(@g1, @p2): 0
    MBRDisjoint(@g1, @p3): 1
    1 row in set (0.00 sec)
    
  • MBREquals(g1, g2)

    Возвращает 1 или 0, чтобы указать, являются ли минимальные ограничивающие прямоугольники двух геометрий g1 и g2 одинаковыми.

    MBREquals() обрабатывает свои аргументы, как описано во введении к этому разделу, за исключением того, что она не возвращает NULL для пустых геометрических аргументов.

    mysql> SET
        ->   @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))'),
        ->   @g2 = ST_GeomFromText('Polygon((1 1,1 2,2 2,2 1,1 1))'),
        ->   @p1 = ST_GeomFromText('Point(1 1)'),
        ->   @p2 = ST_GeomFromText('Point(3 3)'),
        ->   @p3 = ST_GeomFromText('Point(5 5)');
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT
        ->   MBREquals(@g1, @g1), MBREquals(@g1, @g2),
        ->   MBREquals(@g1, @p1), MBREquals(@g1, @p2), MBREquals(@g2, @g2),
        ->   MBREquals(@p1, @p1), MBREquals(@p1, @p2), MBREquals(@p2, @p2)\G
    *************************** 1. row ***************************
    MBREquals(@g1, @g1): 1
    MBREquals(@g1, @g2): 0
    MBREquals(@g1, @p1): 0
    MBREquals(@g1, @p2): 0
    MBREquals(@g2, @g2): 1
    MBREquals(@p1, @p1): 1
    MBREquals(@p1, @p2): 0
    MBREquals(@p2, @p2): 1
    1 row in set (0.00 sec)
    
  • MBRIntersects(g1, g2)

    Возвращает 1 или 0, чтобы указать, пересекаются ли минимальные ограничивающие прямоугольники двух геометрий g1 и g2.

    MBRIntersects() обрабатывает свои аргументы, как описано во введении к этому разделу.

    mysql> SET
        ->   @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))'),
        ->   @g2 = ST_GeomFromText('Polygon((1 1,1 2,2 2,2 1,1 1))'),
        ->   @g3 = ST_GeomFromText('Polygon((0 0,0 5,5 5,5 0,0 0))'),
        ->   @g4 = ST_GeomFromText('Polygon((5 5,5 10,10 10,10 5,5 5))'),
        ->   @g5 = ST_GeomFromText('Polygon((2 2,2 8,8 8,8 2,2 2))'),
        ->   @p1 = ST_GeomFromText('Point(1 1)'),
        ->   @p2 = ST_GeomFromText('Point(3 3)'),
        ->   @p3 = ST_GeomFromText('Point(5 5)');
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT
        ->   MBRIntersects(@g1, @g1), MBRIntersects(@g1, @g2),
        ->   MBRIntersects(@g1, @g3), MBRIntersects(@g1, @g4), MBRIntersects(@g1, @g5),
        ->   MBRIntersects(@g1, @p1), MBRIntersects(@g1, @p2), MBRIntersects(@g1, @p3),
        ->   MBRIntersects(@g2, @p1), MBRIntersects(@g2, @p2), MBRIntersects(@g2, @p3)\G
    *************************** 1. row ***************************
    MBRIntersects(@g1, @g1): 1
    MBRIntersects(@g1, @g2): 1
    MBRIntersects(@g1, @g3): 1
    MBRIntersects(@g1, @g4): 0
    MBRIntersects(@g1, @g5): 1
    MBRIntersects(@g1, @p1): 1
    MBRIntersects(@g1, @p2): 1
    MBRIntersects(@g1, @p3): 0
    MBRIntersects(@g2, @p1): 1
    MBRIntersects(@g2, @p2): 0
    MBRIntersects(@g2, @p3): 0
    1 row in set (0.00 sec)
    
  • MBROverlaps(g1, g2)

    Две геометрии пространственно перекрываются, если они пересекаются, и их пересечение приводит к геометрии той же размерности, но не равной ни одной из заданных геометрий.

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

    MBROverlaps() обрабатывает свои аргументы, как описано во введении к этому разделу.

  • MBRTouches(g1, g2)

    Две геометрии пространственно касаются, если их внутренности не пересекаются, но граница одной из геометрий пересекает либо границу, либо внутренность другой.

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

    MBRTouches() обрабатывает свои аргументы, как описано во введении к этому разделу.

  • MBRWithin(g1, g2)

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

    MBRWithin() обрабатывает свои аргументы, как описано во введении к этому разделу.

    mysql> SET
        ->   @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))'),
        ->   @g2 = ST_GeomFromText('Polygon((1 1,1 2,2 2,2 1,1 1))'),
        ->   @g3 = ST_GeomFromText('Polygon((0 0,0 5,5 5,5 0,0 0))'),
        ->   @g4 = ST_GeomFromText('Polygon((5 5,5 10,10 10,10 5,5 5))'),
        ->   @p1 = ST_GeomFromText('Point(1 1)'),
        ->   @p2 = ST_GeomFromText('Point(3 3)');
        ->   @p3 = ST_GeomFromText('Point(5 5)');
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT
        ->   MBRWithin(@g1, @g2), MBRWithin(@g1, @g4),
        ->   MBRWithin(@g2, @g1), MBRWithin(@g2, @g4),
        ->   MBRWithin(@g2, @g3), MBRWithin(@g3, @g4),
        ->   MBRWithin(@g1, @p1), MBRWithin(@p1, @g1),
        ->   MBRWithin(@g1, @p1), MBRWithin(@p1, @g1),
        ->   MBRWithin(@g2, @p2), MBRWithin(@g2, @p3)\G
    *************************** 1. row ***************************
    MBRWithin(@g1, @g2): 0
    MBRWithin(@g1, @g4): 0
    MBRWithin(@g2, @g1): 1
    MBRWithin(@g2, @g4): 0
    MBRWithin(@g2, @g3): 1
    MBRWithin(@g3, @g4): 0
    MBRWithin(@g1, @p1): 0
    MBRWithin(@p1, @g1): 1
    MBRWithin(@g1, @p1): 0
    MBRWithin(@p1, @g1): 1
    MBRWithin(@g2, @p2): 0
    MBRWithin(@g2, @p3): 0
    1 row in set (0.00 sec)
    

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/spatial-relation-functions-mbr.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API