Проверьте, находится ли точка карты Google в многоугольнике с PHP
Я искал способ проверить, является ли точка частью многоугольника; этот многоугольник загружен из файла.
Все ответы, связанные с этим вопросом, решаются с помощью javascript, но я требую сделать это на стороне сервера; это потому, что результат не нужно показывать пользователю в качестве веб-клиента, его необходимо сохранить и позже использовать в качестве параметра для выбора группы пользователей (которые используют систему) внутри этой области (полигона).
Я искал API карт Google для PHP, но, похоже, его вообще не существует. Я нашел этот , но он не связан с Google и также фокусируется на интерфейсе.
Я также искал API REST; было бы относительно легко загрузить контент на мой php и проанализировать его, но, похоже, Google приложил все усилия к API JS.
Есть ли какой-либо обходной путь для этого?
Редактировать 1: Как и просил @Spacedman, формат файла - KML
Уточнение 1: Я ожидал что Google предоставляет инструмент для этого (как он существует в JS); анализ файла для проверки с помощью алгоритма - это возможность, и мне придется проверить, правильно ли он работает.
3 answers
Вы пробовали искать "точку php в полигоне" в вашей любимой поисковой системе? Лучший хит:
Http://assemblysys.com/php-point-in-polygon-algorithm/
Он использует алгоритм сканирования, и есть несколько примеров. Все, что вам нужно сделать, это прочитать файл полигона в нужном формате (вы забыли указать, какой у вас формат) и вызвать функцию.
Вы можете попробовать что-то вроде этого (в php должно быть похоже):
int iCheck=0;
for (i = 0, v = HowManyVecotrsHasThePolygon - 1; i < HowManyVecotrsHasThePolygon; v = i++)
{
if (((vectorPointLatitud[i] > ptoLatitud) != (vectorPointLatitud[v] > ptoLatitud)) && (ptoLongitud < (vectorPointLongitud[v] - vectorPointLongitud[i]) * (ptoLatitud - vectorPointLatitud[i]) / (vectorPointLatitud[v] - vectorPointLatitud[i]) + vectorPointLongitud[i]))
iCheck++;
}
Если iCheck является парой, точка находится снаружи, даже внутри
Проверка Полигонов Эрика Хейнса. Я позаимствовал эту идею у него.
Идея в том, что вы должны создать луч из своей точки и проверить, сколько пересечений между этим лучом и векторами полигонов
Алгоритм - это всего лишь немного алгебры, которую вы можете проверить в любой книге.
Вы можете использовать расширение PHP V8 PECL для выполнения javascript в PHP. В качестве альтернативы, вы могли бы вызвать node.js скрипт, использующий команду оболочки (которая, по сути, делает то же самое).