lyhty/geometry

Laravel 的几何库。

v0.6.0 2024-09-21 19:43 UTC

This package is auto-updated.

Last update: 2024-09-21 19:44:27 UTC


README

Latest Version on Packagist PHP Laravel Total Downloads License

本包提供了解析和写入各种几何数据格式的工具,并支持通过自定义适配器进行扩展。

本包深受以下包的启发,并借鉴了许多东西:由 @phayes 开发的 geoPHP 和由 @grimzy 开发的 laravel-mysql-spatial

本包还提供了一个模型特性,它将OGC标准的空间函数添加到模型及其查询构建器中。

本包的许多功能依赖于系统上已安装的 geosphp-geos PHP 扩展。但是,本包不要求安装这些扩展,但许多功能将不可用。

安装

使用Composer安装包

composer require lyhty/geometry

包将自动注册自己。

几何模型

本包包含以下几何类型的类

  • Point: Lyhty\Geometry\Types\Point
  • LineString: Lyhty\Geometry\Types\LineString
  • Polygon: Lyhty\Geometry\Types\Polygon
  • MultiPoint: Lyhty\Geometry\Types\MultiPoint
  • MultiLineString: Lyhty\Geometry\Types\MultiLineString
  • MultiPolygon: Lyhty\Geometry\Types\MultiPolygon
  • GeometryCollection: Lyhty\Geometry\Types\GeometryCollection

所有这些类都扩展了抽象类 Lyhty\Geometry\Types\Geometry。此外,除了 Point 类型外,所有类都扩展了 Lyhty\Geometry\Types\Collection 类。

使用这些类可以轻松创建自己的几何对象。例如

$p1 = new Point(0, 4);
$p2 = new Point(1, 5);
$p3 = new Point(2, 6);
$p4 = new Point(3, 7);

$ls1 = new LineString([$p1, $p2]);
$ls2 = new LineString([$p3, $p4]);
$mp = new MultiPoint([$p1, $p2, $p3, $p4]);

$g = new Polygon([$ls1, $ls2]);
$c = new GeometryCollection([$p1, $ls1, $mp, $p1]);

断言

¹ 功能需要 geos
² 功能如果可用则利用 geos

这些模型提供了各种断言方法

  • Geometry::contains(Geometry $geometry): bool¹
    • 返回一个布尔值,表示给定的几何体是否包含在几何体中。
  • Geometry::covers(Geometry $geometry): bool¹
    • 返回一个布尔值,表示几何体是否覆盖了给定的几何体。
  • Geometry::coveredBy(Geometry $geometry): bool¹
    • 返回一个布尔值,表示几何体是否被给定的几何体覆盖。
  • Geometry::crosses(Geometry $geometry): bool¹
    • 返回一个布尔值,表示几何体是否与给定的几何体相交。
  • Geometry::disjoint(Geometry $geometry): bool¹
    • 返回一个布尔值,表示几何体是否与给定的几何体不重叠。
  • Geometry::equals(Geometry $geometry): bool¹
    • 返回一个布尔值,表示几何体是否“空间上等于”给定的几何体。
  • Geometry::equalsExact(Geometry $geometry): bool¹
    • 返回一个布尔值,表示此几何对象是否与另一个对象完全相同,包括组成部分的顺序。
  • Geometry::intersects(Geometry $geometry): bool¹
    • 返回一个布尔值,表示几何体是否与给定的几何体相交。
  • Geometry::overlaps(Geometry $geometry): bool¹
    • 返回一个布尔值,表示几何体是否与给定的几何体重叠。
  • Geometry::touches(Geometry $geometry): bool¹
    • 返回一个布尔值,表示几何体是否接触给定的几何体。
  • Geometry::within(Geometry $geometry): bool¹
    • 返回布尔值,表示该几何形状是否在给定的几何形状内。

操作

