计算两经纬度间的距离

来源:互联网 发布:淘宝账号修改用户名 编辑:程序博客网 时间:2024/06/05 06:14

1、设两点分别为P1、P2,如果其值是用度分秒形式表示,则需将其转换成十进制度的形式,如P1点纬度为23度30分,则其纬度值转换成十进制度的形式为23.5度。如果值为十进制度的形式,则直接进入第二步。

2、分别将两点的经度、纬度值转换成弧度制形式,如P1纬度为23.5度,转换成弧度制则为:23.5*PI / 180。分别用 P1latInRad、P1LongInRad、P2latInRad、P2LongInRad表示。

3、分别求取两点间的纬度差(dlat)与经度差(dlon);

4、求取两点间的正弦与余弦值,公式如下:

A=sin2(dlat/2) + cos(P1LatInRad)*cos(P2LatInRad)*Sin2(dlon/2)       (1)

5、求取两点的正切值,公式如下:

C=2*Math.Atan2(Math.Sqrt(A), Math.Sqrt(1-A))                     (2)

6、返回两点间的距离:公式如下:

D=EarthRadiusKm * C                                          (3)


public class distCnvter {
    
private final static double PI = 3.14159265358979323// 圆周率
    private final static double R = 6371229// 地球的半径

    
public static double getDistance(double longt1, double lat1, double longt2,double lat2) {
        
double x, y, distance;
        x 
= (longt2 - longt1) * PI * R
                
* Math.cos(((lat1 + lat2) / 2* PI / 180/ 180;
        y 
= (lat2 - lat1) * PI * R / 180;
        distance 
= Math.hypot(x, y);
        
return distance;
    }
}

/*********************用例2********************************/

private static double EARTH_RADIUS = 6378.137;

public static double getDistance(double lat1, double lng1, double lat2, double lng2) {  
        double radLat1 = getRadian(lat1);  
        double radLat2 = getRadian(lat2);  
        double a = radLat1 - radLat2;// 两点纬度差  
        double b = getRadian(lng1) - getRadian(lng2);// 两点的经度差  
        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;  
        return s * 1000;  
    }

private static double getRadian(double degree) {  
        return degree * Math.PI / 180.0;  
    } 

原创粉丝点击