From ed5ca585b1bbb1233231b29cfbd6efd99935a442 Mon Sep 17 00:00:00 2001 From: qiaoqinzheng Date: Fri, 16 Jun 2023 17:59:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=8F=B0=E7=AB=99=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E7=AE=A1=E7=90=86=E6=A0=91=E5=BD=A2=E7=BB=93=E6=9E=84?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E6=B7=B1=E6=8B=B7=E8=B4=9D=E9=9B=86?= =?UTF-8?q?=E5=90=88=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/StationOperationServiceImpl.java | 166 +++++++++++------- 1 file changed, 99 insertions(+), 67 deletions(-) diff --git a/jeecg-module-station-operation/src/main/java/org/jeecg/modules/service/impl/StationOperationServiceImpl.java b/jeecg-module-station-operation/src/main/java/org/jeecg/modules/service/impl/StationOperationServiceImpl.java index 7758dfd7..af537ba2 100644 --- a/jeecg-module-station-operation/src/main/java/org/jeecg/modules/service/impl/StationOperationServiceImpl.java +++ b/jeecg-module-station-operation/src/main/java/org/jeecg/modules/service/impl/StationOperationServiceImpl.java @@ -23,9 +23,11 @@ import org.jeecg.modules.system.entity.GardsNuclearfacility; import org.jeecg.modules.system.entity.GardsStations; import org.jeecg.modules.mapper.StationOperationMapper; import org.jeecg.modules.service.IStationOperationService; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.io.*; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; @@ -206,83 +208,113 @@ public class StationOperationServiceImpl extends ServiceImpl stationInfoMap = (HashMap) redisUtil.get("stationInfoMap"); - //查询全部核设施信息 - HashMap nuclearFacilityMap = (HashMap) redisUtil.get("nuclearFacilityMap"); - if (CollectionUtils.isNotEmpty(nuclearFacilityMap)){ - //声明一个集合存储转换经纬度后的核设施数据 - List nuclearPoints = new ArrayList<>(); - for (Map.Entry nuclearFacilityInfo:nuclearFacilityMap.entrySet()) { - GardsNuclearfacility facilityInfoValue = nuclearFacilityInfo.getValue(); - Point point = new Point(); - point.setNuclearFacilityId(String.valueOf(facilityInfoValue.getFacilityId())); - point.setNuclearFacilityName(facilityInfoValue.getFacilityName()); - if (StringUtils.isNotBlank(facilityInfoValue.getLongitude())){ - String pointValue = PointUtil.calculate(facilityInfoValue.getLongitude()); - facilityInfoValue.setLatitude(pointValue); - point.setLat(pointValue); + try { + if (CollectionUtils.isNotEmpty(stationIds)){ + //查询全部台站信息 + HashMap stationInfoMap = (HashMap) redisUtil.get("stationInfoMap"); + //查询全部核设施信息 + HashMap nuclearFacilityMap = (HashMap) redisUtil.get("nuclearFacilityMap"); + if (CollectionUtils.isNotEmpty(nuclearFacilityMap)){ + //声明一个集合存储转换经纬度后的核设施数据 + List nuclearPoints = new ArrayList<>(); + for (Map.Entry nuclearFacilityInfo:nuclearFacilityMap.entrySet()) { + GardsNuclearfacility facilityInfoValue = nuclearFacilityInfo.getValue(); + Point point = new Point(); + point.setNuclearFacilityId(String.valueOf(facilityInfoValue.getFacilityId())); + point.setNuclearFacilityName(facilityInfoValue.getFacilityName()); + if (StringUtils.isNotBlank(facilityInfoValue.getLongitude())){ + String pointValue = PointUtil.calculate(facilityInfoValue.getLongitude()); + 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())){ - String pointValue = PointUtil.calculate(facilityInfoValue.getLatitude()); - facilityInfoValue.setLongitude(pointValue); - point.setLon(pointValue); + for (String stationId:stationIds) { + GardsStations point = (GardsStations)stationInfoMap.get(stationId); + stationsList.add(point); + //声明一个数组存储对应的核设施经纬度信息 + List 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 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.setResult(map); return result; } + /** + * 通过序列化的方式对list进行深复制 + * + * @param src + * @param + * @return + * @throws IOException + * @throws ClassNotFoundException + */ + public static List deepCopy(List 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 dest = (List) in.readObject(); + return dest; + } + @Override public Result getDataReceivingStatus(List stationIds) { Result result = new Result();