从24位签名转换为纬度/经度?

时间:2015-10-05 18:43:04

标签: python gps latitude-longitude

我有一些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位表示。这些方法对我不起作用,因为我得不到我的期望。甚至没有关闭。

这种转换有更好的方法吗?

1 个答案:

答案 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(签名幅度)。