У меня есть только доступ к 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 и использовать пересечение точек с многоугольником.