zoukankan      html  css  js  c++  java
  • LBS附近地点搜索算法资料集合

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

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

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

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

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

    其它方法:

    PHP源代码

    //
    // 使用 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);
    }
  • 相关阅读:
    101. Symmetric Tree
    mfc实现对话框全屏置顶显示
    qq截图原理
    给对话框添加颜色
    mfc设置半透明对话框
    API介绍
    列表控件学习1
    VC++、MFC
    vs2010 产品密钥
    VS2008 视图资源.rc无法加载的问题及解决方法
  • 原文地址:https://www.cnblogs.com/gyxdbk/p/14078497.html
Copyright © 2011-2022 走看看