MBRIntersects MySQL возвращается пустым

У меня есть пространственная база данных MySQL 5.6 с таблицей, содержащей около 50 000 полигонов. У меня есть координаты ограничивающей рамки в виде полигона WKT, и мне нужно получить все полигоны из базы данных, которые полностью или частично находятся внутри этой рамки.

В настоящее время я пытаюсь использовать следующий код, однако он возвращает пустой набор результатов.

SELECT * FROM `polygons` WHERE mbrIntersects(ogc_geom,GeomFromText('POLYGON(-18 120,-10 120,-10 140,-18 140)'))

Я пробовал MBRContains, ST_Contains, MBRWithin и ST_Intersects. Я также пробовал переключать долготу и широту. Все эти вещи ничего не сделали.

Я также пробовал следующее

SELECT mbrIntersects(ogc_geom,GeomFromText('POLYGON(-18 120,-10 120,-10 140,-18 140)')) FROM `polygons`

Вышеупомянутое просто вернуло все результаты и ничего не добилось.

Короче говоря, я хотел бы знать, как получить все полигоны из базы данных MySQL, которые находятся в пределах предоставленного полигона WKT.

Спасибо


person user1641165    schedule 10.12.2014    source источник


Ответы (2)


Две проблемы:

  1. ваш многоугольник не замкнут, последняя точка должна совпадать с первой точкой
  2. вам нужен один дополнительный уровень скобок, так как POLYGON состоит из внешней формы плюс необязательный набор внутренних фигур («отверстий»)

Рабочий запрос:

SELECT * FROM `polygons` 
 WHERE mbrIntersects(ogc_geom,
   GeomFromText('POLYGON((-18 120,-10 120,-10 140,-18 140, -18 120))'));

обратите внимание на двойную (( после POLYGON и дополнительную пятую пару координат -18 120, совпадающую с первой

person Hartmut Holzgraefe    schedule 10.12.2014
comment
Спасибо. На самом деле, я уже пробовал его закрыть и всегда имел лишнюю скобку. Похоже, что я никогда не пробовал все эти вещи вместе, так как теперь все работает нормально. Спасибо - person user1641165; 10.12.2014
comment
Кроме того, на всякий случай это поможет кому-то еще. Правильный порядок: долгота, широта для MySQL. Вы также можете визуализировать свой полигон здесь arthur-e.github.io/Wicket/sandbox -gmaps3.html. Не имеет прямого отношения, но, возможно, поможет другим диагностировать проблемы, поскольку документации по MBR очень мало. - person user1641165; 10.12.2014
comment
В MySQL нет фиксированного порядка широты и долготы... порядок - выбор приложения - person Hartmut Holzgraefe; 10.12.2014

используйте select astext(ogc_geom) из polygons; в моем случае возврат

ПОЛИГОН((48 68,76 68,76 106,48 106,48 68))

ваш код отсутствует () в функции POLYGON(). более подробно проверьте документ mysql.

person huhushow    schedule 10.12.2014