elevenlab / laravel-geo
此包已被废弃,不再维护。未建议替代包。
Laravel 5.* 的空间 OGC 对象集成
1.2.1
2022-03-17 15:20 UTC
Requires
- php: >=5.4.0
- elevenlab/php-ogc: ^1.0
- illuminate/database: ^5.2
Requires (Dev)
- phpunit/phpunit: 4.0.*
README
请参考官方 Laravel 文档,因为框架现在支持地理空间数据库。
特性
- Laravel 5.2+ 的地理空间集成
- 使用 Schema 和迁移创建地理空间列
- 直接使用 OpenGeoConsortium 空间对象 (此包依赖 PHP-OGC) 保存和检索地理空间属性
- 直接使用 Laravel 流查询构建器构建空间查询
- 支持类型:点、多点、线字符串、多线字符串、多边形、多多边形、几何集合
- 支持驱动程序
- Postgres:Postgis 扩展 (几何类型)
- MySql:空间数据扩展 (地理类型)
感谢 https://github.com/njbarrett/laravel-postgis 的原始工作。
安装和配置
- 使用 composer 安装
$ composer require elevenlab/laravel-geo
- 在 config/app.php 的 Service Providers 部分 ('providers' 数组) 中替换以下行
Illuminate\Database\DatabaseServiceProvider::class,
使用以下行
ElevenLab\GeoLaravel\DatabaseServiceProvider::class
- 如果需要,在 config/app.php 的 Alias 部分 ('aliases' 数组) 中添加以下行
'GeoModel' => ElevenLab\GeoLaravel\Model::class,
快速文档
使用空间引用创建表
要将地理空间字段添加到迁移中,可以使用以下方法
- point、multipoint、linestring、multilinestring、polygon、multipolygon、geometrycollection
示例(注意:该架构过于简化)
<?php Schema::create('nations', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->polygon('national_bounds'); $table->point('capital'); $table->multipolygon('regions_bounds'); $table->multipoint('regions_capitals'); $table->linestring('highway'); });
将空间属性添加到模型
为了在 CRUD 操作中处理动态地理空间属性,您需要
- 将 Eloquent 模型抽象对象替换为自定义模型
- 定义哪个属性属于哪种地理空间类型,定义
$geometries
属性(您可以在 这里 找到可用的类型)
<?php namespace App; use ElevenLab\GeoLaravel\Eloquent\Model as GeoModel; class Country extends GeoModel { protected $table = "countries"; protected $geometries = [ "polygons" => ['national_bounds'], "points" => ['capital'], "multipolygons" => ['regions_bounds'], "multipoints" => ['regions_capitals'], "linestrings" => ['highway'] ]; }
操作模型的地理空间属性
<?php use ElevenLab\GeoLaravel\DataTypes\Point as Point; use ElevenLab\GeoLaravel\DataTypes\Linestring as Linestring; use ElevenLab\GeoLaravel\DataTypes\Polygon as Polygon; $rome = new Point(41.9102415,12.3959149); $milan = new Point(45.4628328,9.1076927); $naples = new Point(40.8540943,14.1765626); $regions_capital = new MultiPoint([$rome, $milan, $naples, ....]); $italy_bounds = new Polygon([new LineString(getPointArrayOfItalianBounds())]); $lazio = new LineString(getPointArrayOfLazioBounds()); $campania = new LineString(getPointArrayOfCampaniaBounds()); $lombardia = new LineString(getPointArrayOfLombardiaBounds()); $molise = new LineString(getPointArrayOfMoliseBounds()); # raise MoliseNotFoundException $regions_bounds = new MultiPolygon([$lazio, $campania, $lombardia, ....]); $a1 = new LineString(getPointArrayOfA1()); $italy = Country::create([ 'name' => 'Italy', 'capital' => $rome, 'national_bounds' => $italy_bounds, 'regions_bounds' => $regions_bounds, 'regions_capitals' => $regions_capital, 'highway' => $a1 ]); $italy = Country::whereName('Italy')->first(); echo get_class($italy->capital); // ElevenLab\PHPOGC\DataTypes\Point echo get_class($italy->national_bounds); // ElevenLab\PHPOGC\DataTypes\Polygon echo get_class($italy->regions_bounds); // ElevenLab\PHPOGC\DataTypes\Polygon echo get_class($italy->regions_capitals); // ElevenLab\PHPOGC\DataTypes\MultiPoint echo get_class($italy->highway); // ElevenLab\PHPOGC\DataTypes\LineString
构建查询
有两种不同的方法组可用,一种用于使用底层数据库引擎在现有对象上执行空间操作,另一种用于构建流畅的查询并在数据库驻留数据上执行操作。
给定两个 OGCObjects,您可以执行以下操作
-
交集
-
差集
-
包含
-
相交
-
接触
-
重叠
-
质心
-
距离
-
等于
给定一个 illuminate Query Builder 对象,您可以使用
-
whereEquals
-
whereNotEquals
-
orWhereEquals
-
orWhereNotEquals
-
whereContains
-
whereNotContains
-
orWhereContains
-
orWhereNotContains
-
whereIntersects
-
whereNotIntersects
-
或者相交
-
或者不相交
-
相交于
-
不相交于
-
或者相交于
-
或者不相交于
-
重叠于
-
不重叠于
-
或者重叠于
-
或者不重叠于
待办事项
- 改进文档
- 为“构建查询”部分添加示例
- 添加手动安装指南
- 添加缺失的ST_functions函数
- 添加单元测试