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

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

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

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

 

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

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

 

其它方法:

 

PHP源代码

 1 //

 2 // 使用 Haversine 公式计算两个地理坐标点之间的球面距离。

 3 //

 4 // 参数说明:

 5 // $lat1        点1的纬度值,单位:degree

 6 // $lng1        点1的经度值,单位:degree

 7 // $lat2        点2的纬度值,单位:degree

 8 // $lng2        点2的经度值,单位:degree

 9 //

10 // 返回值:两点之间的球面距离,单位: km

11 //

12 function haversine_distance($lat1, $lng1, $lat2, $lng2) {

13   $EARTH_RADIUS = 6371.00;   // 地球平均半径,6371km

14   

15   // 角度转换成弧度

16   $rlat1 = deg2rad($lat1);

17   $rlng1 = deg2rad($lng1);

18   $rlat2 = deg2rad($lat2);

19   $rlng2 = deg2rad($lng2);

20   

21   $rlat_diff = abs($rlat1 - $rlat2);

22   $rlng_diff = abs($rlng1 - $rlng2);

23   

24   $h = pow(sin($rlat_diff/2), 2) + cos($rlat1) * cos($rlat2) * pow(sin($rlng_diff/2), 2);

25   return 2 * $EARTH_RADIUS * asin(sqrt($h));

26 }

27 

28 //

29 // 根据到中心点的距离计算东西两侧的经度边界范围,采用 Haversine 公式计算。

30 //

31 // 参数说明:

32 // $lat         中心点的纬度,单位:degree

33 // $lng         中心点的经度,单位:degree

34 // $distance    到中心点的距离,单位:km

35 // 

36 // 返回值: array($lat_diff, $lng_diff)

37 // $lat_diff    到中心点的纬度边界范围,单位: degree

38 // $lng_diff    到中心点的纬度边界范围,单位: degree

39 //

40 function lbs_haversine_diff($lat, $lng, $distance) {

41   $EARTH_RADIUS = 6371.00;   // 地球平均半径,6371km

42   

43   // 纬度边界

44   $rlat_diff = $distance / $EARTH_RADIUS;

45   $dlat_diff = rad2deg($rlat_diff);

46   

47   // 经度边界

48   $rlat = deg2rad($lat);

49   $rlng_diff = 2 * asin( sin($distance / (2 * $EARTH_RADIUS)) / cos($rlat) );

50   $dlng_diff = rad2deg($rlng_diff);

51   

52   return array($dlat_diff, $dlng_diff);

53 }

 

 

你可能感兴趣的:(LBS)