package com.moral.service.impl; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.commons.collections.MapUtils; import org.springframework.stereotype.Service; import com.moral.entity.Device; import com.moral.entity.Point; import com.moral.entity.Sensor; import com.moral.mapper.HistoryHourlyMapper; import com.moral.mapper.SensorMapper; import com.moral.service.DeviceService; import com.moral.service.HistoryHourlyService; import com.moral.service.SensorService; import javax.annotation.Resource; @Service public class HistoryHourlyServiceImpl implements HistoryHourlyService { @Resource private HistoryHourlyMapper historyHourlyMapper; @Resource private DeviceService deviceService; @Resource private SensorService sensorService; @Resource private SensorMapper sensorMapper; @Override public Map getPollutionSourceData(Map parameters) throws Exception { List sensors = sensorMapper.getSensorsByMac(parameters); List sensorKeys = new ArrayList<>(); for (Sensor sensor : sensors) { sensorKeys.add(sensor.getSensorKey()); } parameters.put("sensorKeys", sensorKeys); Map pollutionSourceData = historyHourlyMapper.getPollutionSourceData(parameters); if (MapUtils.isNotEmpty(pollutionSourceData)) { Map sensorsMap = sensorService.getSensorsMap(parameters); String selectSensorKey = parameters.get("sensorKey").toString(); for (Map.Entry s : sensorsMap.entrySet()) { if (selectSensorKey.equals(s.getKey())) { selectSensorKey = s.getValue(); } } pollutionSourceData.put("selectSensorKey", selectSensorKey); } return pollutionSourceData; } @Override public Map getPollutionSourceDataByHour(Map parameters) throws Exception { List sensors = sensorMapper.getSensorsByMac(parameters); List sensorKeys = new ArrayList<>(); for (Sensor sensor : sensors) { sensorKeys.add(sensor.getSensorKey()); } parameters.put("sensorKeys", sensorKeys); Map pollutionSourceData = historyHourlyMapper.getPollutionSourceDataByHour(parameters); if (MapUtils.isNotEmpty(pollutionSourceData)) { Map sensorsMap = sensorService.getSensorsMap(parameters); String selectSensorKey = parameters.get("sensorKey").toString(); for (Map.Entry s : sensorsMap.entrySet()) { if (selectSensorKey.equals(s.getKey())) { selectSensorKey = s.getValue(); } } pollutionSourceData.put("selectSensorKey", selectSensorKey); } return pollutionSourceData; } @Override public Map getPollutionSourceDataAll(Map parameters) throws Exception { List sensors = sensorMapper.getSensorsByMac(parameters); List sensorKeys = new ArrayList<>(); for (Sensor sensor : sensors) { sensorKeys.add(sensor.getSensorKey()); } parameters.put("sensorKeys", sensorKeys); Map pollutionSourceData = historyHourlyMapper.getPollutionSourceDataAll(parameters); if (MapUtils.isNotEmpty(pollutionSourceData)) { Map sensorsMap = sensorService.getSensorsMap(parameters); String selectSensorKey = parameters.get("sensorKey").toString(); for (Map.Entry s : sensorsMap.entrySet()) { if (selectSensorKey.equals(s.getKey())) { selectSensorKey = s.getValue(); } } pollutionSourceData.put("selectSensorKey", selectSensorKey); } return pollutionSourceData; } @Override public String getTVOCByMac(String mac,String time,String sensor) { return historyHourlyMapper.getTVOCByMac(mac,time,sensor); } @Override public String getPressureByMac(String mac, String time) { return historyHourlyMapper.getPressureByMac(mac,time); } @Override public Map getDataByMac(String mac, String time) { return historyHourlyMapper.getDataByMac(mac,time); } @Override public List> getDataByTimeSlot(String mac, String startTime, String endTime) throws Exception { List> resultMap = historyHourlyMapper.getDataByTimeSlot(mac,startTime,endTime); return resultMap; } @Override public Point getDirPoint(Map parameters) throws Exception { Map pollutionSourceData = getPollutionSourceDataByHour(parameters); if (MapUtils.isEmpty(pollutionSourceData)) { pollutionSourceData = getPollutionSourceDataAll(parameters); } String mac = parameters.get("mac").toString(); Device device = deviceService.getDeviceByMac(mac, false); Point pointEnd = new Point(); if (MapUtils.isNotEmpty(pollutionSourceData)) { if (pollutionSourceData.get("e18") != null && pollutionSourceData.get("e23") != null) { double windSpeed = Double.valueOf(pollutionSourceData.get("e18").toString()); double winDir = Double.valueOf(pollutionSourceData.get("e23").toString()); double distance = windSpeed * 3600; double long1 = device.getLongitude(); double lat1 = device.getLatitude(); String[] result = calLocationByDistanceAndLocationAndDirection(winDir, long1, lat1, distance); pointEnd.setLng(Double.valueOf(result[0])); pointEnd.setLat(Double.valueOf(result[1])); } } return pointEnd; } /** * 根据一点的坐标与距离,以及方向,计算另外一点的位置 * * @param angle 角度,从正北顺时针方向开始计算 * @param startLong 起始点经度 * @param startLat 起始点纬度 * @param distance 距离,单位m * @return */ private String[] calLocationByDistanceAndLocationAndDirection(double angle, double startLong, double startLat, double distance) { /** 地球半径 **/ final double R = 6371e3; /** 180° **/ final DecimalFormat df = new DecimalFormat("0.000000"); String[] result = new String[2]; //将距离转换成经度的计算公式 double δ = distance / R; // 转换为radian,否则结果会不正确 angle = Math.toRadians(angle); startLong = Math.toRadians(startLong); startLat = Math.toRadians(startLat); double lat = Math.asin(Math.sin(startLat) * Math.cos(δ) + Math.cos(startLat) * Math.sin(δ) * Math.cos(angle)); double lng = startLong + Math.atan2(Math.sin(angle) * Math.sin(δ) * Math.cos(startLat), Math.cos(δ) - Math.sin(startLat) * Math.sin(lat)); // 转为正常的10进制经纬度 lng = Math.toDegrees(lng); lat = Math.toDegrees(lat); result[0] = df.format(lng); result[1] = df.format(lat); return result; } }