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;
...@@ -60,27 +61,52 @@ import java.util.stream.Collectors; ...@@ -60,27 +61,52 @@ import java.util.stream.Collectors;
@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";
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?";
@Autowired @Autowired
IotFeign iotFeign; IotFeign iotFeign;
@Autowired @Autowired
ICarService iCarService; ICarService iCarService;
@Value("${car.max.speed:100}")
private Integer CAR_MAX_SPEED;
@Value("${mileage.parameter}") @Value("${mileage.parameter}")
private Double mileageParameter; private Double mileageParameter;
@Resource @Resource
private EmqKeeper emqKeeper; private EmqKeeper emqKeeper;
private static final Logger log = LoggerFactory.getLogger(HttpUtil.class); public static List<String> getDayByMonth(Date date) {
List<String> data = new ArrayList<>();
private final String GUIDE_KEY = "813684495d9a3981dd2c7694916fe404"; try {
Calendar c = Calendar.getInstance();
private final String GUIDE_URL = "https://restapi.amap.com/v4/grasproad/driving?"; c.setTime(date);
// 获取当前的年份
private final String GUIDE_ADDRESS_URL = "https://restapi.amap.com/v3/geocode/regeo?"; 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
public Page<WlCarMileage> page(Page<WlCarMileage> page, WlCarMileage wlCarMileage) { public Page<WlCarMileage> page(Page<WlCarMileage> page, WlCarMileage wlCarMileage) {
...@@ -97,7 +123,7 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC ...@@ -97,7 +123,7 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
double speed = 0; double speed = 0;
WlCarMileage wlCarMileage = this.getById(id); WlCarMileage wlCarMileage = this.getById(id);
String iotCode = wlCarMileage.getIotCode(); String iotCode = wlCarMileage.getIotCode();
String measurement = iotCode.substring(0,8); String measurement = iotCode.substring(0, 8);
String deviceName = iotCode.replace(measurement, ""); String deviceName = iotCode.replace(measurement, "");
// 由于iot存在毫秒故结束时间要+1秒 iot+1秒有bug还是查不到 +2秒 // 由于iot存在毫秒故结束时间要+1秒 iot+1秒有bug还是查不到 +2秒
ResponseModel<List<Object>> result = iotFeign.getLiveData(measurement, deviceName, wlCarMileage.getStartTime(), ResponseModel<List<Object>> result = iotFeign.getLiveData(measurement, deviceName, wlCarMileage.getStartTime(),
...@@ -115,8 +141,8 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC ...@@ -115,8 +141,8 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
lnglat.add(jsonObject.getDoubleValue("FireCar_Longitude")); lnglat.add(jsonObject.getDoubleValue("FireCar_Longitude"));
lnglat.add(jsonObject.getDoubleValue("FireCar_Latitude")); lnglat.add(jsonObject.getDoubleValue("FireCar_Latitude"));
coordinate.setLnglat(lnglat); coordinate.setLnglat(lnglat);
coordinate.setSpeed(jsonObject.getDoubleValue("FireCar_Speed")); coordinate.setSpeed(jsonObject.getDoubleValue("fireCar_Speed"));
speed = speed + jsonObject.getDoubleValue("FireCar_Speed"); speed = speed + jsonObject.getDoubleValue("fireCar_Speed");
String time = jsonObject.getString("time"); String time = jsonObject.getString("time");
if (time.length() > 20) { if (time.length() > 20) {
try { try {
...@@ -132,9 +158,9 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC ...@@ -132,9 +158,9 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
} }
} }
double direction = jsonObject.getDoubleValue("direction"); double direction = jsonObject.getDoubleValue("direction");
if (!ObjectUtils.isEmpty(direction)){ if (!ObjectUtils.isEmpty(direction)) {
coordinate.setDirection(jsonObject.getDoubleValue("direction")); coordinate.setDirection(jsonObject.getDoubleValue("direction"));
}else { } else {
coordinate.setDirection(0); coordinate.setDirection(0);
} }
coordinateList.add(coordinate); coordinateList.add(coordinate);
...@@ -178,7 +204,7 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC ...@@ -178,7 +204,7 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
// 角度 // 角度
jsonObject.put("ag", coordinate.getDirection()); jsonObject.put("ag", coordinate.getDirection());
// 速度 // 速度
jsonObject.put("sp", coordinate.getSpeed()); jsonObject.put("sp", coordinate.getSpeed() > 0 ? coordinate.getSpeed() : avgSpeed);
// 时间 // 时间
if (count == 0) { if (count == 0) {
jsonObject.put("tm", coordinate.getTime() / 1000); jsonObject.put("tm", coordinate.getTime() / 1000);
...@@ -200,22 +226,23 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC ...@@ -200,22 +226,23 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
if (result != null) { if (result != null) {
Map<String, Object> jsonObject = (Map<String, Object>) JSONObject.parseObject(result); Map<String, Object> jsonObject = (Map<String, Object>) JSONObject.parseObject(result);
//判断是否坐标不满足高德地图纠偏需求 //判断是否坐标不满足高德地图纠偏需求
if(jsonObject.containsKey("errcode")&&jsonObject.get("errcode").toString().equals("30001")){ if (jsonObject.containsKey("errcode") && jsonObject.get("errcode").toString().equals("30001")) {
return list; return list;
} }
if (jsonObject.containsKey("data")) { if (jsonObject.containsKey("data")) {
JSONObject data3 = JSONObject.parseObject(jsonObject.get("data").toString()); JSONObject data3 = JSONObject.parseObject(jsonObject.get("data").toString());
JSONArray points1 = JSONArray.parseArray(data3.get("points").toString()); JSONArray points1 = JSONArray.parseArray(data3.get("points").toString());
points1.forEach(item -> { for (int i = 0; i < points1.size(); i++) {
JSONObject jsonObject1 = JSONObject.parseObject(item.toString()); JSONObject jsonObject1 = JSONObject.parseObject(points1.get(i).toString());
List<Double> doubles = new ArrayList<>(); List<Double> doubles = new ArrayList<>();
Coordinate coordinate = new Coordinate(); Coordinate coordinate = new Coordinate();
doubles.add(Double.valueOf(jsonObject1.get("x").toString())); doubles.add(Double.valueOf(jsonObject1.get("x").toString()));
doubles.add(Double.valueOf(jsonObject1.get("y").toString())); doubles.add(Double.valueOf(jsonObject1.get("y").toString()));
coordinate.setLnglat(doubles); coordinate.setLnglat(doubles);
coordinate.setSpeed(avgSpeed); Double speeed = getSpeedByOriginalData(objects, Double.valueOf(jsonObject1.get("x").toString()), Double.valueOf(jsonObject1.get("y").toString()), i );
coordinate.setSpeed(speeed);
coordinates.add(coordinate); coordinates.add(coordinate);
}); }
} }
} }
...@@ -257,7 +284,7 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC ...@@ -257,7 +284,7 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
.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)) {
...@@ -268,38 +295,6 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC ...@@ -268,38 +295,6 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
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
...@@ -315,11 +310,11 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC ...@@ -315,11 +310,11 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
//销毁所有线程和所有上次坐标 //销毁所有线程和所有上次坐标
//销毁所有线程 //销毁所有线程
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();
...@@ -392,7 +387,7 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC ...@@ -392,7 +387,7 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
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);
...@@ -425,7 +420,7 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC ...@@ -425,7 +420,7 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
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("轨迹切分任务执行完成..............");
...@@ -438,8 +433,8 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC ...@@ -438,8 +433,8 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
@Override @Override
public Boolean getUncompleteMileagByIotCode(String iotCode) { public Boolean getUncompleteMileagByIotCode(String iotCode) {
Integer integer = this.count(new QueryWrapper<WlCarMileage>().select("1").lambda().eq(WlCarMileage::getIotCode,iotCode).isNull(WlCarMileage::getEndTime)); Integer integer = this.count(new QueryWrapper<WlCarMileage>().select("1").lambda().eq(WlCarMileage::getIotCode, iotCode).isNull(WlCarMileage::getEndTime));
return integer <= 0 ; return integer <= 0;
} }
private String getAddress(double longitude, double lantitude) { private String getAddress(double longitude, double lantitude) {
...@@ -480,13 +475,40 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC ...@@ -480,13 +475,40 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
} }
return res.toString(); return res.toString();
} }
@Override @Override
public Double getTotalTravelByIotCodeAndDate(String date, String iotCode) { public Double getTotalTravelByIotCodeAndDate(String date, String iotCode) {
return this.baseMapper.getTotalTravelByIotCodeAndDate(date,iotCode); return this.baseMapper.getTotalTravelByIotCodeAndDate(date, iotCode);
} }
@Override @Override
public Double getTotalTravelByIotCodeAndDateProd(String startDate, String endDate, String iotCode) { public Double getTotalTravelByIotCodeAndDateProd(String startDate, String endDate, String iotCode) {
return this.baseMapper.getTotalTravelByIotCodeAndDateProd(startDate,endDate,iotCode); return this.baseMapper.getTotalTravelByIotCodeAndDateProd(startDate, endDate, iotCode);
}
/**
* @descrip 获取纠偏后数据应该展示的数据
* @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