GPS終端16進制經緯度相互轉換

緯度

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章