1

我只能访问 PHP5(没有 PostGIS)

我有一堆郊区 shapefile,以及一些带有 lat-lon 点的事件。我对 shapefile 的经验为零。

检查哪些 shapefile 包含这些经纬度点的最佳方法是什么(仅使用 PHP)?

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

还是这些用于加载/使用 Shapefile 的很棒的 PHP 库?

4

3 回答 3

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

于 2011-11-17T20:29:20.613 回答
1

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

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

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

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

于 2011-11-07T01:24:14.053 回答
1

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

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

于 2019-08-30T15:57:03.383 回答