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 +
'}';
}
}
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)";
}
}
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");