¹ 功能需要 geos
² 功能如果可用则利用 geos

  • Geometry::area(): float
    • 以几何形状的空间参考系统为基准,测量此多边形(或GeometryCollection)的面积。
  • Geometry::boundary(): LineString|Point
    • 返回此几何对象的组合边界的闭包。
  • Geometry::buffer(float $distance): Geometry¹
    • 返回一个具有给定宽度的围绕此几何形状的缓冲区域。
  • Geometry::checkValidity(): bool¹
    • 返回一个布尔值,表示几何形状是否“有效”。
  • Geometry::convexHull(): Geometry
    • 返回表示此几何对象凸包的几何对象。
  • Geometry::difference(Geometry $geometry): Geometry
    • 返回一个表示此几何对象与给定几何形状点集差的几何对象。
  • Geometry::distance(Geometry $geometry): float
    • 返回两个几何对象中任意两点之间的最短距离,该距离以此几何对象的空间参考系统为基准计算。
  • Geometry::envelope(): Polygon²
    • 此几何形状的最小边界框,以Geometry返回。
  • Geometry::greatCircleLength(): float
  • Geometry::hausdorffDistance(Geometry $geometry): float¹
  • Geometry::haversineLength(): float
  • Geometry::intersection(Geometry $geometry): Geometry¹
    • 返回一个表示此几何对象与给定几何形状点集交集的几何对象。
  • Geometry::length(): float
    • 获取几何形状在其相关空间参考中的长度。
  • Geometry::relate(Geometry $geometry, $pattern = null)¹
    • 计算与给定几何形状的空间关系的交集矩阵。
  • Geometry::simplify(float $tolerance, bool $preserveTopology = false): Geometry¹
    • 使用标准Douglas-Peucker算法简化几何形状。
  • Geometry::symDifference(Geometry $geometry): Geometry¹
    • 返回一个表示此几何对象与给定几何形状点集对称差的几何对象。
  • Geometry::union(Geometry|array $geometry)¹
    • 返回一个表示此几何对象与给定几何形状点集并集的几何对象。

格式化

  • Geometry::format(string $format, ...$args): mixed
    • 将几何形状输出到指定的适配器格式。请参阅适配器
  • Geometry::toWKT(): string
    • 别名:Geometry::format('wkt')
  • Geometry::toText(): string
    • 别名:Geometry::toWKT()
  • Geometry::toBinary(bool $asHex = false): string
    • 别名:Geometry::format('wkb', $asHes)
  • Geometry::toArray()
    • Arrayable接口方法。将实例格式化为一个符合geojson结构标准的数组。
  • Geometry::toJson($options = 0)
    • Jsonable接口方法。返回geojson格式的几何形状的json字符串。
  • Geometry::jsonSerialize(): mixed

其他显著方法

  • Geometry::centroid(): Point|null²
    • 此几何形状的数学质心,作为点。对于多边形,结果不保证是内部的。
  • Geometry::getBBox(): array|null²
    • 此几何形状的最小边界框,以数组返回。
  • Geometry::pointOnSurface(): Point¹
    • 一个保证在多边形内的点。
  • Geometry::explode(): array|null
    • 将几何形状分解为LineString实例的数组。

Geometry工厂

该软件包还提供了一个强大的类,帮助您解析、写入和操作几何数据。

该类可以通过外观类Lyhty\Geometry\Geom访问。

解析与格式化

解析和格式化通过适配器完成。

  • Geom::parse($data, $type, ...$otherArgs)
    • 从适配器格式(如wkt)加载数据到几何体。
  • Geom::format(Geometry $geometry, $format, ...$otherArgs)
    • 将几何体输出到指定的适配器格式。

适配器

默认情况下,该包支持以下标准和服务的解析和写入

Lyhty\Geometry\Eloquent\HasGeometryAttributes

有时在我们的应用程序中,我们需要将具有几何列的模型设置为模型。该包提供了一种可以添加到您的模型中的特质,该特质将几何列的二进制字符串转换为交互式的 Lyhty\Geometry\Types\Geometry 实例!现在所有列出的方法都可以与模型一起使用!

您必须以以下方式在模型中列出几何属性

class Example extends Model
{
    use HasGeometryAttributes;

    protected array $geometryAttributes = [
        'home_yard_boundary'
    ];
}

特质将覆盖模型中使用的特质的 Illuminate\Database\Eloquent\BuilderIlluminate\Database\Query\Builder 实例,使用包的相应构建类。这是使几何数据存储到数据库中工作所必需的。此外,几个几何查询范围是基本查询构建器的一部分。

查询范围

  • Builder::selectDistanceValue($column, Geometry $geometry)
  • Builder::selectDistanceSphereValue($column, Geometry $geometry)
  • Builder::whereDistance($column, Geometry $geometry, $distance)
  • Builder::whereDistanceSphere($column, Geometry $geometry, $distance)
  • Builder::whereDistanceExcludingSelf($column, Geometry $geometry, $distance)
  • Builder::whereDistanceSphereExcludingSelf($column, Geometry $geometry, $distance)
  • Builder::whereWithin($column, Geometry $geometry)
  • Builder::whereCrosses($column, Geometry $geometry)
  • Builder::whereContains($column, Geometry $geometry)
  • Builder::whereDisjoint($column, Geometry $geometry)
  • Builder::whereEquals($column, Geometry $geometry)
  • Builder::whereIntersects($column, Geometry $geometry)
  • Builder::whereOverlaps($column, Geometry $geometry)
  • Builder::whereTouches($column, Geometry $geometry)
  • Builder::orderByDistance($column, Geometry $geometry, $direction = 'asc')
  • Builder::orderByDistanceSphere($column, Geometry $geometry, $direction = 'asc')