地图经纬度和距离的计算问题
最近要做些地图相关的事情,有如下需求:
已知一经纬度,距离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;
}
如果有其它更准确的算法,欢迎提供:)