GIS 几何库

维护者

详细信息

github.com/Webnuvola/geo

源代码

安装: 8

依赖: 0

建议: 0

安全: 0

星标: 0

关注者: 2

分支: 32

0.2.3 2019-03-25 13:48 UTC

This package is auto-updated.

Last update: 2024-09-26 02:34:11 UTC


README

一组用于处理 GIS 几何形状的类。

Build Status Coverage Status Latest Stable Version Total Downloads License

简介

此库是 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 扩展。
  • 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 已安装在您的服务器上

  • 如果需要,请在数据库服务器上启用 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

几何异常

所有几何异常都位于 Brick\Geo\Exception 命名空间中,并扩展一个基类 GeometryException 对象。

几何异常是细粒度的:在整个项目中只抛出基类 GeometryException 的子类。这使用户可以选择只捕获特定异常,或捕获所有与几何相关的异常。

以下是所有异常的列表

  • CoordinateSystemException 在混合具有不同 SRID 或维度的对象时抛出(例如,XY 与 XYZ)
  • EmptyGeometryException 在尝试访问空几何上的不存在属性时抛出
  • GeometryEngineException 在当前几何引擎不支持功能时抛出
  • GeometryIOException 在读取或写入(E)WKB/T 数据时发生错误时抛出
  • InvalidGeometryException 在创建无效的几何体时抛出,例如仅有一个 PointLineString
  • 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)

您还可以直接使用WKTReaderWKTWriter类;后者允许您格式化输出。

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

您还可以直接使用WKBReaderWKBWriter类;后者允许您选择输出的字节序(大端或小端)。

EWKT

Extended WKT是PostGIS特定的文本格式,它包括几何对象的SRID,这是标准WKT格式中缺少的。您可以使用EWKTReaderEWKTWriter类导入和导出此格式

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格式中缺少的。您可以使用EWKBReaderEWKBWriter类导入和导出此格式

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中标准化。

此库支持使用GeoJSONReaderGeoJSONWriter类从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导入。