elevenlab/laravel-geo

此包已被废弃,不再维护。未建议替代包。

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

1.2.1 2022-03-17 15:20 UTC

This package is auto-updated.

Last update: 2022-03-17 15:32:23 UTC


README

请参考官方 Laravel 文档,因为框架现在支持地理空间数据库。

特性

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

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

安装和配置

  1. 使用 composer 安装
$ composer require elevenlab/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

构建查询

有两种不同的方法组可用,一种用于使用底层数据库引擎在现有对象上执行空间操作,另一种用于构建流畅的查询并在数据库驻留数据上执行操作。

给定两个 OGCObjects,您可以执行以下操作

  • 交集

  • 差集

  • 包含

  • 相交

  • 接触

  • 重叠

  • 质心

  • 距离

  • 等于

给定一个 illuminate Query Builder 对象,您可以使用

  • whereEquals

  • whereNotEquals

  • orWhereEquals

  • orWhereNotEquals

  • whereContains

  • whereNotContains

  • orWhereContains

  • orWhereNotContains

  • whereIntersects

  • whereNotIntersects

  • 或者相交

  • 或者不相交

  • 相交于

  • 不相交于

  • 或者相交于

  • 或者不相交于

  • 重叠于

  • 不重叠于

  • 或者重叠于

  • 或者不重叠于

待办事项

  • 改进文档
    • 为“构建查询”部分添加示例
    • 添加手动安装指南
  • 添加缺失的ST_functions函数
  • 添加单元测试