Commit 12255d2c authored by caotao's avatar caotao

1.对于查询的原始速度为0的数据进行处理。

2.增加方法对于纠偏后的数据的速度进行插点处理。
parent 8df5c64f
...@@ -19,6 +19,7 @@ import com.yeejoin.equipmanage.service.ICarService; ...@@ -19,6 +19,7 @@ import com.yeejoin.equipmanage.service.ICarService;
import com.yeejoin.equipmanage.service.IWlCarMileageService; import com.yeejoin.equipmanage.service.IWlCarMileageService;
import com.yeejoin.equipmanage.thread.ThreadCarMileageTreatment; import com.yeejoin.equipmanage.thread.ThreadCarMileageTreatment;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.checkerframework.checker.units.qual.Speed;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -59,340 +60,334 @@ import java.util.stream.Collectors; ...@@ -59,340 +60,334 @@ import java.util.stream.Collectors;
@EnableScheduling @EnableScheduling
@EnableAsync @EnableAsync
public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlCarMileage> public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlCarMileage>
implements IWlCarMileageService { implements IWlCarMileageService {
@Value("${car.max.speed:100}") private static final Logger log = LoggerFactory.getLogger(HttpUtil.class);
private Integer CAR_MAX_SPEED; private final String GUIDE_KEY = "813684495d9a3981dd2c7694916fe404";
@Autowired private final String GUIDE_URL = "https://restapi.amap.com/v4/grasproad/driving?";
IotFeign iotFeign; private final String GUIDE_ADDRESS_URL = "https://restapi.amap.com/v3/geocode/regeo?";
@Autowired
IotFeign iotFeign;
@Autowired
ICarService iCarService;
@Value("${car.max.speed:100}")
private Integer CAR_MAX_SPEED;
@Value("${mileage.parameter}")
private Double mileageParameter;
@Resource
private EmqKeeper emqKeeper;
@Autowired public static List<String> getDayByMonth(Date date) {
ICarService iCarService; List<String> data = new ArrayList<>();
try {
Calendar c = Calendar.getInstance();
c.setTime(date);
// 获取当前的年份
int year = c.get(Calendar.YEAR);
// 获取当前的月份(需要加1才是现在的月份)
int month = c.get(Calendar.MONTH) + 1;
// 获取本月的总天数
int dayCount = c.getActualMaximum(Calendar.DAY_OF_MONTH);
// 定义时间格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 开始日期为当前年月拼接1号
Date startDate = sdf.parse(year + "-" + month + "-01");
// 结束日期为当前年月拼接该月最大天数
Date endDate = sdf.parse(year + "-" + month + "-" + dayCount);
// 设置calendar的开始日期
c.setTime(startDate);
// 当前时间小于等于设定的结束时间
while (c.getTime().compareTo(endDate) <= 0) {
String time = sdf.format(c.getTime());
data.add(time);
// 当前日期加1
c.add(Calendar.DATE, 1);
}
} catch (ParseException e) {
e.printStackTrace();
}
return data;
}
@Value("${mileage.parameter}") @Override
private Double mileageParameter; public Page<WlCarMileage> page(Page<WlCarMileage> page, WlCarMileage wlCarMileage) {
return this.baseMapper.page(page, wlCarMileage, mileageParameter);
}
@Resource @Override
private EmqKeeper emqKeeper; public Double totalMileage(String iotCode) {
return this.baseMapper.totalMileage(iotCode);
}
private static final Logger log = LoggerFactory.getLogger(HttpUtil.class); @Override
public List<Coordinate> getCoordinateList(long id) {
double speed = 0;
WlCarMileage wlCarMileage = this.getById(id);
String iotCode = wlCarMileage.getIotCode();
String measurement = iotCode.substring(0, 8);
String deviceName = iotCode.replace(measurement, "");
// 由于iot存在毫秒故结束时间要+1秒 iot+1秒有bug还是查不到 +2秒
ResponseModel<List<Object>> result = iotFeign.getLiveData(measurement, deviceName, wlCarMileage.getStartTime(),
new Date(wlCarMileage.getEndTime().getTime()));
List<Object> list = result.getResult();
List<Coordinate> coordinateList = new ArrayList<Coordinate>();
if (list != null) {
DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
DateFormat format2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
for (Object object : list) {
JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(object));
if (jsonObject.get("FireCar_Longitude") != null && jsonObject.get("FireCar_Latitude") != null) {
Coordinate coordinate = new Coordinate();
List<Double> lnglat = new ArrayList<Double>();
lnglat.add(jsonObject.getDoubleValue("FireCar_Longitude"));
lnglat.add(jsonObject.getDoubleValue("FireCar_Latitude"));
coordinate.setLnglat(lnglat);
coordinate.setSpeed(jsonObject.getDoubleValue("fireCar_Speed"));
speed = speed + jsonObject.getDoubleValue("fireCar_Speed");
String time = jsonObject.getString("time");
if (time.length() > 20) {
try {
coordinate.setTime(format1.parse(jsonObject.getString("time")).getTime());
} catch (ParseException e) {
e.printStackTrace();
}
} else {
try {
coordinate.setTime(format2.parse(jsonObject.getString("time")).getTime());
} catch (ParseException e) {
e.printStackTrace();
}
}
double direction = jsonObject.getDoubleValue("direction");
if (!ObjectUtils.isEmpty(direction)) {
coordinate.setDirection(jsonObject.getDoubleValue("direction"));
} else {
coordinate.setDirection(0);
}
coordinateList.add(coordinate);
}
}
}
// 倒序坐标变为正序
Collections.reverse(coordinateList);
private final String GUIDE_KEY = "813684495d9a3981dd2c7694916fe404"; // 坐标轨迹纠偏
double avgSpeed = speed / coordinateList.size();
double count = Double.valueOf(coordinateList.size()) / 500;
int ceil = (int) Math.ceil(count);
ArrayList<Coordinate> resultList = new ArrayList<>();
for (int i = 1; i <= ceil; i++) {
if (i == ceil) {
List<Coordinate> coordinates = coordinateList.subList(500 * (i - 1), coordinateList.size());
List<Coordinate> check = check(coordinates, avgSpeed);
resultList.addAll(check);
} else {
List<Coordinate> coordinates = coordinateList.subList(500 * (i - 1), 500 + (i - 1) * 500);
List<Coordinate> check = check(coordinates, avgSpeed);
resultList.addAll(check);
}
private final String GUIDE_URL = "https://restapi.amap.com/v4/grasproad/driving?"; }
private final String GUIDE_ADDRESS_URL = "https://restapi.amap.com/v3/geocode/regeo?"; return resultList;
}
@Override private List<Coordinate> check(List<Coordinate> list, double avgSpeed) {
public Page<WlCarMileage> page(Page<WlCarMileage> page, WlCarMileage wlCarMileage) { ArrayList<Coordinate> coordinates = new ArrayList<>();
return this.baseMapper.page(page, wlCarMileage, mileageParameter); JSONArray objects = new JSONArray();
} int count = 0;
for (Coordinate coordinate : list) {
JSONObject jsonObject = new JSONObject();
// 经度
jsonObject.put("x", coordinate.getLnglat().get(0));
// 纬度
jsonObject.put("y", coordinate.getLnglat().get(1));
// 角度
jsonObject.put("ag", coordinate.getDirection());
// 速度
jsonObject.put("sp", coordinate.getSpeed() > 0 ? coordinate.getSpeed() : avgSpeed);
// 时间
if (count == 0) {
jsonObject.put("tm", coordinate.getTime() / 1000);
} else {
jsonObject.put("tm", 3 * count);
}
count += 1;
objects.add(jsonObject);
}
String s = objects.toJSONString();
StringBuilder api = new StringBuilder(GUIDE_URL);
api.append("key=").append(GUIDE_KEY);
String result = null;
try {
result = HttpUtil.post(api.toString(), s);
} catch (IOException | NoSuchAlgorithmException | KeyStoreException | KeyManagementException e) {
e.printStackTrace();
}
if (result != null) {
Map<String, Object> jsonObject = (Map<String, Object>) JSONObject.parseObject(result);
//判断是否坐标不满足高德地图纠偏需求
if (jsonObject.containsKey("errcode") && jsonObject.get("errcode").toString().equals("30001")) {
return list;
}
if (jsonObject.containsKey("data")) {
JSONObject data3 = JSONObject.parseObject(jsonObject.get("data").toString());
JSONArray points1 = JSONArray.parseArray(data3.get("points").toString());
for (int i = 0; i < points1.size(); i++) {
JSONObject jsonObject1 = JSONObject.parseObject(points1.get(i).toString());
List<Double> doubles = new ArrayList<>();
Coordinate coordinate = new Coordinate();
doubles.add(Double.valueOf(jsonObject1.get("x").toString()));
doubles.add(Double.valueOf(jsonObject1.get("y").toString()));
coordinate.setLnglat(doubles);
Double speeed = getSpeedByOriginalData(objects, Double.valueOf(jsonObject1.get("x").toString()), Double.valueOf(jsonObject1.get("y").toString()), i );
coordinate.setSpeed(speeed);
coordinates.add(coordinate);
}
}
}
@Override return coordinates;
public Double totalMileage(String iotCode) { }
return this.baseMapper.totalMileage(iotCode);
}
@Override @Override
public List<Coordinate> getCoordinateList(long id) { public Map<String, Boolean> getCalender(long id, Date date) {
double speed = 0; List<String> daylist = new ArrayList<String>();
WlCarMileage wlCarMileage = this.getById(id); Map<String, Boolean> map = new HashMap<>();
String iotCode = wlCarMileage.getIotCode(); Car car = iCarService.getById(id);
String measurement = iotCode.substring(0,8); if (car == null || car.getIotCode() == null || date == null) {
String deviceName = iotCode.replace(measurement, ""); return map;
// 由于iot存在毫秒故结束时间要+1秒 iot+1秒有bug还是查不到 +2秒 }
ResponseModel<List<Object>> result = iotFeign.getLiveData(measurement, deviceName, wlCarMileage.getStartTime(), Calendar c = Calendar.getInstance();
new Date(wlCarMileage.getEndTime().getTime())); // 获取上一个月
List<Object> list = result.getResult(); c.setTime(date);
List<Coordinate> coordinateList = new ArrayList<Coordinate>(); c.add(Calendar.MONTH, -1);
if (list != null) { daylist.addAll(getDayByMonth(c.getTime()));
DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
DateFormat format2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
for (Object object : list) {
JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(object));
if (jsonObject.get("FireCar_Longitude") != null && jsonObject.get("FireCar_Latitude") != null) {
Coordinate coordinate = new Coordinate();
List<Double> lnglat = new ArrayList<Double>();
lnglat.add(jsonObject.getDoubleValue("FireCar_Longitude"));
lnglat.add(jsonObject.getDoubleValue("FireCar_Latitude"));
coordinate.setLnglat(lnglat);
coordinate.setSpeed(jsonObject.getDoubleValue("FireCar_Speed"));
speed = speed + jsonObject.getDoubleValue("FireCar_Speed");
String time = jsonObject.getString("time");
if (time.length() > 20) {
try {
coordinate.setTime(format1.parse(jsonObject.getString("time")).getTime());
} catch (ParseException e) {
e.printStackTrace();
}
} else {
try {
coordinate.setTime(format2.parse(jsonObject.getString("time")).getTime());
} catch (ParseException e) {
e.printStackTrace();
}
}
double direction = jsonObject.getDoubleValue("direction");
if (!ObjectUtils.isEmpty(direction)){
coordinate.setDirection(jsonObject.getDoubleValue("direction"));
}else {
coordinate.setDirection(0);
}
coordinateList.add(coordinate);
}
}
}
// 倒序坐标变为正序
Collections.reverse(coordinateList);
// 坐标轨迹纠偏 // 获取当月
double avgSpeed = speed / coordinateList.size(); c.setTime(date);
double count = Double.valueOf(coordinateList.size()) / 500; daylist.addAll(getDayByMonth(c.getTime()));
int ceil = (int) Math.ceil(count);
ArrayList<Coordinate> resultList = new ArrayList<>();
for (int i = 1; i <= ceil; i++) {
if (i == ceil) {
List<Coordinate> coordinates = coordinateList.subList(500 * (i - 1), coordinateList.size());
List<Coordinate> check = check(coordinates, avgSpeed);
resultList.addAll(check);
} else {
List<Coordinate> coordinates = coordinateList.subList(500 * (i - 1), 500 + (i - 1) * 500);
List<Coordinate> check = check(coordinates, avgSpeed);
resultList.addAll(check);
}
} // 获取下一个月
c.setTime(date);
return resultList; c.add(Calendar.MONTH, 1);
} daylist.addAll(getDayByMonth(c.getTime()));
private List<Coordinate> check(List<Coordinate> list, double avgSpeed) {
ArrayList<Coordinate> coordinates = new ArrayList<>();
JSONArray objects = new JSONArray();
int count = 0;
for (Coordinate coordinate : list) {
JSONObject jsonObject = new JSONObject();
// 经度
jsonObject.put("x", coordinate.getLnglat().get(0));
// 纬度
jsonObject.put("y", coordinate.getLnglat().get(1));
// 角度
jsonObject.put("ag", coordinate.getDirection());
// 速度
jsonObject.put("sp", coordinate.getSpeed());
// 时间
if (count == 0) {
jsonObject.put("tm", coordinate.getTime() / 1000);
} else {
jsonObject.put("tm", 3 * count);
}
count += 1;
objects.add(jsonObject);
}
String s = objects.toJSONString();
StringBuilder api = new StringBuilder(GUIDE_URL);
api.append("key=").append(GUIDE_KEY);
String result = null;
try {
result = HttpUtil.post(api.toString(), s);
} catch (IOException | NoSuchAlgorithmException | KeyStoreException | KeyManagementException e) {
e.printStackTrace();
}
if (result != null) {
Map<String, Object> jsonObject = (Map<String, Object>) JSONObject.parseObject(result);
//判断是否坐标不满足高德地图纠偏需求
if(jsonObject.containsKey("errcode")&&jsonObject.get("errcode").toString().equals("30001")){
return list;
}
if (jsonObject.containsKey("data")) {
JSONObject data3 = JSONObject.parseObject(jsonObject.get("data").toString());
JSONArray points1 = JSONArray.parseArray(data3.get("points").toString());
points1.forEach(item -> {
JSONObject jsonObject1 = JSONObject.parseObject(item.toString());
List<Double> doubles = new ArrayList<>();
Coordinate coordinate = new Coordinate();
doubles.add(Double.valueOf(jsonObject1.get("x").toString()));
doubles.add(Double.valueOf(jsonObject1.get("y").toString()));
coordinate.setLnglat(doubles);
coordinate.setSpeed(avgSpeed);
coordinates.add(coordinate);
});
}
}
return coordinates;
}
@Override
public Map<String, Boolean> getCalender(long id, Date date) {
List<String> daylist = new ArrayList<String>();
Map<String, Boolean> map = new HashMap<>();
Car car = iCarService.getById(id);
if (car == null || car.getIotCode() == null || date == null) {
return map;
}
Calendar c = Calendar.getInstance();
// 获取上一个月
c.setTime(date);
c.add(Calendar.MONTH, -1);
daylist.addAll(getDayByMonth(c.getTime()));
// 获取当月
c.setTime(date);
daylist.addAll(getDayByMonth(c.getTime()));
// 获取下一个月
c.setTime(date);
c.add(Calendar.MONTH, 1);
daylist.addAll(getDayByMonth(c.getTime()));
// List<Map<String, Object>> hasList = this.listMaps(new QueryWrapper<WlCarMileage>() // List<Map<String, Object>> hasList = this.listMaps(new QueryWrapper<WlCarMileage>()
// .select("COUNT(1) AS count,date").lambda().eq(WlCarMileage::getIotCode, car.getIotCode()) // .select("COUNT(1) AS count,date").lambda().eq(WlCarMileage::getIotCode, car.getIotCode())
// .between(WlCarMileage::getDate, daylist.get(0), daylist.get(daylist.size() - 1)) // .between(WlCarMileage::getDate, daylist.get(0), daylist.get(daylist.size() - 1))
// .isNotNull(WlCarMileage::getEndTime) // .isNotNull(WlCarMileage::getEndTime)
// .ge(WlCarMileage::getTravel, 0.5) // .ge(WlCarMileage::getTravel, 0.5)
// .groupBy(WlCarMileage::getDate)); // .groupBy(WlCarMileage::getDate));
Map<String, Object> hasMap = new HashMap<>(); Map<String, Object> hasMap = new HashMap<>();
List<WlCarMileage> wlCarMileageList = this.list(new QueryWrapper<WlCarMileage>().eq("iot_code", car.getIotCode()) List<WlCarMileage> wlCarMileageList = this.list(new QueryWrapper<WlCarMileage>().eq("iot_code", car.getIotCode())
.between("date", daylist.get(0), daylist.get(daylist.size() - 1)) .between("date", daylist.get(0), daylist.get(daylist.size() - 1))
.isNotNull("end_time") .isNotNull("end_time")
.ge("travel", 0.5) .ge("travel", 0.5)
.groupBy("date")); .groupBy("date"));
List<WlCarMileage> wlCarMileageListActiveData = wlCarMileageList.stream().filter(wl -> (!ObjectUtils.isEmpty(wl.getTakeTime()) && !ObjectUtils.isEmpty(wl.getTravel()) && ((wl.getTravel() / (wl.getTakeTime() / 3600000.0)) < CAR_MAX_SPEED))).collect(Collectors.toList()); List<WlCarMileage> wlCarMileageListActiveData = wlCarMileageList.stream().filter(wl -> (!ObjectUtils.isEmpty(wl.getTakeTime()) && !ObjectUtils.isEmpty(wl.getTravel()) && ((wl.getTravel() / (wl.getTakeTime() / 3600000.0)) < CAR_MAX_SPEED))).collect(Collectors.toList());
List<String> activeDateList = wlCarMileageListActiveData.stream().map(wlCarMileage -> String.valueOf(DateUtils.convertDateToString(wlCarMileage.getDate(),DateUtils.DATE_PATTERN))).collect(Collectors.toList()); List<String> activeDateList = wlCarMileageListActiveData.stream().map(wlCarMileage -> String.valueOf(DateUtils.convertDateToString(wlCarMileage.getDate(), DateUtils.DATE_PATTERN))).collect(Collectors.toList());
for (String day : daylist) { for (String day : daylist) {
boolean has = false; boolean has = false;
if (activeDateList.contains(day)) { if (activeDateList.contains(day)) {
has = true; has = true;
} }
map.put(day, has); map.put(day, has);
} }
return map; return map;
} }
public static List<String> getDayByMonth(Date date) {
List<String> data = new ArrayList<>();
try {
Calendar c = Calendar.getInstance();
c.setTime(date);
// 获取当前的年份
int year = c.get(Calendar.YEAR);
// 获取当前的月份(需要加1才是现在的月份)
int month = c.get(Calendar.MONTH) + 1;
// 获取本月的总天数
int dayCount = c.getActualMaximum(Calendar.DAY_OF_MONTH);
// 定义时间格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 开始日期为当前年月拼接1号
Date startDate = sdf.parse(year + "-" + month + "-01");
// 结束日期为当前年月拼接该月最大天数
Date endDate = sdf.parse(year + "-" + month + "-" + dayCount);
// 设置calendar的开始日期
c.setTime(startDate);
// 当前时间小于等于设定的结束时间
while (c.getTime().compareTo(endDate) <= 0) {
String time = sdf.format(c.getTime());
data.add(time);
// 当前日期加1
c.add(Calendar.DATE, 1);
}
} catch (ParseException e) {
e.printStackTrace();
}
return data;
}
@Override @Override
@Scheduled(cron = "${mileage.segmentation.cron}") @Scheduled(cron = "${mileage.segmentation.cron}")
@Async @Async
public void mileageSegmentation() { public void mileageSegmentation() {
log.info("轨迹切分定时任务开始执行时间.............{}", LocalDateTime.now()); log.info("轨迹切分定时任务开始执行时间.............{}", LocalDateTime.now());
Calendar cal = Calendar.getInstance(); Calendar cal = Calendar.getInstance();
cal.setTime(new Date()); cal.setTime(new Date());
cal.add(Calendar.DATE, -1); cal.add(Calendar.DATE, -1);
String nowDate = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime()); String nowDate = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
log.info("轨迹切分定时任务数据过滤时间.............{}", nowDate); log.info("轨迹切分定时任务数据过滤时间.............{}", nowDate);
List<WlCarMileage> list = this.baseMapper.list(nowDate); List<WlCarMileage> list = this.baseMapper.list(nowDate);
log.info("需要切分数据, {}", list); log.info("需要切分数据, {}", list);
//销毁所有线程和所有上次坐标 //销毁所有线程和所有上次坐标
//销毁所有线程 //销毁所有线程
log.info("销毁所有有效线程开始"); log.info("销毁所有有效线程开始");
CarIotNewListener.deviceInfo.keySet().forEach(s->{ CarIotNewListener.deviceInfo.keySet().forEach(s -> {
try { try {
CarIotNewListener.deviceInfo.get(s).interrupt(); CarIotNewListener.deviceInfo.get(s).interrupt();
}catch (Exception e){ } catch (Exception e) {
log.info("销毁有效线程失败"+e.getMessage()); log.info("销毁有效线程失败" + e.getMessage());
} }
}); });
CarIotNewListener.deviceInfo.clear(); CarIotNewListener.deviceInfo.clear();
log.info("销毁所有有效线程成功"); log.info("销毁所有有效线程成功");
//销毁所有的坐标信息 //销毁所有的坐标信息
log.info("销毁所有坐标信息开始"); log.info("销毁所有坐标信息开始");
CarIotNewListener.deviceLastInfo.clear(); CarIotNewListener.deviceLastInfo.clear();
log.info("销毁所有坐标信息成功"); log.info("销毁所有坐标信息成功");
log.info("------------------开始切分里程-------------------------------"); log.info("------------------开始切分里程-------------------------------");
list.forEach(item -> { list.forEach(item -> {
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
calendar.setTime(item.getDate()); calendar.setTime(item.getDate());
calendar.add(Calendar.DATE, 1); calendar.add(Calendar.DATE, 1);
Date date = calendar.getTime(); Date date = calendar.getTime();
//iotcode有效 //iotcode有效
if (!ObjectUtils.isEmpty(item.getIotCode()) && item.getIotCode().length() > 8) { if (!ObjectUtils.isEmpty(item.getIotCode()) && item.getIotCode().length() > 8) {
// 查询车辆上报信息 // 查询车辆上报信息
ResponseModel<List<Object>> result = iotFeign.getLiveData(item.getIotCode().substring(0, 8), item.getIotCode().substring(8), ResponseModel<List<Object>> result = iotFeign.getLiveData(item.getIotCode().substring(0, 8), item.getIotCode().substring(8),
item.getStartTime(), new Date(new Date().getTime() + 2000)); item.getStartTime(), new Date(new Date().getTime() + 2000));
List<Object> list1 = result.getResult(); List<Object> list1 = result.getResult();
// 获取最后一个有坐标的数据 // 获取最后一个有坐标的数据
JSONObject lastObj = null; JSONObject lastObj = null;
// 过滤空坐标 // 过滤空坐标
List<Object> filterList = new ArrayList<Object>(); List<Object> filterList = new ArrayList<Object>();
for (int i = 0; i < list1.size(); i++) { for (int i = 0; i < list1.size(); i++) {
JSONObject Obj = JSONObject.parseObject(JSONObject.toJSONString(list1.get(i))); JSONObject Obj = JSONObject.parseObject(JSONObject.toJSONString(list1.get(i)));
if (Obj.get("FireCar_Longitude") != null && Obj.get("FireCar_Latitude") != null if (Obj.get("FireCar_Longitude") != null && Obj.get("FireCar_Latitude") != null
&& Obj.getDoubleValue("FireCar_Longitude") != 0 && Obj.getDoubleValue("FireCar_Longitude") != 0
&& Obj.getDoubleValue("FireCar_Latitude") != 0) { && Obj.getDoubleValue("FireCar_Latitude") != 0) {
filterList.add(list1.get(i)); filterList.add(list1.get(i));
// 获取第一个不为空的坐标 // 获取第一个不为空的坐标
if (lastObj == null) { if (lastObj == null) {
lastObj = Obj; lastObj = Obj;
} }
} }
} }
if (lastObj == null) { if (lastObj == null) {
lastObj = new JSONObject(); lastObj = new JSONObject();
lastObj.put("FireCar_Longitude", 0.0); lastObj.put("FireCar_Longitude", 0.0);
lastObj.put("FireCar_Latitude", 0.0); lastObj.put("FireCar_Latitude", 0.0);
lastObj.put("time", 0); lastObj.put("time", 0);
lastObj.put("FireCar_Speed", 0); lastObj.put("FireCar_Speed", 0);
} }
// 当前坐标 // 当前坐标
double startLongitude = lastObj.getDoubleValue("FireCar_Longitude"); double startLongitude = lastObj.getDoubleValue("FireCar_Longitude");
double startLatitude = lastObj.getDoubleValue("FireCar_Latitude"); double startLatitude = lastObj.getDoubleValue("FireCar_Latitude");
// 当前速度 // 当前速度
Double v = Double.parseDouble(String.valueOf(lastObj.get("FireCar_Speed"))); Double v = Double.parseDouble(String.valueOf(lastObj.get("FireCar_Speed")));
item.setStartSpeed(v.intValue()); item.setStartSpeed(v.intValue());
double travel = 0.0; double travel = 0.0;
// 获取里程 // 获取里程
for (int i = 0; i < filterList.size() - 1; i++) { for (int i = 0; i < filterList.size() - 1; i++) {
JSONObject start = JSONObject.parseObject(JSONObject.toJSONString(filterList.get(i))); JSONObject start = JSONObject.parseObject(JSONObject.toJSONString(filterList.get(i)));
JSONObject end = JSONObject.parseObject(JSONObject.toJSONString(filterList.get(i + 1))); JSONObject end = JSONObject.parseObject(JSONObject.toJSONString(filterList.get(i + 1)));
travel += CoordinateUtil.distance(start.getDoubleValue("FireCar_Latitude"), travel += CoordinateUtil.distance(start.getDoubleValue("FireCar_Latitude"),
start.getDoubleValue("FireCar_Longitude"), end.getDoubleValue("FireCar_Latitude"), start.getDoubleValue("FireCar_Longitude"), end.getDoubleValue("FireCar_Latitude"),
end.getDoubleValue("FireCar_Longitude")); end.getDoubleValue("FireCar_Longitude"));
} }
// 查询车辆最新位置 // 查询车辆最新位置
String address = getAddress(startLongitude, startLatitude); String address = getAddress(startLongitude, startLatitude);
// 里程耗时 // 里程耗时
long takeTime = (date.getTime()) - (item.getStartTime().getTime()); long takeTime = (date.getTime()) - (item.getStartTime().getTime());
// 修改0点未结束里程记录 // 修改0点未结束里程记录
item.setEndSpeed(v.intValue()); item.setEndSpeed(v.intValue());
item.setEndTime(date); item.setEndTime(date);
item.setEndLatitude(startLatitude); item.setEndLatitude(startLatitude);
item.setEndLongitude(startLongitude); item.setEndLongitude(startLongitude);
item.setEndName(address); item.setEndName(address);
item.setTravel(new BigDecimal(travel / 1000).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue()); item.setTravel(new BigDecimal(travel / 1000).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue());
item.setTakeTime(takeTime); item.setTakeTime(takeTime);
this.getBaseMapper().updateById(item); this.getBaseMapper().updateById(item);
log.info("-----------结束里程成功:::"+JSONObject.toJSONString(item)+"-----------------"); log.info("-----------结束里程成功:::" + JSONObject.toJSONString(item) + "-----------------");
// // 从0点开启新里程 // // 从0点开启新里程
// item.setStartName(address); // item.setStartName(address);
// item.setDate(date); // item.setDate(date);
...@@ -420,73 +415,100 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC ...@@ -420,73 +415,100 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
// emqKeeper.getMqttClient().publish(item.getIotCode().substring(0, 8)+"/"+item.getIotCode().substring(8)+"/property",JSON.toJSON(messageMap).toString().getBytes("UTF-8"),1,false); // emqKeeper.getMqttClient().publish(item.getIotCode().substring(0, 8)+"/"+item.getIotCode().substring(8)+"/property",JSON.toJSON(messageMap).toString().getBytes("UTF-8"),1,false);
// } catch (Exception e) { // } catch (Exception e) {
// } // }
//根据iotcode获取车辆并且同步经纬度到车辆 //根据iotcode获取车辆并且同步经纬度到车辆
Car car = iCarService.getOne(new QueryWrapper<Car>().eq("iot_code", item.getIotCode())); Car car = iCarService.getOne(new QueryWrapper<Car>().eq("iot_code", item.getIotCode()));
car.setLongitude(startLongitude); car.setLongitude(startLongitude);
car.setLatitude(startLatitude); car.setLatitude(startLatitude);
iCarService.saveOrUpdate(car); iCarService.saveOrUpdate(car);
log.info("-----------更新车辆坐标成功:::"+JSONObject.toJSONString(item)+"-----------------"); log.info("-----------更新车辆坐标成功:::" + JSONObject.toJSONString(item) + "-----------------");
} }
}); });
log.info("轨迹切分任务执行完成.............."); log.info("轨迹切分任务执行完成..............");
// log.info("-------------------对于切割完成的数据进行倒计时操作----------------------------------"); // log.info("-------------------对于切割完成的数据进行倒计时操作----------------------------------");
// ThreadCarMileageTreatment threadCarMileageTreatment = new ThreadCarMileageTreatment(this,iCarService , iotFeign); // ThreadCarMileageTreatment threadCarMileageTreatment = new ThreadCarMileageTreatment(this,iCarService , iotFeign);
// log.info("-------------------对于切割完成的数据进行倒计时开始----------------------------------"); // log.info("-------------------对于切割完成的数据进行倒计时开始----------------------------------");
// threadCarMileageTreatment.start(); // threadCarMileageTreatment.start();
// log.info("-------------------对于切割完成的数据进行倒计时结束----------------------------------"); // log.info("-------------------对于切割完成的数据进行倒计时结束----------------------------------");
} }
@Override
public Boolean getUncompleteMileagByIotCode(String iotCode) {
Integer integer = this.count(new QueryWrapper<WlCarMileage>().select("1").lambda().eq(WlCarMileage::getIotCode, iotCode).isNull(WlCarMileage::getEndTime));
return integer <= 0;
}
private String getAddress(double longitude, double lantitude) {
StringBuilder api = new StringBuilder(GUIDE_ADDRESS_URL);
api.append("key=").append(GUIDE_KEY).append("&location=").append(longitude).append(",").append(lantitude)
.append("&radius=1000").append("&batch=false").append("&extensions=base").append("&roadlevel=0")
.append("&batch=false");
StringBuilder res = new StringBuilder();
BufferedReader in = null;
try {
System.out.println(api.toString());
URL url = new URL(api.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
String line;
while ((line = in.readLine()) != null) {
res.append(line).append("\n");
}
JSONObject object = JSONObject.parseObject(res.toString());
JSONObject regeocode = object.getJSONObject("regeocode");
String address = regeocode.getString("formatted_address");
if ("[]".equals(address)) {
address = "无效坐标";
}
res = new StringBuilder(address);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return res.toString();
}
@Override @Override
public Boolean getUncompleteMileagByIotCode(String iotCode) { public Double getTotalTravelByIotCodeAndDate(String date, String iotCode) {
Integer integer = this.count(new QueryWrapper<WlCarMileage>().select("1").lambda().eq(WlCarMileage::getIotCode,iotCode).isNull(WlCarMileage::getEndTime)); return this.baseMapper.getTotalTravelByIotCodeAndDate(date, iotCode);
return integer <= 0 ; }
}
private String getAddress(double longitude, double lantitude) { @Override
StringBuilder api = new StringBuilder(GUIDE_ADDRESS_URL); public Double getTotalTravelByIotCodeAndDateProd(String startDate, String endDate, String iotCode) {
api.append("key=").append(GUIDE_KEY).append("&location=").append(longitude).append(",").append(lantitude) return this.baseMapper.getTotalTravelByIotCodeAndDateProd(startDate, endDate, iotCode);
.append("&radius=1000").append("&batch=false").append("&extensions=base").append("&roadlevel=0") }
.append("&batch=false");
StringBuilder res = new StringBuilder();
BufferedReader in = null;
try {
System.out.println(api.toString());
URL url = new URL(api.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
String line;
while ((line = in.readLine()) != null) {
res.append(line).append("\n");
}
JSONObject object = JSONObject.parseObject(res.toString());
JSONObject regeocode = object.getJSONObject("regeocode");
String address = regeocode.getString("formatted_address");
if ("[]".equals(address)) {
address = "无效坐标";
}
res = new StringBuilder(address);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return res.toString();
}
@Override
public Double getTotalTravelByIotCodeAndDate(String date, String iotCode) {
return this.baseMapper.getTotalTravelByIotCodeAndDate(date,iotCode);
}
@Override /**
public Double getTotalTravelByIotCodeAndDateProd(String startDate, String endDate, String iotCode) { * @descrip 获取纠偏后数据应该展示的数据
return this.baseMapper.getTotalTravelByIotCodeAndDateProd(startDate,endDate,iotCode); * @param objects 纠偏下之前的数据
} * @param startLatitude 纠偏之后的经度
* @param startLongitude 纠偏之后的纬度
* @param index 当前纠偏数据的索引
* @return 当前数据应该展示的速度
*/
public Double getSpeedByOriginalData(JSONArray objects, Double startLatitude, Double startLongitude, Integer index) {
Double speed = 0.0;
for (int i = index; i < objects.size() - 1; i++) {
JSONObject jsonObject1 = objects.getJSONObject(index);
JSONObject jsonObject2 = objects.getJSONObject(index+1);
Double travel1 = CoordinateUtil.distance(startLatitude, startLongitude, jsonObject1.getDoubleValue("x"), jsonObject1.getDoubleValue("y"));
Double travel2 = CoordinateUtil.distance(startLatitude, startLongitude, jsonObject2.getDoubleValue("x"), jsonObject2.getDoubleValue("y"));
log.info("travel1:"+travel1+"travel2:"+travel2);
if (travel2 >= travel1) {
speed = jsonObject1.getDoubleValue("sp");
break;
}else{
speed = jsonObject2.getDoubleValue("sp");
}
}
return speed;
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment