webnuvola / geo
Requires
- php: >=7.1
Requires (Dev)
- brick/reflection: 0.2.*
- doctrine/data-fixtures: 1.*
- doctrine/orm: 2.*
- php-coveralls/php-coveralls: 2.*
- phpunit/phpunit: 7.*
Suggests
- ext-json: To read and write GeoJSON files
Replaces
- brick/geo: 0.2.3
This package is auto-updated.
Last update: 2024-09-26 02:34:11 UTC
README
一组用于处理 GIS 几何形状的类。
简介
此库是 OpenGIS 规范 的 PHP 实现。
它本质上是一个第三方 GIS 引擎的包装器,将大部分几何计算的复杂性委托给它。支持多种引擎,从本机 PHP 扩展(如 GEOS)到 GIS 兼容数据库(如 MySQL 或 PostgreSQL)。
要求和安装
此库需要 PHP 7.1 或更高版本。对于 PHP 5.6 和 PHP 7.0 的支持,请使用版本 0.1
。
使用 Composer 安装库
composer require brick/geo
然后前往 配置 部分,以配置 GIS 几何引擎。
未能配置几何引擎会导致在尝试使用需要它的方法时抛出 GeometryEngineException
。
项目状态和发布过程
此库仍在开发中。
当前发布版本编号为 0.x.y
。当引入非破坏性更改(添加新方法、优化现有代码等)时,y
会递增。
当引入破坏性更改时,始终会启动一个新的 0.x
版本周期。
因此,可以将您的项目锁定到给定的发布周期,例如 0.2.*
。
如果您需要升级到较新的发布周期,请查看 发布历史,了解每个后续 0.x.0
版本引入的更改列表。
配置
配置库包括选择最适合您安装的 GeometryEngine
实现。以下实现可用
PDOEngine
:通过PDO
连接与 GIS 兼容数据库进行通信。
此引擎当前支持以下数据库- MySQL 版本 5.6 或更高。
注意:MySQL 当前仅支持 2D 几何形状。 - MariaDB 版本 5.5 或更高。
- PostgreSQL 配置了 PostGIS 扩展。
- MySQL 版本 5.6 或更高。
SQLite3Engine
:通过带有 SQLite3 数据库和 SpatiaLite 扩展的SQLite3
与之通信。GEOSEngine
:使用 GEOS PHP 绑定。
以下是一个所有可能配置的逐步指南
使用 PDO 和 MySQL 5.6 或更高版本
-
确保您的 MySQL 版本至少为
5.6
。
早期版本仅基于边界框提供部分 GIS 支持,不受支持。 -
在您的项目中使用此引导代码
use Brick\Geo\Engine\GeometryEngineRegistry; use Brick\Geo\Engine\PDOEngine; $pdo = new PDO('mysql:host=localhost', 'root', ''); GeometryEngineRegistry::set(new PDOEngine($pdo));
使用您自己的连接参数更新代码,或者如果您已有现有的 PDO
连接,请使用它(推荐)。
使用 PDO 和 MariaDB 5.5 或更高版本
MariaDB 是 MySQL 的分支,因此您可以遵循与 MySQL 相同的程序。只需确保您的 MariaDB 版本为 5.5
或更高即可。
使用 PDO 和带有 PostGIS 的 PostgreSQL
-
如果需要,请在数据库服务器上启用 PostGIS
CREATE EXTENSION postgis;
-
在您的项目中使用此引导代码
use Brick\Geo\Engine\GeometryEngineRegistry; use Brick\Geo\Engine\PDOEngine; $pdo = new PDO('pgsql:host=localhost', 'postgres', ''); GeometryEngineRegistry::set(new PDOEngine($pdo));
使用您自己的连接参数更新代码,或者如果您已有现有的 PDO
连接,请使用它(推荐)。
使用 PDO 和 SQLite 与 SpatiaLite 结合
由于 PDO_SQLITE 驱动程序的限制,目前无法使用 SELECT LOAD_EXTENSION()
查询加载 SpatiaLite 扩展,因此您不能使用 PDO 驱动程序与 SpatiaLite 结合。
您需要使用 SQLite3 驱动程序。注意,您可以继续使用现有的 PDO_SQLITE 代码,您需要做的只是创建一个额外的内存中 SQLite3 数据库,仅用于驱动几何引擎。
使用 SQLite3 与 SpatiaLite 结合
-
请确保您的系统已安装 SpatiaLite。
-
请确保您的
php.ini
中启用了 SQLite3 扩展。extension=sqlite3.so
-
请确保在您的
php.ini
中配置了 SpatiaLite 安装目录的 SQLite3 扩展目录。[sqlite3] sqlite3.extension_dir = /usr/lib
-
在您的项目中使用此引导代码
use Brick\Geo\Engine\GeometryEngineRegistry; use Brick\Geo\Engine\SQLite3Engine; $sqlite3 = new SQLite3(':memory:'); $sqlite3->loadExtension('mod_spatialite.so'); GeometryEngineRegistry::set(new SQLite3Engine($sqlite3));
在本示例中,我们为我们的 GIS 计算创建了一个内存数据库,但您也可以使用现有的 SQLite3
连接。
使用 GEOS PHP 绑定
-
请确保您的服务器已安装 GEOS 的 PHP 绑定(从 GEOS 3.6.0 开始;之前的版本需要使用
--enable-php
标志编译 GEOS)。 -
请确保您的
php.ini
中启用了 GEOS 扩展。extension=geos.so
-
在您的项目中使用此引导代码
use Brick\Geo\Engine\GeometryEngineRegistry; use Brick\Geo\Engine\GEOSEngine; GeometryEngineRegistry::set(new GEOSEngine());
几何层次结构
所有几何对象都位于 Brick\Geo
命名空间中,并扩展一个基类 Geometry
。
- Geometry
抽象
几何异常
所有几何异常都位于 Brick\Geo\Exception
命名空间中,并扩展一个基类 GeometryException
对象。
几何异常是细粒度的:在整个项目中只抛出基类 GeometryException
的子类。这使用户可以选择只捕获特定异常,或捕获所有与几何相关的异常。
以下是所有异常的列表
CoordinateSystemException
在混合具有不同 SRID 或维度的对象时抛出(例如,XY 与 XYZ)EmptyGeometryException
在尝试访问空几何上的不存在属性时抛出GeometryEngineException
在当前几何引擎不支持功能时抛出GeometryIOException
在读取或写入(E)WKB/T 数据时发生错误时抛出InvalidGeometryException
在创建无效的几何体时抛出,例如仅有一个Point
的LineString
NoSuchGeometryException
在尝试在集合中获取一个不存在索引的几何体时抛出UnexpectedGeometryException
在几何体不是期望子类型实例时抛出,例如使用Point::fromText()
时传递了一个LineString
WKT
示例
use Brick\Geo\Polygon;
$polygon = Polygon::fromText('POLYGON ((0 0, 0 3, 3 3, 0 0))');
echo $polygon->area(); // 4.5
$centroid = $polygon->centroid();
echo $centroid->asText(); // POINT (1 2)
空间函数参考
这是 geo 项目中当前实现的所有函数的列表。某些函数仅在您使用特定几何引擎时可用,有时需要最低版本。此表还显示了哪些函数是 OpenGIS 标准的一部分。
导入和导出几何体
此库支持从以下格式导入和导出:
- WKT
- WKB
- EWKT
- EWKB
- GeoJSON
WKT
Well-Known Text是几何形状的标准文本格式。
每个Geometry类都提供了一个便捷的方法fromText()
,该方法接受一个WKT字符串和一个可选的SRID,并返回一个Geometry对象
use Brick\Geo\Point; $point = Point::fromText('POINT (1.5 2.5)', 4326);
可以使用便捷方法asText()
将几何形状转换为WKT
echo $point->asText(); // POINT (1.5 2.5)
您还可以直接使用WKTReader和WKTWriter类;后者允许您格式化输出。
WKB
Well-Known Binary是几何形状的标准二进制格式。
每个Geometry类都提供了一个便捷的方法fromBinary()
,该方法接受一个WKB二进制字符串和一个可选的SRID,并返回一个Geometry对象
use Brick\Geo\Point; $point = Point::fromBinary(hex2bin('0101000000000000000000f83f0000000000000440'), 4326); echo $point->asText(); // POINT (1.5 2.5) echo $point->SRID(); // 4326
可以使用便捷方法asBinary()
将几何形状转换为WKB
echo bin2hex($point->asBinary()); // 0101000000000000000000f83f0000000000000440
您还可以直接使用WKBReader和WKBWriter类;后者允许您选择输出的字节序(大端或小端)。
EWKT
Extended WKT是PostGIS特定的文本格式,它包括几何对象的SRID,这是标准WKT格式中缺少的。您可以使用EWKTReader和EWKTWriter类导入和导出此格式
use Brick\Geo\Point; use Brick\Geo\IO\EWKTReader; use Brick\Geo\IO\EWKTWriter; $reader = new EWKTReader(); $point = $reader->read('SRID=4326; POINT (1.5 2.5)'); echo $point->asText(); // POINT (1.5 2.5) echo $point->SRID(); // 4326 $writer = new EWKTWriter(); echo $writer->write($point); // SRID=4326; POINT (1.5 2.5)
EWKB
Extended WKB是PostGIS特定的二进制格式,它包括几何对象的SRID,这是标准WKB格式中缺少的。您可以使用EWKBReader和EWKBWriter类导入和导出此格式
use Brick\Geo\Point; use Brick\Geo\IO\EWKBReader; use Brick\Geo\IO\EWKBWriter; $reader = new EWKBReader(); $point = $reader->read(hex2bin('0101000020e6100000000000000000f83f0000000000000440')); echo $point->asText(); // POINT (1.5 2.5) echo $point->SRID(); // 4326 $writer = new EWKBWriter(); echo bin2hex($writer->write($point)); // 0101000020e6100000000000000000f83f0000000000000440
GeoJSON
GeoJSON是基于JSON的用于表示简单地理特征的开放标准格式,并在RFC 7946中标准化。
此库支持使用GeoJSONReader和GeoJSONWriter类从GeoJSON文档导入几何形状并将其导出
use Brick\Geo\Point; use Brick\Geo\IO\GeoJSONReader; use Brick\Geo\IO\GeoJSONWriter; $reader = new GeoJSONReader(); $point = $reader->read('{ "type": "Point", "coordinates": [1, 2] }'); echo $point->asText(); // POINT (1 2) echo $point->SRID(); // 4326 $writer = new GeoJSONWriter(); echo $writer->write($point); // {"type":"Point","coordinates":[1,2]}
请注意,Feature
作为Geometry
对象导入,FeatureCollection
作为GeometryCollection
对象导入。忽略非空间属性。
GeoJSON旨在仅支持WGS84,因此所有几何形状都使用SRID 4326导入。