繁体   English   中英

从24位带符号转换为纬度/经度?

[英]Convert from 24 bit signed to 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位表示形式。 这些方法对我不起作用,因为我没有得到我期望的结果。 差远了。

有没有更好的转换方法?

这有点棘手,因为涉及多个尺度。 首先,将您的带符号值除以2 ** 23-1,以查看其代表的半球的“分数”。

>>> 0x1e559c / (2.**23 - 1)
0.2369876190409206

那么,什么是90度的23.69 ...%?

>>> 0x1e559c / (2.**23 - 1) * 90
21.328885713682855

21.东西度; 我们走在正确的轨道上。 相反,请注意,赤道和两极之间的纬度为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 23-1,因为我们知道该值小于0x7fffff,因此在北半球也是如此。 (如果该值在南半球,则需要除以2**23 ,因为缩放比例是不对称的。)

对于经度,您将每个半球乘以180*3600秒而不是90*3600 ,然后以相同的方式进行。


一个警告: 我没有提供南半球/西半球的示例,因为我不确定90S是0x800000(二进制补码)还是0xffffff(符号幅度)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM