swen100/geophp

GeoPHP 是一个用于执行几何操作的开放源码原生 PHP 库。它完全用 PHP 编写,因此可以在共享主机上运行。它可以读取和写入多种格式:(E)WKT、(E)WKB、GeoJSON、KML、GPX、GeoRSS)。它支持所有 Simple-Feature 几何形状(点、线字符串、多边形、几何集合等),并可用于获取质心、边界框、面积以及其他大量有用信息。

v1.0.10 2022-08-19 05:52 UTC

This package is auto-updated.

Last update: 2024-09-18 15:59:58 UTC


README

Build Status Code Intelligence Status Scrutinizer Code Quality Latest Stable Version

geophp.net

GeoPHP 是一个用于执行几何操作的开放源码原生 PHP 库。它完全用 PHP 编写,因此可以在共享主机上运行。它可以读取和写入多种格式:WKT(包括 EWKT)、WKB(包括 EWKB)、GeoJSON、KML、GPX 和 GeoRSS。它支持所有 Simple-Feature 几何形状(点、线字符串、多边形、几何集合等),并可用于获取质心、边界框、面积以及其他大量有用信息。

这是著名 geoPHP 库(由 Patrick Hayes 编写)的分支。

geoPHP 还巧妙地包装了 GEOS php 扩展,以便在服务器上安装 GEOS 时,应用程序可以获得透明的性能提升。当安装了 GEOS 时,geoPHP 也完全符合 OpenGIS® 实施标准。使用 GEOS,您可以在 PHP 中获得完整的 openGIS 函数集,如并集、包含、接触等。这意味着应用程序获得了一组在所有环境中都适用的几何操作“核心集”,以及适用于已安装 GEOS 的环境的“扩展集”操作。

请参阅下面的 入门 部分,以获取 geoPHP 可以执行的所有操作的参考和示例。

欢迎提交分支和贡献。请打开 问题、发送 拉取请求,我将将其合并到主分支。

入门

示例用法

<?php
use \geoPHP\geoPHP;
// Polygon WKT example
$polygon = geoPHP::load('POLYGON((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2))','wkt');
$area = $polygon->getArea();
$centroid = $polygon->getCentroid();
$centX = $centroid->getX();
$centY = $centroid->getY();

print "This polygon has an area of ".$area." and a centroid with X=".$centX." and Y=".$centY;

// MultiPoint json example
print "<br/>";
$json = 
'{
   "type": "MultiPoint",
   "coordinates": [
       [100.0, 0.0], [101.0, 1.0]
   ]
}';

$multipoint = geoPHP::load($json, 'json');
$multipoint_points = $multipoint->getComponents();
$first_wkt = $multipoint_points[0]->out('wkt');

print "This multipoint has ".$multipoint->numGeometries()." points. The first point has a wkt representation of ".$first_wkt;

更多示例

Well Known Text (WKT) 和 Well Known Binary (WKB) 的支持非常适合与 MySQL 的或 PostGIS 的空间功能集成。一旦您使用 'AsText('geo_field')''AsBinary('geo_field')' 选择您的数据,就可以直接将其放入 geoPHP(可以是 wkt 或 wkb,但必须与您从数据库中提取的方式相同)

$geom = geoPHP::load($dbRow,'wkt');

您可以将多个几何形状收集到一个(请注意,您必须使用 wkt 进行此操作)

$geom = geoPHP::load("GEOMETRYCOLLECTION(".$dbString1.",".$dbString2.")",'wkt');

调用 get components 返回几何形状内的子几何形状作为数组。

$geom2 = geoPHP::load("GEOMETRYCOLLECTION(LINESTRING(1 1,5 1,5 5,1 5,1 1),LINESTRING(2 2,2 3,3 3,3 2,2 2))");
$geomComponents = $geom2->getComponents();    //an array of the two linestring geometries
$linestring1 = $geomComponents[0]->getComponents();	//an array of the first linestring's point geometries
$linestring2 = $geomComponents[1]->getComponents();
echo $linestring1[0]->x() . ", " . $linestring1[0]->y();    //outputs '1, 1'

另一种方法是使用 asArray() 方法。使用上面的两个线字符串几何集合,

$geometryArray = $geom2->asArray();
echo $geometryArray[0][0][0] . ", " . $geometryArray[0][0][1];    //outputs '1, 1'

显然,可以进行更复杂的分析。

echo $geom2->envelope()->area();

与 PostGIS 一起工作

geoPHP 通过其 EWKB 适配器与 postGIS 有良好的集成。以下是一个读取和写入 postGIS 几何形状的示例

<?php
use \geoPHP\geoPHP;
$host =     'localhost';
$database = 'phayes';
$table =    'test';
$column =   'geom';
$user =     'phayes';
$pass =     'supersecret';

$connection = pg_connect("host=$host dbname=$database user=$user password=$pass");

// Working with PostGIS and Extended-WKB
// ----------------------------

// Using asBinary and GeomFromWKB in PostGIS
$result = pg_fetch_all(pg_query($connection, "SELECT asBinary($column) as geom FROM $table"));
foreach ($result as $item) {
  $wkb = pg_unescape_bytea($item['geom']); // Make sure to unescape the hex blob
  $geom = geoPHP::load($wkb, 'ewkb'); // Now we have a full geoPHP geometry object
  
  // Let's insert it back into the database
  $wkbGeometryString = pg_escape_bytea($geom->out('ewkb'));
  pg_query($connection, "INSERT INTO $table ($column) values (GeomFromWKB('$wkbGeometryString'))");
}

// Using a direct SELECT and INSERT in PostGIS without using wrapping functions
$result = pg_fetch_all(pg_query($connection, "SELECT $column as geom FROM $table"));
foreach ($result as $item) {
  $wkb = pack('H*',$item['geom']);   // Unpacking the hex blob
  $geom = geoPHP::load($wkb, 'ewkb'); // Now we have a geoPHP geometry
  
  // To insert it directly into postGIS we need to unpack the WKB
  $unpackedGeomStr = unpack('H*', $geom->out('ewkb'));
  $geometryString = $unpackedGeomStr[1];
  pg_query($connection, "INSERT INTO $table ($column) values ('$geometryString')");
}

文档

正在进行中… 您可以在 geophp.net 上阅读原始 phayes/geoPHP 的文档

致谢

  • 维护者:Péter Báthory,Swen Zanon
  • 原始作者:Patrick Hayes

其他贡献者

此库是开源的,并且同时拥有修改后的BSD许可证和GPLv2的双许可证。您可以根据自己的选择使用任一许可证。