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\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\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')