根据经纬度计算距离

Java实现根据经纬度计算距离

在项目开发过程中,需要根据两地经纬度坐标计算两地间距离,所用的工具类如下:

Demo1:

[java]  view plain  copy
 print ?
  1. public static double getDistatce(double lat1, double lat2, double lon1, double lon2) {   
  2.         double R = 6371;   
  3.         double distance = 0.0;   
  4.         double dLat = (lat2 - lat1) * Math.PI / 180;   
  5.         double dLon = (lon2 - lon1) * Math.PI / 180;   
  6.         double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)   
  7.                 + Math.cos(lat1 * Math.PI / 180)   
  8.                 * Math.cos(lat2 * Math.PI / 180) * Math.sin(dLon / 2)   
  9.                 * Math.sin(dLon / 2);   
  10.         distance = (2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))) * R;   
  11.         return distance;   
  12.     }  

Demo2:

[java]  view plain  copy
 print ?
  1. private static final double EARTH_RADIUS = 6378.137 * 1000;   
  2.     private static double rad(double d)   
  3.     {   
  4.        return d * Math.PI / 180.0;   
  5.     }   
  6.     public static double GetDistance(double lat1, double lng1, double lat2, double lng2)   
  7.     {   
  8.        double radLat1 = rad(lat1);   
  9.        double radLat2 = rad(lat2);   
  10.        double a = radLat1 - radLat2;   
  11.        double b = rad(lng1) - rad(lng2);   
  12.        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) +    
  13.         Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));   
  14.        s = s * EARTH_RADIUS ;   
  15.        s = Math.round(s * 10000) / 10000;   
  16.        return s;   
  17.     }   

Demo3:

[java]  view plain  copy
 print ?
  1. private static final double EARTH_RADIUS = 6378137;//赤道半径(单位m)    
  2.         
  3.     /**  
  4.      * 转化为弧度(rad)  
  5.      * */    
  6.     private static double rad(double d)    
  7.     {    
  8.        return d * Math.PI / 180.0;    
  9.     }    
  10.         
  11.     /**  
  12.      * 基于余弦定理求两经纬度距离  
  13.      * @param lon1 第一点的精度  
  14.      * @param lat1 第一点的纬度  
  15.      * @param lon2 第二点的精度  
  16.      * @param lat3 第二点的纬度  
  17.      * @return 返回的距离,单位km  
  18.      * */    
  19.     public static double LantitudeLongitudeDist(double lon1, double lat1,double lon2, double lat2) {    
  20.         double radLat1 = rad(lat1);    
  21.         double radLat2 = rad(lat2);    
  22.     
  23.         double radLon1 = rad(lon1);    
  24.         double radLon2 = rad(lon2);    
  25.     
  26.         if (radLat1 < 0)    
  27.             radLat1 = Math.PI / 2 + Math.abs(radLat1);// south    
  28.         if (radLat1 > 0)    
  29.             radLat1 = Math.PI / 2 - Math.abs(radLat1);// north    
  30.         if (radLon1 < 0)    
  31.             radLon1 = Math.PI * 2 - Math.abs(radLon1);// west    
  32.         if (radLat2 < 0)    
  33.             radLat2 = Math.PI / 2 + Math.abs(radLat2);// south    
  34.         if (radLat2 > 0)    
  35.             radLat2 = Math.PI / 2 - Math.abs(radLat2);// north    
  36.         if (radLon2 < 0)    
  37.             radLon2 = Math.PI * 2 - Math.abs(radLon2);// west    
  38.         double x1 = EARTH_RADIUS * Math.cos(radLon1) * Math.sin(radLat1);    
  39.         double y1 = EARTH_RADIUS * Math.sin(radLon1) * Math.sin(radLat1);    
  40.         double z1 = EARTH_RADIUS * Math.cos(radLat1);    
  41.     
  42.         double x2 = EARTH_RADIUS * Math.cos(radLon2) * Math.sin(radLat2);    
  43.         double y2 = EARTH_RADIUS * Math.sin(radLon2) * Math.sin(radLat2);    
  44.         double z2 = EARTH_RADIUS * Math.cos(radLat2);    
  45.     
  46.         double d = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)+ (z1 - z2) * (z1 - z2));    
  47.         //余弦定理求夹角    
  48.         double theta = Math.acos((EARTH_RADIUS * EARTH_RADIUS + EARTH_RADIUS * EARTH_RADIUS - d * d) / (2 * EARTH_RADIUS * EARTH_RADIUS));    
  49.         double dist = theta * EARTH_RADIUS;    
  50.         return dist;    
  51.     }  

Demo4:

[java]  view plain  copy
 print ?
  1. //google map  
  2. private static final  double EARTH_RADIUS = 6378137;//赤道半径(单位m)    
  3.         
  4.     /**  
  5.      * 转化为弧度(rad)  
  6.      * */    
  7.     private static double rad(double d)    
  8.     {    
  9.        return d * Math.PI / 180.0;    
  10.     }    
  11.     /**  
  12.      * 基于googleMap中的算法得到两经纬度之间的距离,计算精度与谷歌地图的距离精度差不多,相差范围在0.2米以下  
  13.      * @param lon1 第一点的精度  
  14.      * @param lat1 第一点的纬度  
  15.      * @param lon2 第二点的精度  
  16.      * @param lat3 第二点的纬度  
  17.      * @return 返回的距离,单位km  
  18.      * */    
  19.     public static double GetDistance(double lon1,double lat1,double lon2, double lat2)    
  20.     {    
  21.        double radLat1 = rad(lat1);    
  22.        double radLat2 = rad(lat2);    
  23.        double a = radLat1 - radLat2;    
  24.        double b = rad(lon1) - rad(lon2);    
  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 = Math.round(s * 10000) / 10000;    
  28.        return s;    
  29.     }  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值