2013-03-27 6 views
4

Я создал таблицу (urban_border) в MySQL 5.5, которая имеет некоторые границы.Поиск таблицы для точки в многоугольнике с использованием MySQL

CREATE TABLE `municipal_border` (
    `boundary` polygon NOT NULL, 
    `municipalID` int(10) NOT NULL, 
) ENGINE=InnoDB 

Полевой муниципалитет не уникален.

Я использую следующий код, чтобы проверить, принадлежит ли точка полигону.

set @r = (SELECT municipal_border.boundary FROM municipal_border WHERE municipalID=9001); 
set @p = GeomFromText('POINT(24.1621 41.0548)'); 
select if(contains(@r, @p), 'yes', 'no'); 

Первый оператор set @r = ... возвращает только одну строку, и я выбрал его специально для тестирования. Он работает просто отлично.

То, что я хочу сделать, это найти всю таблицу (стирание, другими словами, где часть от вопроса SQL) и найти, в котором многоугольник точка находится.

ответ

8

После ночного сна я нашел следующее решение.

set @p = GeomFromText('POINT(23.923739342824817 38.224714465253733)'); 
select municipalID FROM ecovis.municipal_border 
where ST_Contains(municipal_border.boundary, @p); 

Это работает для MySQL 5.6.1, где ST_ prefix функции были реализованы. Хотя у меня нет никаких измерений из классического подхода (рентгеновский алгоритм), я считаю, что это довольно быстро. Для определения точки в 2700 полигонах требуется 0.17 секунды, а некоторые полигоны имеют более 1500 точек.

+0

Не похоже, что это доступно для 5.5, вы когда-нибудь пробовали работать? Я застрял в 5.5 в настоящее время. –

+0

Нет. Я ничего не реализовал, так как я был очень доволен функциями ST_. В моих заметках у меня есть [ссылка] (http://assemblysys.com/php-point-in-polygon-algorithm/), которая может быть альтернативой. –

Смежные вопросы