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

 

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