wgirhad / geophp
开源的本地PHP库,用于执行几何运算。可以读取和写入多种格式:(E)WKT, (E)WKB, TWKB, GeoJSON, KML, GPX, GeoRSS。支持所有Simple-Feature几何形状(点、线段、多边形...),并可用来获取质心、边界框、面积等。
Requires
- php: ^7.1|^8.0
Requires (Dev)
- php-coveralls/php-coveralls: 2.*
- phpbench/phpbench: ^1.0
- phpstan/phpstan: ^1.4.0
- phpunit/phpunit: ^8.0|^9.0
- squizlabs/php_codesniffer: 3.*
Suggests
- ext-geos: GEOS allows more advanced operations
Provides
- geophp/geophp: 3.0.0
This package is not auto-updated.
Last update: 2024-09-26 00:24:45 UTC
README
GeoPHP是一个用于执行几何运算的开源本地PHP库。它是著名的geoPHP库,由Patrick Hayes创建的分支。
关于此仓库的说明
此分支旨在统一来自原始phayes/geoPHP工作的最相关的分支
目标
该库完全用PHP编写,因此可以在共享主机上运行。它可以读取和写入多种格式:WKT (EWKT)、WKB (EWKB)、TWKB、GeoJSON、KML、GPX和GeoRSS。它支持所有Simple-Feature几何形状(点、线段、多边形、几何集合等),并可用来获取质心、边界框、面积等众多有用的信息。
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->area(); $centroid = $polygon->centroid(); $centX = $centroid->x(); $centY = $centroid->y(); 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')'
SELECT了数据,就可以直接将其放入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一起工作
通过其EWKB适配器,geoPHP与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'); // We now a full geoPHP Geometry object // Let's insert it back into the database $insert_string = pg_escape_bytea($geom->out('ewkb')); pg_query($connection, "INSERT INTO $table ($column) values (GeomFromWKB('$insert_string'))"); } // Using a direct SELECT and INSERTs 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'); // We now have a geoPHP Geometry // To insert directly into postGIS we need to unpack the WKB $unpacked = unpack('H*', $geom->out('ewkb')); $insert_string = $unpacked[1]; pg_query($connection, "INSERT INTO $table ($column) values ('$insert_string')"); }
文档
正在进行中…您可以在geophp.net上阅读原始phayes/geoPHP的文档
致谢
- 维护者:Péter Báthory
- 原作者:Patrick Hayes
其他贡献者
- GeoMemes Research (http://www.geomemes.com)
- HighWire Press (http://www.highwire.org) 和 GeoScienceWorld (http://www.geoscienceworld.org)
- Arnaud Renevier (gisconverter.php) https://github.com/arenevier/gisconverter.php
- Dave Tarc https://github.com/dtarc
- Elliott Hunston (文档) https://github.com/ejh
此库是开源的,并双重许可,同时遵循修改后的BSD许可证和GPLv2。您可以根据需要选择任一许可证。