Пересечения линий MySQL с линиями или полигонами


У меня проблема с пространственными функциями MySQL. Моя цель - выяснить, проходит ли объект LINESTRING через ПОЛИГОНАЛЬНЫЙ объект или нет. Чтобы определить это, я попытался поэкспериментировать с двумя объектами LINESTRING, чтобы определить, пересекаются они или нет.

SET @ls='LINESTRING (0 0, 1 1, 2 2, 3 3)'; -- original linestring
SET @lp='LINESTRING (0 1, 1 2, 2 3, 3 4)'; -- parallel linestring
SET @lx='LINESTRING (0 3, 1 2, 2 1, 3 0)'; -- crossed linestring

Я попробовал несколько функций для достижения своей цели:

SELECT crosses(GeomFromText(@ls), GeomFromText(@lx)); -- crossing linestrings
returns 0;

SELECT intersects(GeomFromText(@ls), GeomFromText(@lp)); -- parallel linestrings
returns 1;

SELECT overlaps(GeomFromText(@ls), GeomFromText(@lp)); -- parallel linestrings
returns 1;

Я понимаю, что это вопрос сравнения границ или sth, но есть ли способ (или функция, или простое решение), как достичь моей цели? Другой можно было бы проверить, находится ли ТОЧКА в ЛИНЕЙНОЙ ЦЕПОЧКЕ внутри МНОГОУГОЛЬНИКА, но мне было интересно, есть ли другой способ сделать это?

Решение, представленное в MySQL Пересечение Большого круга (пересекаются ли две дороги?), к сожалению, мне не помогает..

Author: Community, 2012-03-08

1 answers

Из документации MySQL для ' Функции, Которые Проверяют Пространственные Отношения Между Геометриями' в 5.6.1:

MySQL изначально реализовал эти функции таким образом, что они использовали прямоугольники, ограничивающие объекты, и возвращали тот же результат, что и соответствующие функции на основе MBR. Начиная с MySQL 5.6.1, доступны соответствующие версии, которые используют точные формы объектов. Эти версии называются с префиксом ST_. Например, Contains() использует ограничение объекта прямоугольники, в то время как ST_Contains() использует формы объектов.

Начиная с MySQL 5.6.1, существуют также псевдонимы ST_ для существующих пространственных функций, которые уже были точными. Например, ST_IsEmpty() является псевдонимом для isEmpty()

Ваша функция intersects, например, возвращает true, потому что минимальный ограничивающий прямоугольник (MBR) двух фигур пересекается . Если вы используете ST_Intersects вместо этого (при условии, что у вас MySQL 5.6.1 или выше), то он вернет false, как и предполагалось. Эти функции может использоваться с точками, линиями и полигонами - поэтому также следует решить ваш запрос "пересекающий линию полигон" (ST_Crosses также существует, если требуется).

 3
Author: Jack Harrison, 2013-04-18 14:24:02