我只能访问 PHP5(没有 PostGIS)
我有一堆郊区 shapefile,以及一些带有 lat-lon 点的事件。我对 shapefile 的经验为零。
检查哪些 shapefile 包含这些经纬度点的最佳方法是什么(仅使用 PHP)?
我是否将 shapefile 转换为 lat-long 多边形并使用标准多边形点相交方程?
还是这些用于加载/使用 Shapefile 的很棒的 PHP 库?
每个 shapefile 由 3 个部分组成,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
然后您可以测试给定事件是否位于 shapefile 的边界框中。
if (($event_x >= $min_x) && ($event_x <= $max_x)
&& ($event_y >= $min_y) && ($event_y <= $max_y))
您可以将此作为一个循环并获取与给定事件重叠的 shapefile 子集。这并不意味着您的事件在给定 shapefile 的多边形内,但它会让您接近。如果您需要一个精确的解决方案,您必须提取多边形并在多边形测试中做一个点。
免责声明:考虑上面的代码伪代码,我不知道php,所以可能存在一些错误。此外,如果您可以切换到 python,事情会变得容易得多,现有的库可以提供 shapefile 解析和空间索引,因此您可以以高效的方式准确地确定一个点与哪些多边形相交。
参考:ESRI Shapefile 白皮书,http ://www.esri.com/library/whitepapers/pdfs/shapefile.pdf
要使用 shapefile,我建议将它们加载到具有空间关系的数据库中,并使用数据库的空间关系功能。
我个人为此使用带有 PostGIS 扩展的 PostgreSQL。它有一个用于将 shapefile 转换为 SQL 插入的实用程序。然后,您可以将您的观点放入 WKT(众所周知的文本)并查询数据库以了解它与哪些 shapefile 相交。
我不相信 php 本身有任何用于处理 GIS 的内置函数。
编辑-该死的-对不起,直到发布后我才看到(没有 PostGIS)部分。您也许可以将多边形转换为 wkt 并使用多边形点相交。
我知道这个问题已经很老了,但是作为对社区和未来用户在原生 PHP 中寻找类似功能的服务,我想指出我的PHP Shapefile是一个免费和开源的 PHP 库,可以读写任何 ESRI Shapefile,没有任何第三方依赖。
GitHub 项目链接:https ://github.com/gasparesganga/php-shapefile