我只能访问PHP5(没有PostGIS)
我有一堆郊区shapefile,以及一些带有lat-lon点的事件。我对shapefile没有经验。
检查哪些shapefile包含这些lat-long点(仅使用PHP)的最佳方法是什么?
我是否将shapefile转换为lat-long多边形并使用标准的多边形点交叉方程?
或者这些是用于加载/使用Shapefiles的一些很棒的PHP库吗?
答案 0 :(得分:2)
每个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
答案 1 :(得分:1)
要使用shapefile,我建议将它们加载到具有空间关系的数据库中,并使用数据库的空间关系功能。
我个人使用PostgreSQL和PostGIS扩展程序。它有一个实用程序,用于将shapefile转换为SQL插入。然后你可以把你的观点放到WKT(众所周知的文本)中,并在数据库中查询它与之相交的shapefile。
我不相信php本身有任何用于处理GIS的内置函数。
编辑 - 该死的 - 对不起,直到帖子发布后我才看到(没有PostGIS)部分。您可以将多边形转换为wkt并使用多边形点交点。
答案 2 :(得分:1)
我知道这个问题已经很老了,但是作为对社区和希望在本机PHP中寻求类似功能的未来用户的一种服务,我想指出,我的PHP Shapefile是一个免费的开源PHP可以读写任何ESRI Shapefile的库,而无需任何第三方依赖性。
链接到GitHub项目:https://github.com/gasparesganga/php-shapefile