【发布时间】:2016-04-08 18:38:17
【问题描述】:
我有跟踪 teltonika GPS 跟踪器的 python 脚本。 GPS数据被解析为整数,如 514511623、2201796 因此,对 10000000 的划分给了我经纬度。但是当跟踪器通过伦敦坐标时,就像这样 516631273、4293416810 所以部门给了我错误的经度。知道如何正确转换它
【问题讨论】:
标签: python gps coordinates gis tracker
我有跟踪 teltonika GPS 跟踪器的 python 脚本。 GPS数据被解析为整数,如 514511623、2201796 因此,对 10000000 的划分给了我经纬度。但是当跟踪器通过伦敦坐标时,就像这样 516631273、4293416810 所以部门给了我错误的经度。知道如何正确转换它
【问题讨论】:
标签: python gps coordinates gis tracker
我不熟悉 teltonika GPS 追踪器。但似乎你得到的经度数与负整数有关。该位置非常靠近经度为 0 的格林威治。一开始是 0.22... 经度。然后,它去了负经度区。但 GPS 接收器只处理正整数。假设它使用 32 位无符号整数,则最大 inter 为 2**32 = 4294967296 如果从 4293416810 中减去该数字
4293416810 - 4294967296 = -1550486
-1550486/1e7 = -0.1550486 longitude
所以当您靠近格林威治时,经度从 0.2201796 变为 -0.1550486。
【讨论】:
在使用 javascript 代码时,我在使用 teltonika 设备时遇到了同样的问题。这是我与teltonika技术团队讨论后的解决方案,希望您能将其转换为python。
注意:这里不需要加负号,因为我们是用较小的值减去较大的值
// NOTE: lat and lon should be a valid hex of 4 bytes each.
function fixLatLon(num) {
let maxVal = Math.pow(2, 32-1);
if (num > maxVal) num = maxVal - num
return num;
}
以下是将任意长度的hex 转换为相应的lat lon 的通用解决方案。
请注意,此通用解决方案将其除以 1e7 并为您提供最终可用的纬度、经度
function getTeltonikaLatLonFromHex(hexString) {
if (hexString.length % 2 != 0) hexString = "0" + hexString;
let num = parseInt(hexString, 16);
let maxVal = Math.pow(2, hexString.length / 2 * 8 - 1);
if (num > maxVal) num = maxVal - num;
return num / 1e7;
}
【讨论】: