基于定位获取周边的数据的场景还是蛮多的。这不就用到了,就记录下怎么整吧。
准备
因为用到的是 laravel 框架, ORM 这些会使用到。会用到 scope。假如这里有一个模型 Meet,对用的表名是 meets, 表里有这些字段:title、content、region_code、latitude、longitude、address、created_at、updated_at
模型如下:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
class Idc extends Model
{
use HasFactory;
protected $fillable = ['title', 'content', 'region_code', 'latitude', 'longitude', 'address'];
}
开始
我们准备一个 distanc 的 scope
use Illuminate\Support\Facades\DB;
……
public function scopeDistance($query, $lat, $long, $distance)
{
return $query->having('distance', '<', $distance)
->select(
DB::raw("*,
(3959 * ACOS(COS(RADIANS($lat))
* COS(RADIANS(latitude))
* COS(RADIANS($long) - RADIANS(longitude))
+ SIN(RADIANS($lat))
* SIN(RADIANS(latitude)))) AS distance")
)->orderBy('distance', 'asc');
}
3959 计算出来的是英里,换成 6378.138 计算出来的是公里。也就是地球的半径。
然后使用
$latitude = 31.0811;
$longitude = 121.26035;
$meets = Meet::distance($latitude,$longitude, 5)->get(['id','title', 'content', 'latitude', 'longitude', 'address']);
这样就计算出距离该坐标 5 km 内的数据了。