緯度
佔用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]).