在实际项目中使用mybatis获取距离和查周边的实现

mybatis +mysql获取方圆多少距离的经纬度

在新作的项目中,由于业务的需要,需要实现周边搜索的功能,采用mybatis+spring,核心的算法的内容如下:
地球的半径 EARTH_RADIUS = 6378137;   
根据中心经纬度和相隔的距离计算方圆的经纬度,以米为单位,的写法    
 /**
     * 生成以中心点为中心的四方形经纬度
     * 
     * @param centralLat 中心点纬度 ,这里传手机所在的维度
     * @param centralLon 中心点精度 ,这里传手机所在的精度
     * @param distance 半径(以米为单位),由客户端传递进来的距离参数
     * @return map minLat最小维度  maxLat最大纬度  minLon最小精度   maxLon最大经度 earthRadius地球的半径
     */ 
    public static Map getAround(double centralLat, double centralLon, int distance) { 
 
         Map map = new HashMap();
        Double latitude = centralLat; 
        Double longitude = centralLon; 
 
        Double degree = (24901 * 1609) / 360.0; 
        double raidusMile = distance; 
 
        Double dpmLat = 1 / degree; 
        Double radiusLat = dpmLat * raidusMile; 
        Double minLat = latitude - radiusLat; 
        Double maxLat = latitude + radiusLat; 
 
        Double mpdLng = degree * Math.cos(latitude * (Math.PI / 180)); 
        Double dpmLng = 1 / mpdLng;              
        Double radiusLng = dpmLng * raidusMile;  
        Double minLng = longitude - radiusLng;   
        Double maxLng = longitude + radiusLng;   
       
        map.put("earthRadius", EARTH_RADIUS);
        map.put("minLat", minLat);
        map.put("maxLat", maxLat);
        map.put("minLon", minLng);
        map.put("maxLon", maxLng);
        return map;
    }

     /**
     * @Title: getDistance
     * @Description: 根据两点的经纬度计算两点之间的距离
     * @param targetLon 目标点的精度
     * @param targetLat  目标点的维度
     * @param centralLon  中心点的经度
     * @param centralLat 中心点的维度
     * @return
     * @return  String   返回类型
     * @throws
     */
     public static String getDistance(double targetLon, double targetLat, double centralLon, double centralLat) {
               String distance = "";
             double radLat1 = targetLat * RAD;
             double radLat2 = centralLat * RAD;
             double a = radLat1 - radLat2;
             double b = (targetLon - centralLon) * RAD;
             double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
                     Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
             s = s * EARTH_RADIUS;
             s = Math.round(s * 10000) / 10000;
            
             distance = String.valueOf(s);
             distance = distance.substring(0,distance.lastIndexOf("."));
             return distance;
     }

mysql中sql的写法实际值得写法

#具体的数字获取范围内的,这里获取的是经度114.132940000,纬度 22.523736000的周围500米的商家
select logitude,altitude,2 * asin(
          sqrt(
               pow(sin((altitude-22.523736000)*PI()/360), 2) +
               cos(altitude * PI() / 180) * cos(22.523736000 *PI()/ 180) * pow(sin((logitude-114.132940000)*PI()/360), 2)
             )
          )*6378137 distance
from t_company_info
               where logitude <> 0
               and altitude > 22.51924338013896
               and altitude < 22.52822861986104
               and  logitude> 114.12807638830596
               and  logitude< 114.13780361169405
              
order by distance desc


在mybatis中使用变量代替的写法
select logitude,altitude,2 * asin(
          sqrt(
               pow(sin((altitude-#{centralLat})*PI()/360), 2) +
               cos(altitude * PI()/ 180) * cos(#{centralLat}*PI()/ 180) * pow(sin((logitude-#{centralLon})*PI()/360), 2)
             )
          )* #{earthRadius} distance
 from t_company_info
               where logitude <> 0
               and altitude > #{minLat}
               and altitude < #{maxLat}
               and  logitude> #{minLon}
               and  logitude< #{maxLon}
              
order by distance desc

你可能感兴趣的:(java)