按经纬度距离搜索数据 - 孙立亚笔记

按经纬度距离搜索数据

在PHP中,要搜索一个特定经纬度100公里以内的地点,可以使用Haversine公式,该公式可以计算两点之间的大圆距离。以下是一个PHP函数,它使用Haversine公式来找出一个经纬度点周围100公里范围内的所有点。
function getPointsWithinRadius($lat, $lng, $radius = 100) {
// 地球半径,单位为公里
$earthRadius = 6371;
// 转换为弧度
$lat = deg2rad($lat);
$lng = deg2rad($lng);

// 计算经度差值的一半
$diffLongitude = deg2rad($radius / abs(cos(deg2rad($lat)) * 69));

// 计算纬度范围
$minLat = $lat - $diffLongitude;
$maxLat = $lat + $diffLongitude;

// 计算经度范围
$minLong = $lng - $diffLongitude;
$maxLong = $lng + $diffLongitude;

// 计算两点间距离
$sql = "SELECT id, (

6371 * acos(
    cos(radians(:lat)) *
    cos(radians(lat)) *
    cos(radians(lng) - radians(:lng)) +
    sin(radians(:lat)) *
    sin(radians(lat))
)

) AS distance
FROM your_table
HAVING distance < :radius
ORDER BY distance
LIMIT 0 , 20;";

// 替换实际的SQL查询,并传入实际的经纬度和半径
// 这里的:lat, :lng, :radius 应该被替换为实际的值
// 例如使用PDO:
// $sth = $pdo->prepare($sql);
// $sth->execute(array(':lat' => $lat, ':lng' => $lng, ':radius' => $radius));
// $points = $sth->fetchAll();

// 返回查询结果
return $points; // 这里应该是从数据库获取的点的数组
}
// 使用示例
$points = getPointsWithinRadius(34.0522, -118.2437, 100);

请注意,你需要将
your_table 替换为你的数据库中包含经纬度数据的表名,并且需要将
$pdo->prepare 和
$sth->execute 替换为实际的数据库查询代码。这个函数返回的是一个数组,其中包含了在指定的经纬度周围100公里范围内的点的数据。

以下是第二种方法,未测试
/**

  • Desc: 根据经纬度,半径范围获取附近
  • User: JamesLiu
  • Date: 2019/5/13
  • Time: 15:38
  • @param $longitude 经度
  • @param $latitude 纬度
  • @param $raidus 半径范围(单位:米)
  • @return array
    */

public function getAround($longitude, $latitude, $raidus)
{
$PI = 3.14159265;
$degree = (24901 * 1609) / 360.0;
$dpmLat = 1 / $degree;
$radiusLat = $dpmLat * $raidus;
$minLat = $latitude - $radiusLat;
$maxLat = $latitude + $radiusLat;
$mpdLng = $degree * cos($latitude * ($PI / 180));
$dpmLng = 1 / $mpdLng;
$radiusLng = $dpmLng * $raidus;
$minLng = $longitude - $radiusLng;
$maxLng = $longitude + $radiusLng;
return array('minLng' => $minLng, 'maxLng' => $maxLng, 'minLat' => $minLat, 'maxLat' => $maxLat);
}

经纬度距离组装成sql
1 $array = $this->getAround(115.826646, 28.718022, 2000);
2 $condition['longitude'] = array(array('EGT', $array['minLng']), array('ELT', $array['maxLng']), 'and');//(longitude >= minLng) AND (longitude <= maxLng)
3 $condition['latitude'] = array(array('EGT', $array['minLat']), array('ELT', $array['maxLat']), 'and');//(latitude >= minLat) AND (latitude <=maxLat)

添加新评论

电子邮件地址不会被公开,评论内容可能需要管理员审核后显示。