首页 > 代码库 > 根据用户经纬度,sql计算距离并排序

根据用户经纬度,sql计算距离并排序

根据经纬度计算距离

  1. public class DistanceUtil {  
  2.   
  3.     // 地球平均半径  
  4.     private static final double EARTH_RADIUS = 6378137;  
  5.   
  6.     // 把经纬度转为度(°)  
  7.     private static double rad(double d) {  
  8.         return d * Math.PI / 180.0;  
  9.     }  
  10.   
  11.     /** 
  12.      * 根据两点间经纬度坐标(double值),计算两点间距离,单位:千米 
  13.      * @author ershuai 
  14.      * @param lng1 
  15.      * @param lat1 
  16.      * @param lng2 
  17.      * @param lat2 
  18.      * @return 
  19.      */  
  20.     public static double getDistance(double lng1, double lat1, double lng2, double lat2) {  
  21.         double radLat1 = rad(lat1);  
  22.         double radLat2 = rad(lat2);  
  23.         double a = radLat1 - radLat2;  
  24.         double b = rad(lng1) - rad(lng2);  
  25.         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)));  
  26.         s = s * EARTH_RADIUS;  
  27.         s = s / 1000;  
  28.         DecimalFormat df = new DecimalFormat("#.00");  
  29.         s = Double.parseDouble(df.format(s));  
  30.         return s;  
  31.     }  
  32.       
  33.     public static void main(String[] args) {  
  34.         double distance1 = getDistance(104.04611530.6030110000104.07466630.611842);  
  35.         System.out.println("Distance is: " + distance1 + " km");  
  36.     }  
  37. }  
技术分享

 

sql   查询

 

  1. SELECT  
  2.     es_name,  
  3.     es_lon,  
  4.     es_lat,  
  5.     ROUND(  
  6.         6378.138 * 2 * ASIN(  
  7.             SQRT(  
  8.                 POW(  
  9.                     SIN(  
  10.                         (  
  11.                             30.611842 * PI() / 180 - es_lat * PI() / 180  
  12.                         ) / 2  
  13.                     ),  
  14.                     2  
  15.                 ) + COS(30.611842 * PI() / 180) * COS(es_lat * PI() / 180) * POW(  
  16.                     SIN(  
  17.                         (  
  18.                             104.074666 * PI() / 180 - es_lon * PI() / 180  
  19.                         ) / 2  
  20.                     ),  
  21.                     2  
  22.                 )  
  23.             )  
  24.         ) * 1000  
  25.     ) AS distance_um  
  26. FROM  
  27.     c_ershuai  
  28. ORDER BY  
  29.     distance_um ASC  
技术分享

 

技术分享

根据用户经纬度,sql计算距离并排序