纬度
占用4个字节,表示定位数据的纬度值。数值范围0至162000000,表示0度到90度的范围,单位:1/500秒。
转换方法如下:
1、 把GPS模块输出的经纬度值转化成以分为单位的小数;
2、 把转化后的小数乘以30000,把相乘的结果转换成16进制数即可
如22°32.7658′,(22*60+32.7658)*30000 = 40582974,然后转换成十六进制数为0x026B3F3E。
经度
占用4个字节,表示定位数据的经度值。数值范围0至324000000,表示0度到180度的范围,单位:1/500秒,转换方法和纬度的转换方法一致。例子中表示的经度值为114°05.3769′。
程序处理接收到的数据
java实现
package com.platform.modules.summergao.util;
import cn.hutool.core.util.NumberUtil;
import java.math.BigDecimal;
public class GPSUtils {
/**
*
* @param hexStr: 026B3F3E
* @return 32.76580
*/
public static String convertGpsLongitudeAndLatitudeFromHex(String hexStr) {
Integer data = Integer.valueOf(hexStr, 16);
BigDecimal b1= new BigDecimal(data);
BigDecimal b2 = NumberUtil.div(b1, new BigDecimal("30000"), 5);
System.out.println(b2);
BigDecimal b3 = b2.setScale(0, BigDecimal.ROUND_DOWN);
System.out.println(b3);
BigDecimal b4 = NumberUtil.div(b3, new BigDecimal("60")).setScale(0, BigDecimal.ROUND_DOWN);
System.out.println(b4);
BigDecimal b5 = NumberUtil.sub(b2, NumberUtil.mul(b4, new BigDecimal("60")));
return b5.toString();
}
public static void main(String[] args) {
System.out.println(convertGpsLongitudeAndLatitudeFromHex("026B3F3E"));//32.76580
}
}
Erlang实现
%% HexStr = "026B3F3E",
-spec(generate_command(HexStr :: string()) -> string()).
convertGpsLongitudeAndLatitudeFromHex(HexStr) ->
Data = list_to_integer(HexStr, 16),
io_lib:format("~.5f", [(Data / 30000) - ((Data div 30000) div 60) * 60]).