2010-11-18 132 views
1

我试图使用公式(www.movable-type.co.uk/scripts/latlong.html)返回目标点,给出一个起点点,距离和方位。这是我的价值观:使用vincenty公式时,我总是提出错误的计算

int radius_km = 6371; 
double d = 74.02; 
double st_lat = 39.4450; 
st_lat = Math.toRadians(st_lat); 
double bearing = 106.1607; 
bearing = Math.toRadians(bearing); 

double end_lat = Math.asin(Math.sin(st_lat)*Math.cos(d/radius_km) + 
      Math.cos(st_lat)*Math.sin(d/radius_km)*Math.cos 
      (bearing)); 

end_lat = Math.toDegrees(end_lat); 

当我进入d,st_lat并在网站轴承,我得到这样的:39°33'28“N。 当我使用上面的代码(我从网站复制),我得到这个:39.25679699255662。

我看了看周围越来越有人说师可能不会返回小数量,所以我换成师带:

BigDecimal distance = new BigDecimal("74.02"); 
BigDecimal strradius = new BigDecimal("6371"); 
BigDecimal d2 = distance.divide(strradius, 6, RoundingMode.HALF_EVEN); 
double d = d2.doubleValue(); 

,改变了公式:

end_lat=Math.asin(Math.sin(st_lat)* 
Math.cos(d)+Math.cos(st_lat)*Math.sin(d)*Math.cos(bearing)); 

答案我现在得到是39.25680143864117。 我确定我错过了一些东西,但我无法通过计算的每一步来查看我在哪里。有没有人有关于如何做到这一点的分步说明?我将不胜感激。 谢谢。

+0

为什么半径是一个整数? – 2010-11-18 15:37:00

+1

如果您使用trig函数,小距离将不会非常准确 – 2010-11-18 15:52:44

+0

您认为它会是什么? – Dave 2010-11-18 18:29:47

回答

0

你确定你正在从分钟/秒到小数进行正确的转换吗?

有60分钟的学位,每分钟60秒。如果起始纬度是39.4450;假设积极意味着赤道以北。假设106.1607的方位是从北向顺时针测量的;意味着你正在东南旅行。

你说网站告诉你答案是39°33'28“N,但是如果我把它转换成十进制,那就等于39+(33 + 28/60)/ 60 = 39.5578。这个结果比你的出发点要大,也就是说,你正在东南方向旅行,但是结束了你的观点。

我还没有看过你的代码中的数学,但我想说你的问题在于从分/秒到小数的转换和返回。

+0

鉴于原始海报没有做任何转换为​​分钟/秒,您是否建议问题是他用作参考的网站是错误的?我无法自己加载该网站,所以我实际上不能检查它在做什么...... – Chris 2010-11-18 15:56:39

+0

我怀疑网站正在以分钟/秒的形式输入并且他将它作为十进制输入...... 39°44'50“ N,而不是39°26'42“N – aepryus 2010-11-18 16:00:33

+0

啊,我明白你的意思了。绝对有可能。我想知道自己是不是像网站截取输入整数或类似的东西,在外形和距离上。 – Chris 2010-11-18 16:08:53