尝试计算地球上的目的地纬度和经度的问题

时间:2012-04-04 14:20:42

标签: java android

我正在尝试使用下面的dest()功能计算地球上的目的地距离。但是我的函数打印的目标点(61.488580, 23.784896 )距离初始点(61.488414, 23.784976)只有0.018km。正确答案应为(61.49806, 23.765)

有人可以帮我弄清楚我做错了吗?

Source for how I calculate a destination point on the globe

lat2 = asin( sin(lat1)*cos(d/R) + cos(lat1)*sin(d/R)*cos(br) ) 
lon2 = lon1 + atan2( sin(θ)*sin(d/R)*cos(lat1), cos(d/R)−sin(lat1)*sin(lat2) )

以下是我的出发点:

lat1= 61.488414 (degree) 
lon1= 23.784976 (degree)  
br= 315 (degree)  
d= 1.5 (km)  
R= 6371 (km)  
lat2= ? (degree)  
lon2= ? (degree)

以下是我对以下功能的实现:

void dest(){
    double lat1, lon1, lat2, lon2, x, y, R, d, br;
    double lat1rad, lat2rad, lon1rad, dbyRrad, brrad;

    lat1=61.488414;
    lon1=23.784976;
    br=315;
    d=1.5;
    R=6371;

    lat1rad=Math.toRadians(lat1);
    lat2rad=Math.toRadians(lat2); 
    lon1rad=Math.toRadians(lon1); 
    dbyRrad=Math.toRadians(d/R); 
    brrad=Math.toRadians(br);

    lat2 = Math.asin(Math.sin(lat1rad)*Math.cos(dbyRrad)          
      +Math.cos(lat1rad)*Math.sin(dbyRrad)*Math.cos(brrad));
    lat2=Math.toDegrees(lat2);

    y=Math.sin(brrad)*Math.sin(dbyRrad)*Math.cos(lat1rad);
    x=Math.cos(dbyRrad)-Math.sin(lat1rad)*Math.sin(lat2rad);
    lon2 = Math.atan2(y,x);
    lon2 = Math.toDegrees(lon2);
    lon2 = lon1 + lon2;

    System.out.println("lat2 = "+ lat2);   // correct lat2= 61.49806, lon2=23.765
    System.out.println("lon2 = "+ lon2);
}               

2 个答案:

答案 0 :(得分:1)

lat2rad=Math.toRadians(lat2);

但是此时你尚未初始化lat2所以它使用的值为0.然后,你做了一些涉及lat2的计算:

lat2 = Math.asin(Math.sin(lat1rad)*Math.cos(dbyRrad)          
  +Math.cos(lat1rad)*Math.sin(dbyRrad)*Math.cos(brrad));
lat2=Math.toDegrees(lat2);

但是你永远不会将这个值映射回lat2rad。然后使用lat2rad(仍为0)来计算x:

x=Math.cos(dbyRrad)-Math.sin(lat1rad)*Math.sin(lat2rad);

也许第二块代码应该是:

lat2rad = Math.asin(Math.sin(lat1rad)*Math.cos(dbyRrad)          
  +Math.cos(lat1rad)*Math.sin(dbyRrad)*Math.cos(brrad));
lat2=Math.toDegrees(lat2rad);

答案 1 :(得分:0)

我认为d / R已经是弧度,你不需要再转换它。