我如何在PHP中确定哪个shapefile(郊区)包含给定的延迟点?


How do I work out which shapefile (suburb) contains a given lat-lon point in PHP

我只能访问PHP5(没有PostGIS)

我有一堆郊区的形状文件,和一些事件与晚lon点。我对shapefiles没有任何经验。

检查哪些形状文件包含这些lat_long点(仅使用PHP)的最佳方法是什么?

我是否将shapefiles转换为latlong多边形并使用标准多边形-点相交方程?

或者这些是一些很棒的PHP库加载/工作与Shapefiles?

每个shapefile由shp,shx,dbf 3部分组成。shp文件包含几何图形,shx是帮助访问shp的索引,dbf是普通的旧数据库文件,包含每条记录的数据。

您可以从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,所以可能有一些bug。此外,如果你能切换到python,事情会变得容易得多,有一些现有的库提供了shapefile解析和空间索引,所以你可以以一种高效的方式准确地确定一个点与哪些多边形相交。

Ref: ESRI Shapefile白皮书,http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf

要处理shapefile,我建议将它们加载到具有空间关系的数据库中,并使用数据库的空间关系功能。

我个人使用PostgreSQL与PostGIS扩展。它有一个将shapefile转换为SQL插入的实用程序。然后,您可以将您的点放入WKT(众所周知的文本)并查询数据库中与之相交的shapefile。

我不相信php本身有任何内置的函数来处理GIS。

编辑-该死的-对不起,我没有看到(没有PostGIS)部分,直到帖子之后。您可以将多边形转换为wkt,并使用多边形点相交。

我知道这个问题相当老了,但是作为对社区和未来在本机PHP中寻找类似功能的用户的服务,我想指出我的PHP Shapefile是一个免费的开源PHP库,可以读写任何ESRI Shapefile,而不依赖于任何第三方。

链接到GitHub项目:https://github.com/gasparesganga/php-shapefile