LBS附近地点搜索算法资料集合

本文介绍了两种高效的附近地点搜索方法:一种基于球面距离的Haversine公式,适用于小型应用;另一种利用Geohash算法,适合大数据量场景。通过具体实例展示了如何计算地理坐标间的距离。

方法一:基于球面距离搜索附近地点

    点评:需要使用2个字段进行查询,查询效率差,适用于数据量较少的小型应用。

    维基百科推荐使用 Haversine 公式计算球面距离

 

方法二:基于Geohash算法搜索附近地点

    点评:精度可控,使用单字段字符串前缀查询,查询效率较高,适用于大数据的应用。

 

其它方法:

//
// 使用 Haversine 公式计算两个地理坐标点之间的球面距离。
//
// 参数说明:
// $lat1        点1的纬度值,单位:degree
// $lng1        点1的经度值,单位:degree
// $lat2        点2的纬度值,单位:degree
// $lng2        点2的经度值,单位:degree
//
// 返回值:两点之间的球面距离,单位: km
//
function haversine_distance($lat1, $lng1, $lat2, $lng2) {
  $EARTH_RADIUS = 6371.00;   // 地球平均半径,6371km
  
  // 角度转换成弧度
  $rlat1 = deg2rad($lat1);
  $rlng1 = deg2rad($lng1);
  $rlat2 = deg2rad($lat2);
  $rlng2 = deg2rad($lng2);
  
  $rlat_diff = abs($rlat1 - $rlat2);
  $rlng_diff = abs($rlng1 - $rlng2);
  
  $h = pow(sin($rlat_diff/2), 2) + cos($rlat1) * cos($rlat2) * pow(sin($rlng_diff/2), 2);
  return 2 * $EARTH_RADIUS * asin(sqrt($h));
}

//
// 根据到中心点的距离计算东西两侧的经度边界范围,采用 Haversine 公式计算。
//
// 参数说明:
// $lat         中心点的纬度,单位:degree
// $lng         中心点的经度,单位:degree
// $distance    到中心点的距离,单位:km
// 
// 返回值: array($lat_diff, $lng_diff)
// $lat_diff    到中心点的纬度边界范围,单位: degree
// $lng_diff    到中心点的纬度边界范围,单位: degree
//
function lbs_haversine_diff($lat, $lng, $distance) {
  $EARTH_RADIUS = 6371.00;   // 地球平均半径,6371km
  
  // 纬度边界
  $rlat_diff = $distance / $EARTH_RADIUS;
  $dlat_diff = rad2deg($rlat_diff);
  
  // 经度边界
  $rlat = deg2rad($lat);
  $rlng_diff = 2 * asin( sin($distance / (2 * $EARTH_RADIUS)) / cos($rlat) );
  $dlng_diff = rad2deg($rlng_diff);
  
  return array($dlat_diff, $dlng_diff);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值