anilahir / laravel-geo
为Laravel 5.*提供的空间OGC对象集成
1.1.2
2018-06-05 13:16 UTC
Requires
- php: >=5.4.0
- elevenlab/php-ogc: ^1.0
- illuminate/database: ^5.2
Requires (Dev)
- phpunit/phpunit: 4.0.*
README
这是一个从elevenlab/laravel-geo分叉的版本,对兼容Lumen 5.6+进行了一些修改
特性
- Laravel 5.2+上的空间集成
- 使用Schema和迁移创建空间列
- 直接使用开放地理空间联盟空间对象(此包依赖于PHP-OGC)保存和检索空间属性
- 直接使用Laravel流畅查询构建器构建空间查询
- 支持类型:点、多点、线字符串、多线字符串、多边形、多边形集合、几何集合
- 支持驱动
- Postgres:PostGIS扩展扩展(几何类型)
- MySql:空间数据扩展(地理类型)
感谢https://github.com/njbarrett/laravel-postgis的原始工作。
安装与配置
- 使用Composer进行安装
$ composer require anilahir/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
构建查询
有两种不同组的方法可用,一组用于使用底层数据库引擎对现有对象执行空间操作,另一组用于构建流畅查询并在数据库驻留数据上执行操作。
给定两个OGC对象,您可以执行以下操作
-
交集
-
差集
-
包含
-
相交
-
触及
-
重叠
-
质心
-
距离
-
等于
给定一个illuminate Query Builder对象,您可以使用
-
whereEquals
-
whereNotEquals
-
orWhereEquals
-
orWhereNotEquals
-
whereContains
-
whereNotContains
-
orWhereContains
-
orWhereNotContains
-
whereIntersects
-
whereNotIntersects
-
orWhereIntersects
-
orWhereNotIntersects
-
whereTouches
-
whereNotTouches
-
orWhereTouches
-
orWhereNotTouches
-
whereOverlaps
-
whereNotOverlaps
-
orWhereOverlaps
-
orWhereNotOverlaps
待办事项
- 改进文档
- 为“构建查询”部分添加示例
- 添加手动安装指南
- 添加缺失的ST_functions
- 添加单元测试