MySQL: как найти ближайший полигон из специальной точки в версиях MySQL выше 5.6.1?
У меня есть стол urbanpolygons
столбец, который содержит многоугольник paths
У меня есть точка, которая окружена полигонами, и я хочу найти полигоны и найти, какая из них ближе к моей точке.
Зеленый ящик (многоугольник) - какой из них выбрать!
Я делаю это для управления точкой внутри многоугольника или нет:
select * FROM urbanpolygons where ST_Contains(urbanpolygons.paths, GeomFromText('POINT(29.632262, 52.497868)'));
ЭТОТ ВОПРОС НЕ ДУБЛИРУЕТСЯ Получить многоугольники близко к латинскому, длинные в MySQL или MySQL Найти полигон, ближайший к точке
Более старый вопрос, о котором я упоминал выше, был задан 6 лет назад, и с тех пор в MySQL было реализовано множество геопространственных функций.
Лучше ответить, учитывая новые возможности предложений mysql < 5.6.1, таких как ST_Contains
а также...
sqlfiddle не предлагает версию MYSQL выше 5.6, поэтому я решил написать небольшой пример здесь:
CREATE TABLE `urbanpolygons` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) NOT NULL,
`paths` polygon NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`)
)
INSERT INTO urbanpolygons (`id`, `name`, `paths`) VALUES ('1', 'area_1', ST_GeomFromText('POLYGON ((29.63383 52.492869,29.63411 52.493942,29.634446 52.494586,29.634837 52.495658,29.635397 52.497289,29.635676 52.49804,29.635919 52.498856,29.636217 52.499778,29.63674 52.501345,29.636889 52.501967,29.637131 52.502847,29.636851 52.503405,29.636497 52.503748,29.635285 52.50495,29.634483 52.505808,29.632804 52.503641,29.631592 52.502053,29.629652 52.499628,29.628496 52.498126,29.629204 52.497783,29.629652 52.497482,29.630361 52.496774,29.631126 52.495594,29.632002 52.494242,29.632655 52.493577,29.633308 52.492912,29.63383 52.492869))'));
INSERT INTO urbanpolygons (`id`, `name`, `paths`) VALUES ('2', 'area_2', ST_GeomFromText('POLYGON ((29.633084 52.486968,29.632748 52.488384,29.629055 52.489929,29.625176 52.49023,29.625138 52.489328,29.624579 52.487869,29.624467 52.487311,29.627078 52.485809,29.628831 52.484179,29.630249 52.482634,29.631144 52.482419,29.633084 52.486968))'));
INSERT INTO urbanpolygons (`id`, `name`, `paths`) VALUES ('3', 'area_3', ST_GeomFromText('POLYGON ((29.622564 52.488553,29.624504 52.494046,29.626892 52.498853,29.630622 52.505204,29.632711 52.507436,29.628981 52.509153,29.624653 52.501085,29.620773 52.505376,29.616744 52.49645,29.617192 52.490956,29.622564 52.488553))'));
У меня есть эта точка зрения:
GeomFromText('POINT(29.630528, 52.492461)')
эта точка находится за пределами предоставленных полигонов, но я хочу получить ближайший полигон к этой точке, который здесь area_1
!
1 ответ
Наконец я смог справиться с этим так:
К счастью, функция ST_DISTANCE() обеспечивает нам расстояние от любого геометрического объекта до других!(Я полагаю, расстояние между точкой и многоугольником, рассчитанное от точки до ближайшего края многоугольников, проверено с помощью расстояния от карт Google и предоставленного расстояния от ST_DISTANCE
)
select id
from (select st_distance(paths,POINT(29.630528, 52.492461))as polyDistance,id from urbanpolygons)as nearestPoly
where polyDistance = (select MIN(st_distance(paths,POINT(29.630528, 52.492461))) from urbanpolygons);
я знаю, что это немного сложно и неэффективно, и я стремлюсь найти лучшее решение!