magutti/magutti-spatial

Laravel Builder MySQL 空间扩展

V5.0.0 2024-03-16 15:18 UTC

This package is auto-updated.

Last update: 2024-09-16 16:34:05 UTC


README

Laravel Builder MySQL 空间扩展

Latest Stable Version Total Downloads License PHP Version Require

Laravel Builder 扩展,使用 MySQL 原生函数 ST_Distance_Sphere 来计算两个空间点之间的距离。

ST_Distance_Sphere 默认的单位是米。

安装

您可以通过 composer 安装此包

composer require magutti/magutti-spatial

使用方法

在您的模型中添加

use Magutti\MaguttiSpatial\Builders\SpatialBuilder;

class Location extends Model
{
    .......
    // you can override the default longitude and latitude fields
    protected $spatialFields = [
        'lng',
        'lat'
    ];
   
    function newEloquentBuilder($query): SpatialBuilder
    {
        return new SpatialBuilder($query);
    }
    .......
}

使用示例

获取所有距离给定位置小于 1 公里的点

Location::select(['id','lng','lat'])
           ->whitDistance([8.9246844, 45.4152695]) // return distance in meters (default)
           ->whereDistance([8.9246844, 45.4152695],1000)
           ->get()

其中 8.9246844 (经度), 45.4152695 (纬度) 是您的位置,1000 是最大距离(单位:米)。

SELECT `id`,
       `lng`,
       `lat`,
       St_distance_sphere(Point(8.9246844, 45.4152695), Point(lng, lat)) * 1 AS
       distance
FROM   `locations`
WHERE  St_distance_sphere(Point(8.9246844, 45.4152695), Point(lng, lat)) < 1000 

使用英里

Location::select(['id','lat','lng'])
           ->whitDistanceInMiles([8.9246844, 45.4152695]) // return distance in Miles
           ->whereDistance([8.9246844, 45.4152695],10,'mi')
           ->get()

找到您最近的点(单位:公里)

Location::select(['id','lat','lng'])
           ->whitDistanceInKm([8.9246844, 45.4152695]) 
           ->whereDistance([8.9246844, 45.4152695],10,'km')
           ->closest()

辅助工具

该包提供了一些预构建的方法来计算千米、英里或英尺的距离。

whitDistanceInKm(array $point)    -> return distance in Km;
whitDistanceInMiles(array $point) -> return distance in Miles (mi);
whitDistanceInFeet(array $point)  -> return distance in Feet (ft);

and for filtering by distance

whereDistanceInKm(array $point, float $distance)     -> filter point by a given distance in Km
whereDistanceInMiles(array $point, float $distance)  -> filter point by a given distance in Miles
whereDistanceInFeet(array $point, float $distance)   -> filter point by a given distance in Miles

更新日志

请参阅 CHANGELOG 了解最近的变化。

贡献

请参阅 CONTRIBUTING 了解详细信息。

安全性

如果您发现任何安全问题,请通过电子邮件 marco@magutti.com 联系,而不是使用问题跟踪器。

致谢

许可

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