lyhty / geometry
Laravel 的几何库。
Requires
- php: ^8.0.2 | ^8.2
- geo-io/wkb-generator: ^1.0
- geo-io/wkb-parser: ^1.0
- illuminate/database: ^8.0 | ^9.0 | ^10.0 | ^11.0
- illuminate/support: ^8.0 | ^9.0 | ^10.0 | ^11.0
Requires (Dev)
- laravel/laravel: ^8.0 | ^9.0
- mockery/mockery: ^1.3
- phpunit/phpunit: ^9.3.3
Suggests
- geos: *
README
本包提供了解析和写入各种几何数据格式的工具,并支持通过自定义适配器进行扩展。
本包深受以下包的启发,并借鉴了许多东西:由 @phayes 开发的 geoPHP 和由 @grimzy 开发的 laravel-mysql-spatial。
本包还提供了一个模型特性,它将OGC标准的空间函数添加到模型及其查询构建器中。
本包的许多功能依赖于系统上已安装的 geos 和 php-geos PHP 扩展。但是,本包不要求安装这些扩展,但许多功能将不可用。
安装
使用Composer安装包
composer require lyhty/geometry
包将自动注册自己。
几何模型
本包包含以下几何类型的类
Point:Lyhty\Geometry\Types\PointLineString:Lyhty\Geometry\Types\LineStringPolygon:Lyhty\Geometry\Types\PolygonMultiPoint:Lyhty\Geometry\Types\MultiPointMultiLineString:Lyhty\Geometry\Types\MultiLineStringMultiPolygon:Lyhty\Geometry\Types\MultiPolygonGeometryCollection: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(): floatGeometry::hausdorffDistance(Geometry $geometry): float¹Geometry::haversineLength(): floatGeometry::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\Builder 和 Illuminate\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')