Answers:
您需要反复向值添加(或减去)360,直到它位于-180-180的范围内。因此通常有一对循环,例如:
lon = -187;
while(lon < -180){
lon +=360;
}
while (lon > 180){
lon -= 360;
}
while (Math.abs(lon) > 180) { lon -= Math.sign(lon) * 360 }
尽管您的版本实际上与说明相符,但我没有提供它作为答案,而我的版本只是一个优化,可能没有任何区别。我将其保留为评论仅是为了提醒您可以以多种方式完成某项工作,其中某些方法比其他方法更优化。
lon %= 180
吗?
避免条件和函数调用的答案:
longitude = (longitude % 360 + 540) % 360 - 180
我在https://jsperf.com/longitude-normalization上编写了一个快速的微基准测试,对于“合理的”输入值范围,条件代码似乎更快(在我的计算机上的Chrome中)。通常,您可能不必提前担心像这样的小型计算的性能,从而更加重视可读性和与其余代码库的一致性。
在这种情况下,可能更重要的问题是您的代码是否可能遇到极限输入值(1e10,Infinity等)。如果是这样,则循环实现最终可能会运行得非常缓慢或无声地挂起程序。这可能在极点附近执行的计算中发生,例如,尝试从极点向东或向西平移某个距离(而不是角度)可能会轻易导致无限的经度。
remainder
为modulus
。JS中的模数将得出[0,360)。
-1 % 3
是-1,而不是2,因为它在这里工作是必需的。remainder
是一个很棒的C ++解决方案,但是不幸的是,JS中没有足够类似的函数/运算符。
如果您使用的编程语言在浮点数上支持%(mod)运算符(例如Python和Ruby),则建议使用该语言。否则,某些其他语言(例如C和C ++)允许您使用fmod()。
(无论您使用哪种mod运算符,请提前确保它将对浮点数进行mod运算,并且始终会为您提供非负数的答案。否则,当您许多人纬度/经度点不正确。)
像这样使用它:
# Put the longitude in the range of [0,360):
longitude %= 360
# Put the longitude in the range of [-180,180):
if longitude >= 180:
longitude -= 360
如果您想一口气做完这一切:
# Put the longitude in the range of [-180,180):
longitude = (longitude + 180) % 360 - 180
这些方法没有循环,因此,无论您的观测值绕地球转了多少圈,它们都可以对经度值进行归一化,而无需重复进行加法或减法。
嗯...我只是注意到Javascript似乎并没有%
像我想的那样处理负值。
在这种情况下,请尝试以下一种方法:
longitude = (longitude + 36180) % 360 - 180
在36180
我们正在增加是36000 + 180。36000是负的值移动到正域,并且180是转移过来,这样,当它被改装成360
的范围内,这将是[0360) 。该- 180
部分移回[-180,180)的范围内。
这是另一种单线,它不依赖于36,000是否足够大:
longitude = (longitude % 360 + 360 + 180) % 360 - 180
longitude % 360 + 360
稍后将由修改时,该部件将确保该值保持在正数范围内360
。该+ 180
零件将其- 180
移开,以便以后从中减去180(用)时,它将在[-180,180]的期望范围内。
fmod(longitude, 360)
->(-360.0 ... +360.0)和ilongitude % 360
-> [-359 ... +359]。