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 доступны для проверки отношений геометрий:
-
Возвращает 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) -
Возвращает 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()для дополнительных примеров. -
Возвращает 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) -
Возвращает 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) -
Возвращает 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) -
Возвращает 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) -
Две геометрии пространственно перекрываются, если они пересекаются, и их пересечение приводит к геометрии той же размерности, но не равной ни одной из заданных геометрий.
Эта функция возвращает 1 или 0, чтобы указать, перекрываются ли минимальные ограничивающие прямоугольники двух геометрий
g1иg2.MBROverlaps()обрабатывает свои аргументы, как описано во введении к этому разделу. -
Две геометрии пространственно касаются, если их внутренности не пересекаются, но граница одной из геометрий пересекает либо границу, либо внутренность другой.
Эта функция возвращает 1 или 0, чтобы указать, касаются ли минимальные ограничивающие прямоугольники двух геометрий
g1иg2.MBRTouches()обрабатывает свои аргументы, как описано во введении к этому разделу. -
Возвращает 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.