Commit 12255d2c authored by caotao's avatar caotao

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

2.增加方法对于纠偏后的数据的速度进行插点处理。
parent 8df5c64f
......@@ -19,6 +19,7 @@ import com.yeejoin.equipmanage.service.ICarService;
import com.yeejoin.equipmanage.service.IWlCarMileageService;
import com.yeejoin.equipmanage.thread.ThreadCarMileageTreatment;
import org.apache.commons.lang3.ObjectUtils;
import org.checkerframework.checker.units.qual.Speed;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -60,27 +61,52 @@ import java.util.stream.Collectors;
@EnableAsync
public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlCarMileage>
implements IWlCarMileageService {
@Value("${car.max.speed:100}")
private Integer CAR_MAX_SPEED;
private static final Logger log = LoggerFactory.getLogger(HttpUtil.class);
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
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;
private static final Logger log = LoggerFactory.getLogger(HttpUtil.class);
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?";
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
public Page<WlCarMileage> page(Page<WlCarMileage> page, WlCarMileage wlCarMileage) {
......@@ -97,7 +123,7 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
double speed = 0;
WlCarMileage wlCarMileage = this.getById(id);
String iotCode = wlCarMileage.getIotCode();
String measurement = iotCode.substring(0,8);
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(),
......@@ -115,8 +141,8 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
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");
coordinate.setSpeed(jsonObject.getDoubleValue("fireCar_Speed"));
speed = speed + jsonObject.getDoubleValue("fireCar_Speed");
String time = jsonObject.getString("time");
if (time.length() > 20) {
try {
......@@ -132,9 +158,9 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
}
}
double direction = jsonObject.getDoubleValue("direction");
if (!ObjectUtils.isEmpty(direction)){
if (!ObjectUtils.isEmpty(direction)) {
coordinate.setDirection(jsonObject.getDoubleValue("direction"));
}else {
} else {
coordinate.setDirection(0);
}
coordinateList.add(coordinate);
......@@ -178,7 +204,7 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
// 角度
jsonObject.put("ag", coordinate.getDirection());
// 速度
jsonObject.put("sp", coordinate.getSpeed());
jsonObject.put("sp", coordinate.getSpeed() > 0 ? coordinate.getSpeed() : avgSpeed);
// 时间
if (count == 0) {
jsonObject.put("tm", coordinate.getTime() / 1000);
......@@ -200,22 +226,23 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
if (result != null) {
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;
}
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());
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);
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);
});
}
}
}
......@@ -257,7 +284,7 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
.ge("travel", 0.5)
.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<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) {
boolean has = false;
if (activeDateList.contains(day)) {
......@@ -268,38 +295,6 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
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
@Scheduled(cron = "${mileage.segmentation.cron}")
@Async
......@@ -315,11 +310,11 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
//销毁所有线程和所有上次坐标
//销毁所有线程
log.info("销毁所有有效线程开始");
CarIotNewListener.deviceInfo.keySet().forEach(s->{
CarIotNewListener.deviceInfo.keySet().forEach(s -> {
try {
CarIotNewListener.deviceInfo.get(s).interrupt();
}catch (Exception e){
log.info("销毁有效线程失败"+e.getMessage());
} catch (Exception e) {
log.info("销毁有效线程失败" + e.getMessage());
}
});
CarIotNewListener.deviceInfo.clear();
......@@ -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.setTakeTime(takeTime);
this.getBaseMapper().updateById(item);
log.info("-----------结束里程成功:::"+JSONObject.toJSONString(item)+"-----------------");
log.info("-----------结束里程成功:::" + JSONObject.toJSONString(item) + "-----------------");
// // 从0点开启新里程
// item.setStartName(address);
// item.setDate(date);
......@@ -425,7 +420,7 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
car.setLongitude(startLongitude);
car.setLatitude(startLatitude);
iCarService.saveOrUpdate(car);
log.info("-----------更新车辆坐标成功:::"+JSONObject.toJSONString(item)+"-----------------");
log.info("-----------更新车辆坐标成功:::" + JSONObject.toJSONString(item) + "-----------------");
}
});
log.info("轨迹切分任务执行完成..............");
......@@ -438,8 +433,8 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
@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 ;
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) {
......@@ -480,13 +475,40 @@ public class WlCarMileageServiceImpl extends ServiceImpl<WlCarMileageMapper, WlC
}
return res.toString();
}
@Override
public Double getTotalTravelByIotCodeAndDate(String date, String iotCode) {
return this.baseMapper.getTotalTravelByIotCodeAndDate(date,iotCode);
return this.baseMapper.getTotalTravelByIotCodeAndDate(date, iotCode);
}
@Override
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