我有一些gps传感器数据,它使用带符号的24位来表示每个的纬度和经度。我想以更可读的度数,分钟和秒格式转换这些数据。
我搜索了很多,但没有算法对我有效。我想在python中这样做。
规格表告诉以下
字节[8]>值:UP501的MSB收到纬度
字节[9]>值:UP501的CSB收到纬度
字节[10]>值:UP501的LSB接收纬度
字节8,9和10表示纬度。南北纬度是 使用带符号的24位字编码,其中-2 ^ 23对应于90° 南(南极)和2 ^ 23-1对应北90°(北 极)。赤道对应于0。
字节[11]>值:UP501的MSB收到经度
字节[12]>值:UP501的CSB收到经度
字节[13]>值:UP501的LSB收到经度
字节11,12和13代表经度。东西经度是 使用带符号的24位字编码,其中-2 ^ 23对应于180° 西和2 ^ 23 -1对应180°东。格林威治子午线 对应于0。
示例数据(来自8-13个字节)
1E 55 9C 1C 69 5A
应该给 21°19'44“N,39°57'13”E
编辑: 在第一个评论之后,这是问题所在 我所看到的每一个都是坐标的32位表示。这些方法对我不起作用,因为我得不到我的期望。甚至没有关闭。
这种转换有更好的方法吗?
答案 0 :(得分:3)
这有点棘手,因为涉及几个尺度。首先,将您签名的值除以2 ** 23 - 1,看看"分数"它所代表的半球。
>>> 0x1e559c / (2.**23 - 1)
0.2369876190409206
那么,90度的23.69 ...%是多少?
>>> 0x1e559c / (2.**23 - 1) * 90
21.328885713682855
21.softhing degrees;我们走在正确的轨道上。相反,请注意赤道和极点之间有90 * 3600秒的纬度。让我们看看我们拥有的那部分:
>>> 0x1e559c / (2.**23 - 1) * 90 * 3600
76783.98856925828
所以给定的值是赤道以北约76784秒;将其转换为度/分/秒:
# seconds to minutes and seconds
>>> divmod(76784, 60)
(1279, 44)
# minutes to degrees and minutes
>>> divmod(1279, 60)
(21, 19)
你的21度,19分44秒。现在,我们知道除以2**23 - 1
因为我们知道这个值小于0x7fffff,所以在北半球。 (如果值在南半球,我们需要除以2**23
,因为缩放是不对称的。)
对于经度,您将每半球乘以180*3600
秒而不是90*3600
,然后以相同的方式继续。
一个警告;我没有包含南/西半球的例子,因为我不确定90S是0x800000(两个补码)还是0xffffff(签名幅度)。