Intereting Posts
Ошибка PHP: php_network_getaddresses: getaddrinfo не удалось: (при получении информации с другого сайта.) PHP Получить протокол URL сайта – http vs https SQL Query On Date, когда тип VARCHAR удалить дубликаты из строки, разделенной запятыми Анализ данных из базы данных Викисловаря XML в базе данных MySQL с использованием PHP Как я могу программно вернуть деньги с помощью PayPal? Почему md5 ('240610708') равен md5 ('QNKCDZO')? Ошибка MySQL: «Количество столбцов не соответствует количеству значений в строке 1» – помощь для начинающих ssh2_exec не выполняет простую команду Как разделить значение ключевого слова массива, разделенное запятыми в PHP? cakephp с использованием таблиц многократного поиска случайный многомерный массив php и получить исходный индекс массива Специальные символы PHP Выполнить загрузку в шаблоне WordPress? Как определить, было ли установлено и настроено веб-приложение?

Как я могу решить, какой шейп-файл (пригород) содержит заданную точку lat-lon в PHP

У меня есть только доступ к PHP5 (без PostGIS)

У меня есть куча пригородов шейп-файлов, а также несколько событий с латинскими очками. У меня нет опыта с шейп-файлами.

Каков наилучший способ проверить, какие шейп-файлы содержат эти длинные точки (используя только PHP)?

Преобразовать ли шейп-файлы в многоугольник с длинным долгом и использовать стандартное уравнение пересечения точек полигона?

Или это какая-то потрясающая библиотека PHP для загрузки / работы с Shapefiles?

Каждый файл формы состоит из трех частей: shp, shx, dbf. Файл shp содержит геометрию, shx – это индекс, который помогает получить доступ к shp, dbf – это простой старый dbase-файл, содержащий данные для каждой записи.

Вы можете извлечь ограничительную рамку из файла shp следующим образом:

$handle = fopen("path/to/file.shp","rb"); fseek($handle, 36); $min_x = unpack("d",fread($handle,8); $min_y = unpack("d",fread($handle,8); $max_x = unpack("d",fread($handle,8); $max_y = unpack("d",fread($handle,8); // Note, this code will only work on a little-endian machine // You'll need to do a byte swap on big endian systems 

Затем вы можете проверить, находится ли данное событие в ограничивающей рамке шейп-файла.

 if (($event_x >= $min_x) && ($event_x <= $max_x) && ($event_y >= $min_y) && ($event_y <= $max_y)) 

Вы можете поместить это цикл и получить подмножество вашего шейп-файла, который перекрывается с данным событием. Это не означает, что событие находится внутри многоугольника в заданном шейп-файле, но оно приблизит вас. Если вам нужно точное решение, вам нужно будет извлечь полигоны и сделать точку в полигоне.

Отказ от ответственности: рассмотрим приведенный выше код псевдокода, я не знаю php, поэтому, вероятно, есть некоторые ошибки. Кроме того, если вы можете переключиться на python, все будет намного проще, существуют существующие библиотеки, которые предоставляют анализ синтаксиса и пространственное индексирование, поэтому вы можете точно определить, с каким полигоном точка пересекается с очень эффективным образом.

Ссылка: ESRI Shapefile Техническая документация, http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf

Для работы с шейп-файлами я предлагаю загрузить их в базу данных с пространственными отношениями и использовать возможности пространственной связи базы данных.

Я лично использую PostgreSQL с расширением PostGIS для этого. Он имеет утилиту для преобразования шейп-файлов в SQL-вставку. Затем вы можете поместить свою точку в WKT (хорошо известный текст) и запросить базу данных для того, с каким файлом (-ами) она пересекается.

Я не верю, что у php есть встроенные функции для работы с ГИС.

EDIT – Черт, извините, я не видел часть (без PostGIS) до публикации. Возможно, вы сможете преобразовать свои полигоны в wkt и использовать пересечение точек с многоугольником.