MySQL - посмотреть, пересекает ли радиус многоугольник - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть таблица «областей», а с таблицей у меня есть поле с именем многоугольник, который определяет эту область. Вот пример данных в многоугольнике

(51.562537549259275, -0.18651649218749844),(51.56518165749251, -0.1497333723210481),(51.55111270638887, -0.10924630850248862),(51.568708395618486, -0.12155901469758534),(51.51636175962405, -0.07797281013359303),(51.46339366897244, -0.1081939612190741),(51.45202948056895, -0.13394078643432783),(51.44657087249458, -0.14909693896627108),(51.43333085349518, -0.18476873548843198),(51.42143028245271, -0.16866370898437344),(51.42048689213698, -0.2246564608006274),(51.410609105933894, -0.2541484477524758),(51.38180048734274, -0.31050333075316905),(51.38632646897756, -0.3486097751090478),(51.4462317250533, -0.39531041838200887),(51.482412594272446, -0.33524472163053654),(51.49386310130167, -0.31459844345063326),(51.57115695855739, -0.25625859642894877),

Этот многоугольник создан в Картах Google, если изменение этих данных на что-то другое поможет, я могу это сделать, я ' Я не застрял с этим форматом данных.

Во внешнем интерфейсе клиент выполняет поиск, выбирая местоположение (которое дает широту и долготу) и радиус для поиска.

Есть ли способ в MySQL увидеть, пересекаются ли эти две вещи? Любая помощь очень ценится.

1 Ответ

0 голосов
/ 29 апреля 2020

Просто для тех, у кого есть эта проблема, я нашел решение.

Как упоминалось в первом посте, у меня было поле с именем многоугольник, в котором также содержался многоугольник в указанном формате. Я создал новое поле с именем enc_polygon типа POLYGON и написал PHP для преобразования полигона в enc_polygon при вставке и обновлении. Я не буду показывать это, потому что люди вряд ли сохранят в том же формате, что и я!

Стоит отметить, что для работы поля базы данных POLYGON первая и последняя координаты должны быть одинаковыми, чтобы закрыть его, для карт Google это не так.

Теперь у меня есть полигон в базе данных, я могу сделать это

SELECT *
FROM   AREAS
WHERE ......
AND   ST_Within(ST_PointFromText('POINT($latitude $longitude)'), ST_Buffer(enc_polygon, 0.008983157 * $distance )) = 1

Широта и долгота не из базы данных, поэтому мне нужно преобразовать их в точку, это использует ST_PointFromText .

На странице также указывается расстояние, на которое пользователь хочет пройти в километрах. Поэтому я использовал функцию ST_Buffer , чтобы поместить буфер введенного расстояния вокруг всего многоугольника.

ST_Within довольно очевидно, я думаю, но в основном он возвращает 1, если точка находится в буферном многоугольнике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...