Проверьте, находится ли точка карты Google в многоугольнике с PHP


Я искал способ проверить, является ли точка частью многоугольника; этот многоугольник загружен из файла.

Все ответы, связанные с этим вопросом, решаются с помощью javascript, но я требую сделать это на стороне сервера; это потому, что результат не нужно показывать пользователю в качестве веб-клиента, его необходимо сохранить и позже использовать в качестве параметра для выбора группы пользователей (которые используют систему) внутри этой области (полигона).

Я искал API карт Google для PHP, но, похоже, его вообще не существует. Я нашел этот , но он не связан с Google и также фокусируется на интерфейсе.

Я также искал API REST; было бы относительно легко загрузить контент на мой php и проанализировать его, но, похоже, Google приложил все усилия к API JS.

Есть ли какой-либо обходной путь для этого?

Редактировать 1: Как и просил @Spacedman, формат файла - KML

Уточнение 1: Я ожидал что Google предоставляет инструмент для этого (как он существует в JS); анализ файла для проверки с помощью алгоритма - это возможность, и мне придется проверить, правильно ли он работает.

Author: Absulit, 2013-07-21

3 answers

Вы пробовали искать "точку php в полигоне" в вашей любимой поисковой системе? Лучший хит:

Http://assemblysys.com/php-point-in-polygon-algorithm/

Он использует алгоритм сканирования, и есть несколько примеров. Все, что вам нужно сделать, это прочитать файл полигона в нужном формате (вы забыли указать, какой у вас формат) и вызвать функцию.

 7
Author: Spacedman, 2013-07-21 07:43:42

Вы можете попробовать что-то вроде этого (в 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 является парой, точка находится снаружи, даже внутри

Проверка Полигонов Эрика Хейнса. Я позаимствовал эту идею у него.

Идея в том, что вы должны создать луч из своей точки и проверить, сколько пересечений между этим лучом и векторами полигонов

Алгоритм - это всего лишь немного алгебры, которую вы можете проверить в любой книге.

 1
Author: Pablo Pichel, 2014-01-09 21:49:59

Вы можете использовать расширение PHP V8 PECL для выполнения javascript в PHP. В качестве альтернативы, вы могли бы вызвать node.js скрипт, использующий команду оболочки (которая, по сути, делает то же самое).

Http://php.net/manual/en/book.v8js.php

Http://php.net/manual/en/function .shell-exec.php

 0
Author: Homer6, 2013-07-21 06:20:32