Поиск таблицы для точки в полигоне с использованием MySQL
Я создал таблицу (unicipal_border) в MySQL 5.5, которая содержит некоторые границы.
CREATE TABLE `municipal_border` (
`boundary` polygon NOT NULL,
`municipalID` int(10) NOT NULL,
) ENGINE=InnoDB
Поле unicipalID не уникально.
Я использую код ниже, чтобы проверить, принадлежит ли точка в многоугольник.
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 =... возвращает только одну строку, и я выбрал ее специально для тестирования. Работает просто отлично.
Я хочу выполнить поиск по всей таблице (другими словами, стереть часть WHERE из вопроса SQL) и найти, в каком многоугольнике находится точка.
1 ответ
После ночного сна я нашел следующее решение.
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_. Хотя у меня нет никаких измерений от классического подхода (рентгеновский алгоритм), я считаю, что это довольно быстро. Требуется 0,17 секунды, чтобы найти точку в 2700 полигонах, причем некоторые полигоны имеют более 1500 точек.
Решение Павла Папаниколау удивительно. В моем случае Table: TestPoly и column: pol Вставить запрос
SET @g = 'POLYGON((22.367582117085913 70.71181669186944, 22.225161442616514 70.65582486840117, 22.20736264867434 70.83229276390898, 22.18701840565626 70.9867880031668, 22.22452581029355 71.0918447658621, 22.382709129816103 70.98884793969023, 22.40112042636022 70.94078275414336, 22.411912121843205 70.7849142238699, 22.367582117085913 70.71181669186944))';
INSERT INTO TestPoly (pol) VALUES (ST_GeomFromText(@g))
Выберите запрос
set @p = GeomFromText('POINT(22.4053386588057 70.86240663480157)');
select * FROM TestPoly where ST_Contains(pol, @p);