PHP根据经纬度计算指定地点距离位置 并且可以限制距离

文章介绍了两种计算附近位置的PHP函数,一种是原生写法,使用PDO进行数据库查询和距离计算;另一种是TP6框架的写法,利用ThinkPHP6的Db类实现相同功能,包括距离排序和距离限制。这两种方法都基于Haversine公式来确定地球上两点间的距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原生写法

function getNearbyLocations($latitude, $longitude, $distanceLimit) {
    // 计算距离的公式里需要用到的地球半径
    $earthRadius = 6371000;

    // 根据经纬度计算距离的 SQL 语句
    $distanceSql = "($earthRadius * acos(cos(radians(:latitude)) * cos(radians(latitude)) * cos(radians(longitude) - radians(:longitude)) + sin(radians(:latitude)) * sin(radians(latitude)))) AS distance";

    // 构造 SQL 查询语句
    $sql = "SELECT *, $distanceSql FROM locations HAVING distance <= :distanceLimit ORDER BY distance ASC";

    // 执行 SQL 查询,并将经纬度作为参数绑定到 SQL 语句中
    $stmt = $pdo->prepare($sql);
    $stmt->bindParam(':latitude', $latitude);
    $stmt->bindParam(':longitude', $longitude);
    $stmt->bindParam(':distanceLimit', $distanceLimit);
    $stmt->execute();

    // 返回查询结果
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

在上面的代码中,我们首先定义了一个名为 getNearbyLocations() 的函数,它接受三个参数:基准点的经度、纬度和限制距离。然后,我们使用 PDO 对数据库进行查询,根据经纬度计算每个位置与基准点之间的距离,并将距离作为一个名为 distance 的属性返回。最后,我们将查询结果按照距离升序排序,并返回查询结果。

请注意,上面的代码中使用了 PDO 进行数据库查询,你需要将 $pdo 替换为你自己的 PDO 实例。此外,上面的代码仅仅是一个示例,你需要根据你自己的数据库结构进行相应的调整。

tp6写法

// 根据经纬度和距离排序数据
public function sortByDistance($latitude, $longitude, $distanceLimit, $tableName)
{
    // 计算距离的公式
    $distanceFormula = "(6371 * acos(cos(radians($latitude)) * cos(radians(latitude)) * cos(radians(longitude) - radians($longitude)) + sin(radians($latitude)) * sin(radians(latitude))))";

    // 查询符合条件的数据并按距离排序
    $result = Db::table($tableName)
        ->field("*,$distanceFormula AS distance")
        ->having("distance <= $distanceLimit")
        ->order("distance")
        ->select();

    return $result;
}
  • $latitude$longitude$distanceLimit$tableName分别表示要排序的经度、纬度、限制的距离和要查询的表名。
  • $distanceFormula表示计算距离的公式,在这里使用的是Haversine公式,可以计算地球上两个位置之间的距离(单位为公里)。
  • Db::table($tableName)表示查询指定表名的数据。
  • field("*,$distanceFormula AS distance")表示查询所有数据和距离,并将距离的字段名设置为distance
  • having("distance <= $distanceLimit")表示限制距离不超过指定的距离。
  • order("distance")表示按照距离升序排序。
  • select()表示执行查询并返回结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值