原生写法
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()
表示执行查询并返回结果。