最近要做些地图相关的事情,有如下需求:

已知一经纬度,距离a,求同纬度上距离a对应的经纬度,同经度上距离a上对应的经纬度。说白了就是计算纬度间的距离和经度间的距离。

网上搜索到的算法,如下

public class Map2 {
    private final double PI = 3.14159265358979323; //圆周率
    private final double R = 6371229;             //地球的半径
    public 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;
}

public double getLongt(double longt1, double lat1, double distance){
    double a = (180*distance)/(PI*R*Math.cos(lat1*PI/180));
    return a;
}

public double getLat(double longt1, double lat1, double distance){
    double a = (180*distance)/(PI*R*Math.cos(lat1*PI/180));
    return a;
}
}

测试中发现纬度的计算有偏差。多次取点测试发现,维度在赤道处的计算很准确,但是维度越大,误差越大。在中国范围内可以达到0.1~0.5倍的误差。经过几个取样计算,在纬度的计算上增加了一个纠正计算。纠正后虽然并不是完全准确,但是误差会控制在0.1以内。如下

public double getLat(double longt1, double lat1, double distance){
double a = (180*distance)/(PI*R*Math.cos(lat1*PI/180))/(1+lat1*lat1*0.5/(50*50));
return a;
}

如果有其它更准确的算法,欢迎提供:)

发表评论

邮箱地址不会被公开。 必填项已用*标注