malhal/laravel-geographical

轻松将经纬度列添加到您的记录中,并使用继承功能计算距离

1.0.7 2024-03-12 19:37 UTC

This package is not auto-updated.

Last update: 2024-09-14 16:38:10 UTC


README

轻松将经纬度列添加到您的记录中,并使用继承功能计算距离。

首先,更新您的数据库或为每个模型添加迁移

$table->double('longitude');
$table->double('latitude');

最后,编辑您的模型以使用地理特性,如下例所示

<?php

namespace App\Models;

use Malhal\Geographical\Geographical;
use Illuminate\Database\Eloquent\Model;

class ModelExample extends Model
{
    use Geographical;

1. 距离

查找从特定位置到您表中所有条目的距离。

$query = ModelExample::distance($latitude, $longitude);
$asc = $query->orderBy('distance', 'ASC')->get();

2. 地理围栏

查找您表中所有位于圆形地理围栏内的条目。

$query = ModelExample::geofence($latitude, $longitude, $inner_radius, $outer_radius);
$all = $query->get();

使用 $inner_radius= 0 & $outer_radius = 您想要的任何英里数。

单位

距离的默认单位是 英里。您可以通过在模型中放置以下内容将其更改为 公里

protected static $kilometers = true;

说明

  1. 此方法返回一个 Eloquent.Builder 对象,因此您可以添加可选条件。
  2. 如果您需要仅选择某些列,可以使用 select() 实现。
    ModelExample::select('id', 'name')->distance($latitude, $longitude);
    (select() 应在 distance()/geofence() 之前)
  3. 您可以将 distance 用作结果中的聚合列。(聚合列不能用于 WHERE,请使用 HAVING 执行任何条件。)
  4. 如果您为纬度和经度使用不同的列名,请将它们在 Model.php 中列出
    const LATITUDE  = 'lat';
    const LONGITUDE = 'lng';

选项

  1. 您可以将选项数组作为距离方法的第三个参数传递,这些选项将允许您在运行时设置新表名或列名。

    $query = Model::distance($latitude, $longitude, $options);
  2. 您可以使用选项参数设置以下三个字段:table、latitude_column 和 longitude_column

    $options = [
       'table' => 'coordinates',
       'latitude_column' => 'lat',
       'longitude_column' => 'lon'
    ]
    
    Model::select('id', 'name')->distance($latitude, $longitude, $options);
  3. table 字段允许您在运行时设置从其中选择坐标的表,从而使您可以从另一个表将坐标连接到模型。

    Model::join('locations', function($join){ 
               $join->on('model.id', '=', 'locations.model_id');
           })
           ->select('id', 'name')
           ->distance($latitude, $longitude, ['table' => 'locations']);
  4. latitude_column 和 longitude_column 字段可以用于设置连接表的列名,或覆盖运行时默认列名(包括在模型上设置的列名)。如果您在使用连接表时未设置运行时的列名字段,则将使用在模型上设置的列名或默认的 'latitude' 和 'longitude'。在连接模型上设置 const LATITUDE = 'lat'const LONGITUDE = 'lng' 将没有效果。

安装

PHP 5.6.4+ 和 Laravel 5+ 是必需的。

要获取 Laravel Geographical 的最新版本,只需使用 Composer 需求项目即可。

$ composer require malhal/laravel-geographical