查询台站运行管理树形结构,增加深拷贝集合的方法
This commit is contained in:
parent
bf6b784e78
commit
ed5ca585b1
|
@ -23,9 +23,11 @@ import org.jeecg.modules.system.entity.GardsNuclearfacility;
|
||||||
import org.jeecg.modules.system.entity.GardsStations;
|
import org.jeecg.modules.system.entity.GardsStations;
|
||||||
import org.jeecg.modules.mapper.StationOperationMapper;
|
import org.jeecg.modules.mapper.StationOperationMapper;
|
||||||
import org.jeecg.modules.service.IStationOperationService;
|
import org.jeecg.modules.service.IStationOperationService;
|
||||||
|
import org.springframework.beans.BeanUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
@ -206,83 +208,113 @@ public class StationOperationServiceImpl extends ServiceImpl<StationOperationMap
|
||||||
if (Objects.isNull(radius)) {
|
if (Objects.isNull(radius)) {
|
||||||
result.error500("请传入半径");
|
result.error500("请传入半径");
|
||||||
}
|
}
|
||||||
if (CollectionUtils.isNotEmpty(stationIds)){
|
try {
|
||||||
//查询全部台站信息
|
if (CollectionUtils.isNotEmpty(stationIds)){
|
||||||
HashMap<String, Object> stationInfoMap = (HashMap<String, Object>) redisUtil.get("stationInfoMap");
|
//查询全部台站信息
|
||||||
//查询全部核设施信息
|
HashMap<String, Object> stationInfoMap = (HashMap<String, Object>) redisUtil.get("stationInfoMap");
|
||||||
HashMap<String, GardsNuclearfacility> nuclearFacilityMap = (HashMap<String, GardsNuclearfacility>) redisUtil.get("nuclearFacilityMap");
|
//查询全部核设施信息
|
||||||
if (CollectionUtils.isNotEmpty(nuclearFacilityMap)){
|
HashMap<String, GardsNuclearfacility> nuclearFacilityMap = (HashMap<String, GardsNuclearfacility>) redisUtil.get("nuclearFacilityMap");
|
||||||
//声明一个集合存储转换经纬度后的核设施数据
|
if (CollectionUtils.isNotEmpty(nuclearFacilityMap)){
|
||||||
List<Point> nuclearPoints = new ArrayList<>();
|
//声明一个集合存储转换经纬度后的核设施数据
|
||||||
for (Map.Entry<String,GardsNuclearfacility> nuclearFacilityInfo:nuclearFacilityMap.entrySet()) {
|
List<Point> nuclearPoints = new ArrayList<>();
|
||||||
GardsNuclearfacility facilityInfoValue = nuclearFacilityInfo.getValue();
|
for (Map.Entry<String,GardsNuclearfacility> nuclearFacilityInfo:nuclearFacilityMap.entrySet()) {
|
||||||
Point point = new Point();
|
GardsNuclearfacility facilityInfoValue = nuclearFacilityInfo.getValue();
|
||||||
point.setNuclearFacilityId(String.valueOf(facilityInfoValue.getFacilityId()));
|
Point point = new Point();
|
||||||
point.setNuclearFacilityName(facilityInfoValue.getFacilityName());
|
point.setNuclearFacilityId(String.valueOf(facilityInfoValue.getFacilityId()));
|
||||||
if (StringUtils.isNotBlank(facilityInfoValue.getLongitude())){
|
point.setNuclearFacilityName(facilityInfoValue.getFacilityName());
|
||||||
String pointValue = PointUtil.calculate(facilityInfoValue.getLongitude());
|
if (StringUtils.isNotBlank(facilityInfoValue.getLongitude())){
|
||||||
facilityInfoValue.setLatitude(pointValue);
|
String pointValue = PointUtil.calculate(facilityInfoValue.getLongitude());
|
||||||
point.setLat(pointValue);
|
facilityInfoValue.setLatitude(pointValue);
|
||||||
|
point.setLat(pointValue);
|
||||||
|
}
|
||||||
|
if (StringUtils.isNotBlank(facilityInfoValue.getLatitude())){
|
||||||
|
String pointValue = PointUtil.calculate(facilityInfoValue.getLatitude());
|
||||||
|
facilityInfoValue.setLongitude(pointValue);
|
||||||
|
point.setLon(pointValue);
|
||||||
|
}
|
||||||
|
nuclearPoints.add(point);
|
||||||
}
|
}
|
||||||
if (StringUtils.isNotBlank(facilityInfoValue.getLatitude())){
|
for (String stationId:stationIds) {
|
||||||
String pointValue = PointUtil.calculate(facilityInfoValue.getLatitude());
|
GardsStations point = (GardsStations)stationInfoMap.get(stationId);
|
||||||
facilityInfoValue.setLongitude(pointValue);
|
stationsList.add(point);
|
||||||
point.setLon(pointValue);
|
//声明一个数组存储对应的核设施经纬度信息
|
||||||
|
List<Point> nuclearFacilityPoints = deepCopy(nuclearPoints);
|
||||||
|
//获取当前查询的台站名称
|
||||||
|
String stationName = point.getStationCode();
|
||||||
|
//获取当前查询的经度 即 圆心位置经度信息
|
||||||
|
Double longitudeD = point.getLon();
|
||||||
|
//获取当前查询的纬度 即 圆心位置纬度信息
|
||||||
|
Double latitudeD = point.getLat();
|
||||||
|
if (Objects.isNull(longitudeD)) {
|
||||||
|
result.error500("请传入经度");
|
||||||
|
}
|
||||||
|
if (Objects.isNull(latitudeD)) {
|
||||||
|
result.error500("请传入纬度");
|
||||||
|
}
|
||||||
|
if (!(longitudeD >= -180 && longitudeD <= 180)) {
|
||||||
|
result.error500("经度不合法");
|
||||||
|
}
|
||||||
|
if (!(latitudeD >= -85.05112878 && latitudeD <= 85.05112878)) {
|
||||||
|
result.error500("纬度不合法");
|
||||||
|
}
|
||||||
|
// 1.获取外接正方形
|
||||||
|
Rectangle rectangle = getRectangle(radius, longitudeD, latitudeD);
|
||||||
|
// 2.获取位置在正方形内的所有设备 判断核设施的经纬度是否为空 不为空 判断经纬度是否在正方形的最大最小范围内 如果在则过滤出来继续使用否则弃用
|
||||||
|
nuclearFacilityPoints = nuclearFacilityPoints.stream().filter(item-> StringUtils.isNotBlank(item.getLon()) && StringUtils.isNotBlank(item.getLat()) &&
|
||||||
|
(Double.valueOf(item.getLon())>=rectangle.getMinX() && Double.valueOf(item.getLon())<= rectangle.getMaxX())
|
||||||
|
&& (Double.valueOf(item.getLat())>=rectangle.getMinY() && Double.valueOf(item.getLat())<= rectangle.getMaxY())).collect(Collectors.toList());
|
||||||
|
//遍历在正方形范围内的数据 根据点的经纬度信息以及圆心的经纬度信息 计算出两者之间的距离 与 半径进行比较 <=半径则说明点在范围内,否则点超出半径范围
|
||||||
|
nuclearFacilityPoints = nuclearFacilityPoints.stream()
|
||||||
|
.filter(equ -> getDistance(Double.valueOf(equ.getLon()), Double.valueOf(equ.getLat()), longitudeD, latitudeD) <= radius).collect(Collectors.toList());
|
||||||
|
//在范围内的点信息 计算点与圆心间的半径距离返回信息
|
||||||
|
for (Point p:nuclearFacilityPoints) {
|
||||||
|
stationsList.add(nuclearFacilityMap.get(p.getNuclearFacilityId()));
|
||||||
|
//计算点与圆心间的距离信息
|
||||||
|
double radiusR = getDistance(Double.valueOf(p.getLon()), Double.valueOf(p.getLat()), longitudeD, latitudeD);
|
||||||
|
p.setRadius(String.valueOf(radiusR));
|
||||||
|
p.setStationName(stationName);
|
||||||
|
}
|
||||||
|
if (CollectionUtils.isNotEmpty(nuclearFacilityPoints)){
|
||||||
|
resultList.add(nuclearFacilityPoints);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
nuclearPoints.add(point);
|
map.put("GIS", stationsList.stream().distinct().collect(Collectors.toList()));
|
||||||
|
map.put("table", resultList);
|
||||||
}
|
}
|
||||||
for (String stationId:stationIds) {
|
|
||||||
GardsStations point = (GardsStations)stationInfoMap.get(stationId);
|
|
||||||
stationsList.add(point);
|
|
||||||
//声明一个数组存储对应的核设施经纬度信息
|
|
||||||
List<Point> nuclearFacilityPoints = new ArrayList<>();
|
|
||||||
nuclearFacilityPoints.addAll(nuclearPoints);
|
|
||||||
//获取当前查询的台站名称
|
|
||||||
String stationName = point.getStationCode();
|
|
||||||
//获取当前查询的经度 即 圆心位置经度信息
|
|
||||||
Double longitudeD = point.getLon();
|
|
||||||
//获取当前查询的纬度 即 圆心位置纬度信息
|
|
||||||
Double latitudeD = point.getLat();
|
|
||||||
if (Objects.isNull(longitudeD)) {
|
|
||||||
result.error500("请传入经度");
|
|
||||||
}
|
|
||||||
if (Objects.isNull(latitudeD)) {
|
|
||||||
result.error500("请传入纬度");
|
|
||||||
}
|
|
||||||
if (!(longitudeD >= -180 && longitudeD <= 180)) {
|
|
||||||
result.error500("经度不合法");
|
|
||||||
}
|
|
||||||
if (!(latitudeD >= -85.05112878 && latitudeD <= 85.05112878)) {
|
|
||||||
result.error500("纬度不合法");
|
|
||||||
}
|
|
||||||
// 1.获取外接正方形
|
|
||||||
Rectangle rectangle = getRectangle(radius, longitudeD, latitudeD);
|
|
||||||
// 2.获取位置在正方形内的所有设备 判断核设施的经纬度是否为空 不为空 判断经纬度是否在正方形的最大最小范围内 如果在则过滤出来继续使用否则弃用
|
|
||||||
nuclearFacilityPoints = nuclearFacilityPoints.stream().filter(item-> StringUtils.isNotBlank(item.getLon()) && StringUtils.isNotBlank(item.getLat()) &&
|
|
||||||
(Double.valueOf(item.getLon())>=rectangle.getMinX() && Double.valueOf(item.getLon())<= rectangle.getMaxX())
|
|
||||||
&& (Double.valueOf(item.getLat())>=rectangle.getMinY() && Double.valueOf(item.getLat())<= rectangle.getMaxY())).collect(Collectors.toList());
|
|
||||||
//遍历在正方形范围内的数据 根据点的经纬度信息以及圆心的经纬度信息 计算出两者之间的距离 与 半径进行比较 <=半径则说明点在范围内,否则点超出半径范围
|
|
||||||
nuclearFacilityPoints = nuclearFacilityPoints.stream()
|
|
||||||
.filter(equ -> getDistance(Double.valueOf(equ.getLon()), Double.valueOf(equ.getLat()), longitudeD, latitudeD) <= radius).collect(Collectors.toList());
|
|
||||||
//在范围内的点信息 计算点与圆心间的半径距离返回信息
|
|
||||||
for (Point p:nuclearFacilityPoints) {
|
|
||||||
stationsList.add(nuclearFacilityMap.get(p.getNuclearFacilityId()));
|
|
||||||
//计算点与圆心间的距离信息
|
|
||||||
double radiusR = getDistance(Double.valueOf(p.getLon()), Double.valueOf(p.getLat()), longitudeD, latitudeD);
|
|
||||||
p.setRadius(String.valueOf(radiusR));
|
|
||||||
p.setStationName(stationName);
|
|
||||||
}
|
|
||||||
resultList.add(nuclearFacilityPoints);
|
|
||||||
}
|
|
||||||
map.put("GIS", stationsList.stream().distinct().collect(Collectors.toList()));
|
|
||||||
map.put("table", resultList);
|
|
||||||
}
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
result.setSuccess(true);
|
result.setSuccess(true);
|
||||||
result.setResult(map);
|
result.setResult(map);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过序列化的方式对list进行深复制
|
||||||
|
*
|
||||||
|
* @param src
|
||||||
|
* @param <T>
|
||||||
|
* @return
|
||||||
|
* @throws IOException
|
||||||
|
* @throws ClassNotFoundException
|
||||||
|
*/
|
||||||
|
public static <T> List<T> deepCopy(List<T> src) throws IOException, ClassNotFoundException {
|
||||||
|
|
||||||
|
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
|
||||||
|
ObjectOutputStream out = new ObjectOutputStream(byteOut);
|
||||||
|
out.writeObject(src);
|
||||||
|
|
||||||
|
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
|
||||||
|
ObjectInputStream in = new ObjectInputStream(byteIn);
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
List<T> dest = (List<T>) in.readObject();
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Result getDataReceivingStatus(List<String> stationIds) {
|
public Result getDataReceivingStatus(List<String> stationIds) {
|
||||||
Result result = new Result();
|
Result result = new Result();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user