leitom_7 / geo
一个利用 Redis 地理空间功能进行快速搜索并完美与 Laravel 集成的包。
Requires
- php: ^7.2
- illuminate/support: ^6.0
- predis/predis: ^1.1
Requires (Dev)
- orchestra/testbench: 4.6.*
- phpunit/phpunit: ~8.0
This package is not auto-updated.
Last update: 2024-10-01 13:55:43 UTC
README
此包使您能够轻松将地理空间功能添加到您的 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 包模板 生成的。