一个利用 Redis 地理空间功能进行快速搜索并完美与 Laravel 集成的包。

v1.1.0 2020-02-20 10:04 UTC

This package is not auto-updated.

Last update: 2024-10-01 13:55:43 UTC


README

Latest Version on Packagist Build Status Quality Score Total Downloads

此包使您能够轻松将地理空间功能添加到您的 Laravel 应用程序中。它使用 Redis 内置的地理空间功能,并以优雅的方式与您的 Laravel 模型结合。

安装

您可以通过 composer 安装此包

composer require leitom/geo

用法

此包包含一个简单的特性,该特性与 Laravel Eloquent 模型集成,同时也提供了一个门面来与不同的地理空间功能交互。

Laravel Eloquent 集成

当您将此包与一个或多个 Eloquent 模型集成时,您只需使用 Leitom\Geo\HasGeoAbilities 特性。由于使用了模型观察器,此特性将负责保持 Redis 索引与您的模型同步,因此您无需担心。每次您创建、保存或删除模型时,Redis 索引都将更新以反映更改。

use Leitom\Geo\HasGeoAbilities;

class User extends Model
{
    use HasGeoAbilities;

    protected $fillable = ['id', 'name', 'longitude', 'latitude'];
}

搜索

在此,我们使用经度、纬度和半径进行搜索。半径的单位配置在配置文件中,默认 km = 千米。您可以使用 geoSearch 函数的 4 个参数指定排序,默认 ASC

$users = User::geoSearch(-115.17258, 36.11996, 10)->get();

此包为每个实现了 HasGeoAbilities 的模型添加了两个属性。我们添加了单位和距离,您可以将其显示给最终用户。

$user->geoUnit // km
$user->geoDistance; // 0.999

toArray() 函数也被覆盖,以便加载这两个属性。

[
    'geo_unit' => 'km',
    'geo_distance' => 0.999,
]

找到两个模型之间的距离

要找到两个模型之间的距离,您可以使用给定模型的 geoDistanceFrom 函数

$userA = User::findOrFail(1);
$userB = User::findOrFail(2);

$userA->geoDistanceFrom($userB) // ['unit' => 'km', 'distance' => 0.999]

获取最近的模型

$userA = User::findOrFail(1);
$userB = User::findOrFail(2);

$users = $userA->geoNearest()->paginate(5);

通过 Geo 门面执行搜索

$locations = Leitom\Geo\Facades\Geo::index('cars')->search(-115.17258, 36.11996, 10);

获取两个位置之间的距离

$locationA = new Leitom\Geo\Coordinate('my-car', -115.17087, 36.12306);
$locationB = new Leitom\Geo\Coordinate('robins-car', -115.171971, 36.120609);

Leitom\Geo\Facades\Geo::index('cars')->between($locationA, $locationB); // 0.2900

获取给定位置最近的地点列表

$locationA = new Leitom\Geo\Coordinate('my-car', -115.17087, 36.12306);

Leitom\Geo\Facades\Geo::index('cars')->from($locationA, 10, 'ASC'); // [['my-car' => 0], ['your-car' => 0.2900]]

将坐标添加到索引中

$locationA = new Leitom\Geo\Coordinate('my-car', -115.17087, 36.12306);

Leitom\Geo\Facades\Geo::index('cars')->add($locationA);

将多个坐标添加到索引中

$locationA = new Leitom\Geo\Coordinate('my-car', -115.17087, 36.12306);
$locationB = new Leitom\Geo\Coordinate('robins-car', -115.171971, 36.120609);

Leitom\Geo\Facades\Geo::index('cars')->add($locationA, $locationB);

Leitom\Geo\Facades\Geo::index('cars')->add([$locationA, $locationB]);

从索引中删除坐标

Leitom\Geo\Facades\Geo::index('cars')->remove('my-car');

Leitom\Geo\Facades\Geo::index('cars')->remove('my-car', 'robins-car');

导入和删除现有模型

此包包含两个命令来处理从 Redis 索引中导入和删除模型。这对于您将此包集成到现有项目中非常有用。

php artisan geo:import App\User
php artisan geo:remove App\User

测试

请确保您已安装 Redis。如果您未使用 Redis 的默认配置,您可以在 phpunit.xml 文件中更改环境变量。

composer test

在测试您自己的应用程序逻辑时,您应包含 Leitom\Geo\Tests\RefreshGeo 特性。这将确保您在测试中开始时拥有一个全新的 Redis 索引。就像 Laravel 内置的 RefreshDatabase 特性一样。

变更日志

有关最近更改的更多信息,请参阅 CHANGELOG

贡献

有关详细信息,请参阅 CONTRIBUTING

安全

如果您发现任何与安全相关的问题,请通过电子邮件发送至 leirvik.tommy@gmail.com 而不是使用问题跟踪器。

致谢

许可证

MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件

Laravel 包模板

此包是使用 Laravel 包模板 生成的。