Python 从24位符号转换为纬度/经度?
我有一些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〃,东经39°57′13〃 编辑: 在第一次评论之后,问题就来了 我看到的每个地方都是坐标的32位表示。这些方法对我不起作用,因为我没有得到我所期望的。甚至不接近Python 从24位符号转换为纬度/经度?,python,gps,latitude-longitude,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 字节
有更好的转换方法吗?这有点棘手,因为涉及到几个尺度。首先,将符号值除以2**23-1,看看它代表的半球的“分数”
>>> 0x1e559c / (2.**23 - 1)
0.2369876190409206
那么,90度的23.69…%是多少
>>> 0x1e559c / (2.**23 - 1) * 90
21.328885713682855
21.2学位;我们在正确的轨道上。相反,请注意赤道和极点之间有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
,然后以相同的方式继续
一个警告;我没有包括南半球/西半球的例子,因为我不确定90年代是0x800000(二的补码)还是0xffffff(符号震级)。那么,问题是什么?你尝试了什么?你被困在哪里了?这有点难看;缩放因子根据所处0的哪一侧而不同。(例如,有2**12值表示南纬度,但只有2**12-1值表示北纬度。)我尝试过,也读过其他解决方案,但到处都是它的32位无符号表示,而不是24位signed@gbs我不需要密码,我不是在要求密码。我可以自己写代码。问题是我找不到转换算法。你知道如何从数学上把这个十六进制转换成lat/long吗?可以除以x,乘以y等等?lat是
int(“1E559C”,16)
,我想每个度数都是93206.7
,潜水会得到21.328883171081543
,但我对计算lat和long知之甚少