gprmc解析

  • GPRMC 实体类
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

@Data
public class GPRMC extends GpsInfoRecord {
private static Logger log = LoggerFactory.getLogger(GPRMC.class);

private static SimpleDateFormat dateFormat = new SimpleDateFormat("ddMMyy HHmmss.SSS");

static {
    // set the timezone for analysis of dates on UTC
    dateFormat.setCalendar(Calendar.getInstance(TimeZone.getTimeZone("UTC")));
}

private boolean isValid;
private double latitude;
private double longitude;
private Date readingDate;


protected GPRMC(String[] fields) {
    super(fields);

    try {
        this.readingDate = dateFormat.parse(fields[9] + " " + fields[1]);
    } catch (ParseException e) {
        log.error("Couldn't parse reading date", e);
        log.debug("Will assume _now_ as reading date");
        this.readingDate = new Date();
    }

    this.isValid = fields[2].equals("A");
    if (isValid) {
        String rawLat = fields[3];
        String rawLong = fields[5];
        if (rawLat.length() > 0 && rawLong.length() > 0) {
            int degrees = Integer.parseInt(rawLat.substring(0, 2));
            double minutes = Double.parseDouble(rawLat.substring(2));
            this.latitude = degrees + minutes / 60;
            if (fields[4].equals("S")) {
                this.latitude *= -1;
            }
            degrees = Integer.parseInt(rawLong.substring(0, 3));
            minutes = Double.parseDouble(rawLong.substring(3));
            this.longitude = degrees + minutes / 60;
            if (fields[6].equals("W")) {
                this.longitude *= -1;
            }
        }
    }
}


@Override
public String toString() {

    return "GPRMC{" +
            "isValid=" + isValid +
            ", latitude=" + latitude +
            ", longitude=" + longitude +
            ", readingDate=" + readingDate +
            '}';
}

}
  • GpsInfoRecord 类
import org.eclipse.jdt.core.compiler.InvalidInputException;

public class GpsInfoRecord extends GpsEvent{

    protected String[] fields;


    public static GpsInfoRecord createRecord(String inputLine)
            throws InvalidInputException {
        if (inputLine.length() == 0) {
            throw new InvalidInputException("输入行为空");
        }
        if (inputLine.charAt(0) != '$') {
            throw new InvalidInputException("Record doesn't start with $");
        }
        int checksumPos = inputLine.indexOf('*');
        if (checksumPos != -1) {
            /*
             * FIXME has checksum, let's check it.... but, for now, let's just
             * strip it
             */
            inputLine = inputLine.substring(0, checksumPos);
        }

        String[] fields = inputLine.substring(1).split(",");
        if (fields[0].equals("GPRMC")) {
            return new GPRMC(fields);
        } else {
            throw new InvalidInputException("Record doesn't equals  GPRMC");
        }
    }


    public GpsInfoRecord(String[] fields) {
        this.fields = fields;
    }

    public int getFieldsCount() {
        return fields.length;
    }

    public String getField(int index) {
        return fields[index];
    }

    @Override
    public String toString() {
        return fields[0] + " (from GpsEvent)";
    }
}
  • GpsEvent 监听
public abstract class GpsEvent {
}
  • 用法
//解析经纬度
                                    try {
                                        GpsInfoRecord record = GpsInfoRecord.createRecord(GPRMC格式数据);
                                        if (record instanceof GPRMC) {
                                            GPRMC gprmc = (GPRMC) record;
                                            log.info(String.valueOf(gprmc));
                                            if (gprmc.isValid()) {
                                                //纬度
                                                String lat = String.valueOf(gprmc.getLatitude());
                                                //经度
                                                String lng = String.valueOf(gprmc.getLongitude());
                                                String analyzeData = "#" + deviceNo + "#DATA:" + sensorData + "/GPS:" + lat + "," + lng;
                                                list.add(analyzeData);
                                            } else {
                                                log.info("经纬度数据无效");
                                            }
                                        }
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                        log.info("经纬度解析错误" + e.getMessage());
                                    }
  • 转换为百度坐标
String url = "http://api.map.baidu.com/geoconv/v1/?ak=mZheDDzfWAUOgebmETwCTucWSG9FZkMt&coords=" + lng + "," + lat + "&from=3";
                    JSONObject baiduResult = restTemplate.getForObject(url, JSONObject.class);
                    JSONObject coordinate = baiduResult.getJSONArray("result").getJSONObject(0);
                    x = coordinate.getString("x");
                    y = coordinate.getString("y");

avatar

取消