Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从24位符号转换为纬度/经度?_Python_Gps_Latitude Longitude - Fatal编程技术网

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

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 字节

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


有更好的转换方法吗?

这有点棘手,因为涉及到几个尺度。首先,将符号值除以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知之甚少