0

dest()我正在尝试使用以下函数计算地球上的目的地距离。但是,我的函数会打印(61.488580, 23.784896 )距离初始点仅 0.018 公里的目标点(61.488414, 23.784976)。正确答案应该是(61.49806, 23.765)

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

我如何计算地球上的目的地点的来源

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);
}               
4

2 回答 2

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);
于 2012-04-04T14:36:16.717 回答
0

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

于 2012-04-04T14:32:26.993 回答