Write the Code. Change the World.

8月 25

基于定位获取周边的数据的场景还是蛮多的。这不就用到了,就记录下怎么整吧。

准备

因为用到的是 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 内的数据了。

参考来源

https://www.it1352.com/1542694.html

https://www.box3.cn/tools/lbs.html