anilahir/laravel-geo

为Laravel 5.*提供的空间OGC对象集成

1.1.2 2018-06-05 13:16 UTC

This package is auto-updated.

Last update: 2024-09-21 20:48:54 UTC


README

这是一个从elevenlab/laravel-geo分叉的版本,对兼容Lumen 5.6+进行了一些修改

特性

  • Laravel 5.2+上的空间集成
    • 使用Schema和迁移创建空间列
    • 直接使用开放地理空间联盟空间对象(此包依赖于PHP-OGC)保存和检索空间属性
    • 直接使用Laravel流畅查询构建器构建空间查询
    • 支持类型:点、多点、线字符串、多线字符串、多边形、多边形集合、几何集合
  • 支持驱动
    • Postgres:PostGIS扩展扩展(几何类型)
    • MySql:空间数据扩展(地理类型)

感谢https://github.com/njbarrett/laravel-postgis的原始工作。

安装与配置

  1. 使用Composer进行安装
$ composer require anilahir/laravel-geo
  1. 在config/app.php的Service Providers部分('providers'数组)下替换此行
Illuminate\Database\DatabaseServiceProvider::class,

为这一行

ElevenLab\GeoLaravel\DatabaseServiceProvider::class
  1. 如果您需要,在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
  • 添加单元测试