PHP

Проверить входит ли точка в район по координатам. (openstreetmap )

Как это реализовывается. Заносим в БД координаты районов. И при загрузке не знаю в другую таблицу координаты домов, чтобы определялся к какому району он относится по координатам районов. Координаты районов изменяемы.
Полагаю, нужно построить луч из искомой точки. Если луч пересекает нечетное количество граней района, то значит она входит в район. Это должно работать для всех многоугольников, в том числи для вогнутых. Направление луча значения не имеет.
Так как луч бесконечный, а в программировании все значения конечные, то его можно имитировать отрезком, у которого вторая точка имеет очень дальние координаты. Далее нужно просто реализовать алгоритм нахождения пересечения двух отрезков и по этому алгоритму определить наличие пересечения луча с каждой гранью и подсчитать общее количество пересечений.
Вроде как-то так.
Александр Митичкин
Александр Митичкин
38 877
Лучший ответ
Александр Перетятко А как это на php? На примере?
думается, это надо разбить на две части:
каждый район заключить в "прямоугольник" (или группу "прямоугольников") со сторонами, паралельными координатным осям.
тогда при поиске района средствами СУБД вытащить районы, в чьи прямоугольники попадает точка, а затем средствами сервера приложений определить из этого подмножества конкретный район (обычная задача вхождения точки в область).
Александр Перетятко [42.9109994 - 74.5688830],[42.9110130 - 74.5689980] [42.9109264 - 74.5690170][42.9109128 - 74.5689020] Вот координаты района

И допустим одна точка дома 42.9109129 - 74.5689021 Он как бы не равен Координатам прямоугольника. Но входит в облать этого прямоугольника. Если загонять все возможные точки в массив. То у меня скрипт будет работать 20 лет. Это при том что всего лишь один домик.
Хорошо, когда район - это просто прямоугольник. А если там ломаные линии, выступы и обходы? Придется разбивать район на мелкие площади. И чем меньше они, тем точнее результат.
Назир Муксинов
Назир Муксинов
68 124
Александр Перетятко Да хоть на примере прямоугольников хоть какой то просвет дайте пожалуйста. А то как тёмный лес.
Чета одни велосипеды неэффективные тут.
Для PostgreSQL есть замечательный плагин PostGIS который добавляет георгафические/геометрические типы колонок (точка, линия, полигон), соотвествующие индексы и SQL функции типа "точка входит в полигон", "точка находится на линии", сортировки по удаленности и прочее прочее, тысячи всего.
В вашем случае район является полигоном (набором координат) и следует воспользоваться функцией вхождения точки в полигон.

Кстати БД OpenStreetMap как раз и использует PostGIS, и если ваши районы это сущности в OpenStreetMap то и делать со структурой БД ничего не надо, лишь написать один простой sql запрос

https://postgis.net/
Юрий А
Юрий А
7 216

Похожие вопросы