From e5b23b9797083fbbbbe530ce76ffa3723bc3422f Mon Sep 17 00:00:00 2001 From: ‘liusuyi’ <1951119284@qq.com> Date: 星期四, 08 六月 2023 16:12:58 +0800 Subject: [PATCH] 增加管线泄露报警点高层算法 --- /dev/null | 220 -------------------- ard-work/src/main/java/com/ruoyi/utils/tube/GeoPoint.java | 3 ard-work/src/main/resources/mapper/alarm/ArdAlarmTubeMapper.xml | 37 ++- ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/GlobalAlarmServiceImpl.java | 18 + ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/domain/ArdAlarmTube.java | 154 +------------ ard-work/src/main/java/com/ruoyi/utils/tube/MyLatLng.java | 2 ruoyi-admin/src/main/resources/application.yml | 1 ard-work/src/main/java/com/ruoyi/utils/tube/TubeTools.java | 218 +++++++++++++++++++ 8 files changed, 283 insertions(+), 370 deletions(-) diff --git a/ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/GlobalAlarmServiceImpl.java b/ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/GlobalAlarmServiceImpl.java index bf0c6cd..5b9a23f 100644 --- a/ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/GlobalAlarmServiceImpl.java +++ b/ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/GlobalAlarmServiceImpl.java @@ -11,13 +11,19 @@ import com.ruoyi.alarmpoints.tube.domain.ArdTubesDetails; import com.ruoyi.alarmpoints.tube.mapper.ArdTubesDetailsMapper; import com.ruoyi.alarmpoints.tube.mapper.ArdTubesMapper; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.uuid.UUID; +import com.ruoyi.utils.tube.GeoPoint; +import com.ruoyi.utils.tube.TubeTools; +import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; + +import static jdk.nashorn.internal.runtime.regexp.joni.Config.log; /** * @ClassName: globalAlarmServiceImpl @@ -27,6 +33,7 @@ * @Version: 1.0 **/ @Service +@Slf4j(topic = "mqtt") public class GlobalAlarmServiceImpl implements IGlobalAlarmService { @Resource ArdAlarmStealelecMapper ardAlarmStealelecMapper; @@ -67,8 +74,19 @@ ardAlarmTube.setColor(ardTubes.getColor()); ardAlarmTube.setPipeDiameter(ardTubes.getPipeDiameter()); ardAlarmTube.setTubeType(ardTubes.getType()); + GeoPoint geoPoint = TubeTools.CalculateCoordinates(ardTubesDetails, ardAlarmTube.getPosition()); + if(StringUtils.isNotNull(geoPoint)) + { + ardAlarmTube.setLongitude(geoPoint.getLongitude()); + ardAlarmTube.setLatitude(geoPoint.getLatitude()); + ardAlarmTube.setAltitude(geoPoint.getAltitude()); + } } int i = ardAlarmTubeService.insertArdAlarmTube(ardAlarmTube); + if(i>0) + { + log.info("鍏ュ簱鎴愬姛锛�"+ardAlarmTube.toString()); + } break; } } diff --git a/ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/domain/ArdAlarmTube.java b/ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/domain/ArdAlarmTube.java index 0912d84..d3a1e74 100644 --- a/ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/domain/ArdAlarmTube.java +++ b/ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/domain/ArdAlarmTube.java @@ -2,6 +2,8 @@ import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.ToString; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; @@ -13,6 +15,8 @@ * @author 鍒樿嫃涔� * @date 2023-06-06 */ +@Data +@ToString public class ArdAlarmTube extends BaseEntity { private static final long serialVersionUID = 1L; @@ -46,7 +50,19 @@ /** 浣嶇疆 */ @Excel(name = "浣嶇疆") - private String position; + private Integer position; + + /** 缁忓害 */ + @Excel(name = "缁忓害") + private Double longitude; + + /** 绾害 */ + @Excel(name = "绾害") + private Double latitude; + + /** 楂樺眰 */ + @Excel(name = "楂樺眰") + private Double altitude; /** 绫诲瀷GXALARM */ @Excel(name = "绫诲瀷GXALARM") @@ -70,141 +86,5 @@ @Excel(name = "鏌ョ湅鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date viewTime; - public void setId(String id) - { - this.id = id; - } - public String getId() - { - return id; - } - public void setHost(String host) - { - this.host = host; - } - - public String getHost() - { - return host; - } - public void setTubeId(String tubeId) - { - this.tubeId = tubeId; - } - - public String getTubeId() - { - return tubeId; - } - public void setTubeName(String tubeName) - { - this.tubeName = tubeName; - } - - public String getTubeName() - { - return tubeName; - } - public void setTubeType(String tubeType) - { - this.tubeType = tubeType; - } - - public String getTubeType() - { - return tubeType; - } - public void setPipeDiameter(String pipeDiameter) - { - this.pipeDiameter = pipeDiameter; - } - - public String getPipeDiameter() - { - return pipeDiameter; - } - public void setColor(String color) - { - this.color = color; - } - - public String getColor() - { - return color; - } - public void setPosition(String position) - { - this.position = position; - } - - public String getPosition() - { - return position; - } - public void setType(String type) - { - this.type = type; - } - - public String getType() - { - return type; - } - public void setAlarmType(String alarmType) - { - this.alarmType = alarmType; - } - - public String getAlarmType() - { - return alarmType; - } - public void setAlarmTime(Date alarmTime) - { - this.alarmTime = alarmTime; - } - - public Date getAlarmTime() - { - return alarmTime; - } - public void setWatcher(String watcher) - { - this.watcher = watcher; - } - - public String getWatcher() - { - return watcher; - } - public void setViewTime(Date viewTime) - { - this.viewTime = viewTime; - } - - public Date getViewTime() - { - return viewTime; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("id", getId()) - .append("host", getHost()) - .append("tubeId", getTubeId()) - .append("tubeName", getTubeName()) - .append("tubeType", getTubeType()) - .append("pipeDiameter", getPipeDiameter()) - .append("color", getColor()) - .append("position", getPosition()) - .append("type", getType()) - .append("alarmType", getAlarmType()) - .append("alarmTime", getAlarmTime()) - .append("watcher", getWatcher()) - .append("createTime", getCreateTime()) - .append("viewTime", getViewTime()) - .toString(); - } } diff --git a/ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/service/impl/LeakPointCalculation.java b/ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/service/impl/LeakPointCalculation.java deleted file mode 100644 index 05a6225..0000000 --- a/ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/service/impl/LeakPointCalculation.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.ruoyi.alarm.tubeAlarm.service.impl; - -import java.util.ArrayList; -import java.util.List; - -public class LeakPointCalculation { - public static void main(String[] args) { - // 鍋囪鏈変笁娈电绾� - List<Point3D> pipeline = new ArrayList<>(); - pipeline.add(new Point3D(124.925198285, 46.68693001, 147.5)); // 绗竴娈电绾跨殑璧风偣鍧愭爣 - pipeline.add(new Point3D(124.925490653, 46.687071291, 148.2)); // 绗竴娈电绾跨殑缁堢偣鍧愭爣鍜岄珮绋� - pipeline.add(new Point3D(124.926401943, 46.686812672, 143.5)); // 绗簩娈电绾跨殑缁堢偣鍧愭爣鍜岄珮绋� - pipeline.add(new Point3D(124.926981879, 46.686644854, 147.4)); // 绗笁娈电绾跨殑缁堢偣鍧愭爣鍜岄珮绋� - - double leakPointDistance = 100.0; // 娉勬紡鐐圭浉瀵逛簬绠$嚎璧风偣鐨勯暱搴� - - // 1. 纭畾娉勬紡鐐规墍鍦ㄧ殑绠$嚎娈� - Point3D startPoint = null; - Point3D endPoint = null; - double accumulatedLength = 0.0; - for (int i = 0; i < pipeline.size() - 1; i++) { - startPoint = pipeline.get(i); - endPoint = pipeline.get(i + 1); - double segmentLength = calculateDistance(startPoint, endPoint); - accumulatedLength += segmentLength; - if (accumulatedLength >= leakPointDistance) { - break; - } - } - - // 2. 璁$畻娉勬紡鐐瑰湪鎵�鍦ㄧ绾挎涓婄殑鐩稿浣嶇疆 - double relativePosition = (accumulatedLength - leakPointDistance) / calculateDistance(startPoint, endPoint); - - // 3. 璁$畻娉勬紡鐐圭殑鍧愭爣 - double x = startPoint.getX() + (endPoint.getX() - startPoint.getX()) * relativePosition; - double y = startPoint.getY() + (endPoint.getY() - startPoint.getY()) * relativePosition; - double z = startPoint.getZ() + (endPoint.getZ() - startPoint.getZ()) * relativePosition; - - Point3D leakPoint = new Point3D(x, y, z); - System.out.println("娉勬紡鐐瑰潗鏍囷細" + leakPoint); - } - - // 璁$畻涓や釜鐐逛箣闂寸殑璺濈 - private static double calculateDistance(Point3D point1, Point3D point2) { - double dx = point2.getX() - point1.getX(); - double dy = point2.getY() - point1.getY(); - double dz = point2.getZ() - point1.getZ(); - return Math.sqrt(dx * dx + dy * dy + dz * dz); - } -} \ No newline at end of file diff --git a/ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/service/impl/Point3D.java b/ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/service/impl/Point3D.java deleted file mode 100644 index 7629d0e..0000000 --- a/ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/service/impl/Point3D.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.ruoyi.alarm.tubeAlarm.service.impl; - -import lombok.AllArgsConstructor; -import lombok.Data; - -/** - * @Description: - * @ClassName: Point3D - * @Author: 鍒樿嫃涔� - * @Date: 2023骞�06鏈�07鏃�15:12 - * @Version: 1.0 - **/ -@Data -@AllArgsConstructor -public class Point3D { - private double x; - private double y; - private double z; -} diff --git a/ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/service/impl/testService.java b/ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/service/impl/testService.java deleted file mode 100644 index 7f7ff27..0000000 --- a/ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/service/impl/testService.java +++ /dev/null @@ -1,220 +0,0 @@ -package com.ruoyi.alarm.tubeAlarm.service.impl; - -import com.ruoyi.alarmpoints.tube.domain.ArdTubesDetails; -import com.ruoyi.alarmpoints.tube.mapper.ArdTubesDetailsMapper; -import com.ruoyi.device.hiksdk.util.hikSdkUtil.GisUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import javax.annotation.PostConstruct; -import javax.annotation.Resource; -import java.util.*; -import java.util.List; - - -/** - * @Description: - * @ClassName: testService - * @Author: 鍒樿嫃涔� - * @Date: 2023骞�06鏈�06鏃�15:20 - * @Version: 1.0 - **/ -@Service -@Slf4j -public class testService { - - @Resource - ArdTubesDetailsMapper ardTubesDetailsMapper; - - // 璁$畻涓や釜鐐逛箣闂寸殑璺濈 - public static double calculateDistance(double x1, double y1, double z1, double x2, double y2, double z2) { - double deltaX = x2 - x1; - double deltaY = y2 - y1; - double deltaZ = z2 - z1; - double distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ); - return distance; - } - - @PostConstruct - public void getlist() { - Integer alarmPointDistance = 100; - ArdTubesDetails atd = new ArdTubesDetails(); - atd.setReelNumber("10"); - List<ArdTubesDetails> ardTubesDetails = ardTubesDetailsMapper.selectArdTubesDetailsList(atd); - TreeMap<Integer, Double> distanceMap = new TreeMap<>(); - // 鍒涘缓鑷畾涔夌殑Comparator瀵硅薄锛屾寜鐓nflectionPointNumber瀛楁杩涜鎺掑簭 - Comparator<ArdTubesDetails> comparator = Comparator.comparingInt(person -> Integer.parseInt(person.getInflectionPointNumber())); - // 浣跨敤Collections.sort鏂规硶杩涜鎺掑簭 - Collections.sort(ardTubesDetails, comparator); - /*璧风偣鍧愭爣*/ - Double x = ardTubesDetails.get(0).getLongitude(); - Double y = ardTubesDetails.get(0).getLatitude(); - TreeMap<Integer, Object> pointMap = new TreeMap<>(); - Double tempX = x; - Double tempY = y; - Double tempD = 0.0; - for (ArdTubesDetails ardtd : ardTubesDetails) { - double distance = GisUtil.getDistance(tempX, tempY, ardtd.getLongitude(), ardtd.getLatitude()); - tempD += distance; - distanceMap.put(Integer.parseInt(ardtd.getInflectionPointNumber()), tempD); - pointMap.put(Integer.parseInt(ardtd.getInflectionPointNumber()), ardtd); - tempX = ardtd.getLongitude(); - tempY = ardtd.getLatitude(); - } - - - /*鎸夐『搴忔瘮瀵硅窛绂伙紝鎵惧埌璇ヨ窛绂诲睘浜庡摢涓嫄鐐逛箣鍚�*/ - int num = 1;//鎷愮偣搴忓彿 - Double distanceDiff = 0.0;//涓庢嫄鐐硅窛绂诲樊 - Double distanceA = 0.0; - Double distanceB = 0.0; - while (distanceB < alarmPointDistance) { - num++; - distanceA = distanceMap.get(num-1); - distanceB = distanceMap.get(num); - } - log.info("鎶ヨ鐐瑰湪鎷愮偣" + (num - 1) + "涓�" + (num) + "涔嬮棿"); - /*鑾峰彇褰撳墠鎶ヨ鐐规墍鍦ㄧ殑2涓嫄鐐圭殑鍧愭爣*/ - ArdTubesDetails point1 = (ArdTubesDetails) pointMap.get(num - 1); - double x0 = point1.getLongitude(); - double y0 = point1.getLatitude(); - double z0 = point1.getAltitude(); - ArdTubesDetails point2 = (ArdTubesDetails) pointMap.get(num); - double x1 = point2.getLongitude(); - double y1 = point2.getLatitude(); - double z1 = point2.getAltitude(); - /*璁$畻鎶ヨ鐐瑰潗鏍�*/ - double ABdistance = GisUtil.getDistance(x0, y0, x1, y1); - double Bdistance = z1 > z0 ? z1 - z0 : z0 - z1; - double angleC = Math.atan(Bdistance / ABdistance); - log.info("瀵硅竟涓庨偦杈瑰搴旇鐨勫姬搴︼細" + angleC + " 搴�"); - // 灏嗗姬搴﹁浆鎹负瑙掑害 - double angleDeg = Math.toDegrees(angleC); - log.info("瀵硅竟涓庨偦杈瑰搴旇鐨勮搴︼細" + angleDeg + " 搴�"); - - /*鎶ヨ鎵�鍦ㄧ殑2涓嫄鐐癸紝璧风偣楂樹簬缁堢*/ - if(z0>z1) - { - distanceDiff = alarmPointDistance - distanceA; - GeoPoint aPoint = new GeoPoint(x0, y0); - GeoPoint bPoint = new GeoPoint(x1, y1); - double sp = Math.sin(angleC) * distanceDiff; - log.info("姘村钩璺濈锛�" + sp + " 绫�"); - GeoPoint geoPoint = caculateRawGeoPoint(aPoint, bPoint, sp); - log.info(geoPoint.toString()); - /*璁$畻楂樺眰*/ - double ACdistance = GisUtil.getDistance(geoPoint.getLongitude(), geoPoint.getLatitude(),x1, y1); - // 姹傝В鏂滆竟鐨勯暱搴� - double hypotenuse = ACdistance * Math.tan(angleC) + z1; - log.info("C鐐归珮灞傦細" + hypotenuse + " 绫�"); - } - else - { - distanceDiff = alarmPointDistance - distanceA; - GeoPoint aPoint = new GeoPoint(x0, y0); - GeoPoint bPoint = new GeoPoint(x1, y1); - double sp = Math.sin(angleC) * distanceDiff; - log.info("姘村钩璺濈锛�" + sp + " 绫�"); - GeoPoint geoPoint = caculateRawGeoPoint(aPoint, bPoint, sp); - log.info(geoPoint.toString()); - /*璁$畻楂樺眰*/ - double ACdistance = GisUtil.getDistance(x0, y0, geoPoint.getLongitude(), geoPoint.getLatitude()); - // 姹傝В鏂滆竟鐨勯暱搴� - double hypotenuse = ACdistance * Math.tan(angleC) + z0; - log.info("C鐐归珮灞傦細" + hypotenuse + " 绫�"); - } - - } - - - //鍒ゆ柇2涓嚎娈电殑鏂滅巼 - public static void main(String[] args) { - // 鍋囪缁欏畾鐨勪笁涓潗鏍囩偣 A銆丅銆丆 - double x1 = 124.925490653; - double y1 = 46.687071291; - double x2 = 124.9255455011709; - double y2 = 46.68705572539618; - double x3 = 124.926401943; - double y3 = 46.686812672; - // 璁$畻鏂滅巼 - double slope1 = (y2 - y1) / (x2 - x1); - double slope2 = (y3 - y2) / (x3 - x2); - - // 璁剧疆鏂滅巼宸�肩殑闃堝�� - double threshold = 0.0000001; - - // 妫�鏌ユ枩鐜囨槸鍚︾浉绛� - if (Math.abs(slope1 - slope2) < threshold) { - log.info("杩欎笁涓偣鍏辩嚎"); - } else { - log.info("杩欎笁涓偣涓嶅叡绾�"); - } - } - - /** - * 宸茬煡WGS84鍧愭爣绯� A 鐐癸紝B鐐�, X 鍦ˋB 寮х嚎涓�, 涓旀槸鏈�鐭殑杩欐潯, AX璺濈宸茬煡锛屾眰X鐐瑰潗鏍�. - * - * @param aPoint - * @param bPoint - * @param distance_ax_in_meter - * @return - */ - public static GeoPoint caculateRawGeoPoint(GeoPoint aPoint, GeoPoint bPoint, double distance_ax_in_meter) { - MyLatLng a = new MyLatLng(aPoint.getLongitude(), aPoint.getLatitude()); - MyLatLng b = new MyLatLng(bPoint.getLongitude(), bPoint.getLatitude()); - double angle = getAngle(a, b); //getAngle(a,x)==getAngle(a,b) - MyLatLng x = getMyLatLng(a, distance_ax_in_meter / 1000.0, angle); - GeoPoint xPoint = new GeoPoint(x.m_Longitude, x.m_Latitude); - return xPoint; - } - public static GeoPoint caculateRawGeoPoint1(GeoPoint aPoint, GeoPoint bPoint, double distance_ax_in_meter) { - MyLatLng a = new MyLatLng(aPoint.getLongitude(), aPoint.getLatitude()); - MyLatLng b = new MyLatLng(bPoint.getLongitude(), bPoint.getLatitude()); - double angle = getAngle(a, b); - MyLatLng x = getMyLatLng(a, (360-distance_ax_in_meter) / 1000.0, angle); - GeoPoint xPoint = new GeoPoint(x.m_Longitude, x.m_Latitude); - return xPoint; - } - /** - * 姹侭鐐圭粡绾害 - * - * @param A 宸茬煡鐐圭殑缁忕含搴︼紝 - * @param distanceInKM AB涓ゅ湴鐨勮窛绂� 鍗曚綅km - * @param angle AB杩炵嚎涓庢鍖楁柟鍚戠殑澶硅锛�0~360锛� - * @return B鐐圭殑缁忕含搴� - */ - public static MyLatLng getMyLatLng(MyLatLng A, double distanceInKM, double angle) { - - double dx = distanceInKM * 1000 * Math.sin(Math.toRadians(angle)); - double dy = distanceInKM * 1000 * Math.cos(Math.toRadians(angle)); - - double bjd = (dx / A.Ed + A.m_RadLo) * 180. / Math.PI; - double bwd = (dy / A.Ec + A.m_RadLa) * 180. / Math.PI; - return new MyLatLng(bjd, bwd); - } - - /** - * 鑾峰彇AB杩炵嚎涓庢鍖楁柟鍚戠殑瑙掑害 - * - * @param A A鐐圭殑缁忕含搴� - * @param B B鐐圭殑缁忕含搴� - * @return AB杩炵嚎涓庢鍖楁柟鍚戠殑瑙掑害锛�0~360锛� - */ - public static double getAngle(MyLatLng A, MyLatLng B) { - double dx = (B.m_RadLo - A.m_RadLo) * A.Ed; - double dy = (B.m_RadLa - A.m_RadLa) * A.Ec; - double angle = 0.0; - angle = Math.atan(Math.abs(dx / dy)) * 180. / Math.PI; - double dLo = B.m_Longitude - A.m_Longitude; - double dLa = B.m_Latitude - A.m_Latitude; - if (dLo > 0 && dLa <= 0) { - angle = (90. - angle) + 90; - } else if (dLo <= 0 && dLa < 0) { - angle = angle + 180.; - } else if (dLo < 0 && dLa >= 0) { - angle = (90. - angle) + 270; - } - return angle; - } - -} diff --git a/ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/service/impl/GeoPoint.java b/ard-work/src/main/java/com/ruoyi/utils/tube/GeoPoint.java similarity index 83% rename from ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/service/impl/GeoPoint.java rename to ard-work/src/main/java/com/ruoyi/utils/tube/GeoPoint.java index 8138933..1e97f1f 100644 --- a/ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/service/impl/GeoPoint.java +++ b/ard-work/src/main/java/com/ruoyi/utils/tube/GeoPoint.java @@ -1,4 +1,4 @@ -package com.ruoyi.alarm.tubeAlarm.service.impl; +package com.ruoyi.utils.tube; import lombok.AllArgsConstructor; import lombok.Data; @@ -15,4 +15,5 @@ public class GeoPoint { Double longitude; Double latitude; + Double altitude; } diff --git a/ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/service/impl/MyLatLng.java b/ard-work/src/main/java/com/ruoyi/utils/tube/MyLatLng.java similarity index 95% rename from ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/service/impl/MyLatLng.java rename to ard-work/src/main/java/com/ruoyi/utils/tube/MyLatLng.java index 549d7b9..d905512 100644 --- a/ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/service/impl/MyLatLng.java +++ b/ard-work/src/main/java/com/ruoyi/utils/tube/MyLatLng.java @@ -1,4 +1,4 @@ -package com.ruoyi.alarm.tubeAlarm.service.impl; +package com.ruoyi.utils.tube; import lombok.Data; diff --git a/ard-work/src/main/java/com/ruoyi/utils/tube/TubeTools.java b/ard-work/src/main/java/com/ruoyi/utils/tube/TubeTools.java new file mode 100644 index 0000000..24f018f --- /dev/null +++ b/ard-work/src/main/java/com/ruoyi/utils/tube/TubeTools.java @@ -0,0 +1,218 @@ +package com.ruoyi.utils.tube; + +import com.ruoyi.alarmpoints.tube.domain.ArdTubesDetails; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.TreeMap; + +/** + * @ClassName TubeTools + * @Description: 绠$嚎璁$畻宸ュ叿 + * @Author 鍒樿嫃涔� + * @Date 2023/6/6 19:29 + * @Version 1.0 + */ +@Service +@Slf4j +public class TubeTools { + public static void main(String[] args) { + // 鍋囪缁欏畾鐨勪笁涓潗鏍囩偣 A銆丅銆丆 + double x1 = 124.939903268; + double y1 = 46.684520056; + double x2 = 124.94049634327537; + double y2 = 46.68442539350505; + double x3 = 124.940552075; + double y3 = 46.684416498; + + double distance = getDistance(x1, y1, x3, y3); + log.debug("鎬昏窛绂�:" + distance); + double distance1 = getDistance(x1, y1, x2, y2); + log.debug("璺濈璧风偣璺濈:" + distance1); + double distance2 = getDistance(x2, y2, x3, y3); + log.debug("璺濈缁堢偣璺濈:" + distance2); + // 璁$畻鏂滅巼 + double slope1 = (y2 - y1) / (x2 - x1); + double slope2 = (y3 - y2) / (x3 - x2); + + // 璁剧疆鏂滅巼宸�肩殑闃堝�� + double threshold = 0.000001; + + // 妫�鏌ユ枩鐜囨槸鍚︾浉绛� + if (Math.abs(slope1 - slope2) < threshold) { + log.debug("杩欎笁涓偣鍏辩嚎"); + } else { + log.debug("杩欎笁涓偣涓嶅叡绾�"); + } + } + + /** + * @鎻忚堪 璁$畻鍧愭爣 + * @鍙傛暟 [ardTubesDetails, alarmPointDistance] + * @杩斿洖鍊� void + * @鍒涘缓浜� 鍒樿嫃涔� + * @鍒涘缓鏃堕棿 2023/6/8 14:38 + * @淇敼浜哄拰鍏跺畠淇℃伅 + */ + public static GeoPoint CalculateCoordinates(List<ArdTubesDetails> ardTubesDetails, Integer alarmPointDistance) { + + try { + Comparator<ArdTubesDetails> comparator = Comparator.comparingInt(person -> Integer.parseInt(person.getInflectionPointNumber())); // 浣跨敤Collections.sort鏂规硶杩涜鎺掑簭 + Collections.sort(ardTubesDetails, comparator); + double x = ardTubesDetails.get(0).getLongitude(); + double y = ardTubesDetails.get(0).getLatitude(); + TreeMap<Integer, Double> distanceMap = new TreeMap<>(); + TreeMap<Integer, Object> tubeMap = new TreeMap<>(); + double distance = 0.0; + for (ArdTubesDetails atd : ardTubesDetails) { + distance += getDistance(x, y, atd.getLongitude(), atd.getLatitude()); + distanceMap.put(Integer.parseInt(atd.getInflectionPointNumber()), distance); + tubeMap.put(Integer.parseInt(atd.getInflectionPointNumber()), atd); + x = atd.getLongitude(); + y = atd.getLatitude(); + } + Integer num = 0; + double tempDistance = 0.0; + while (tempDistance < alarmPointDistance) { + num++; + tempDistance = distanceMap.get(num); + } + log.debug("鎶ヨ鐐瑰湪鎷愮偣" + (num - 1) + "-" + num + "涔嬮棿,鎬昏窛绂�" + (tempDistance - distanceMap.get(num - 1))); + ArdTubesDetails point1 = (ArdTubesDetails) tubeMap.get(num - 1); + double x0 = point1.getLongitude(); + double y0 = point1.getLatitude(); + double z0 = point1.getAltitude(); + ArdTubesDetails point2 = (ArdTubesDetails) tubeMap.get(num); + double x1 = point2.getLongitude(); + double y1 = point2.getLatitude(); + double z1 = point2.getAltitude(); + /*璁$畻鎶ヨ鐐瑰潗鏍�*/ + double d = alarmPointDistance - distanceMap.get(num - 1); + GeoPoint aPoint = new GeoPoint(x0, y0, z0); + GeoPoint bPoint = new GeoPoint(x1, y1, z1); + GeoPoint geoPoint = caculateRawGeoPoint(aPoint, bPoint, d); + double height = interpolateHeight(aPoint, bPoint, geoPoint); + geoPoint.setAltitude(height); + log.debug("璁$畻缁撴灉:" + geoPoint); + return geoPoint; + } + catch (Exception ex) + { + log.error("绠$嚎鎶ヨ鐐瑰潗鏍囪绠楀紓甯�:"+ex.getMessage()); + return null; + } + + } + + // 绾挎�ф彃鍊艰绠椾换鎰忕偣鐨勯珮搴� + private static double interpolateHeight(GeoPoint startPoint, GeoPoint endPoint, GeoPoint alarmPoint) { + double startX = startPoint.getLongitude(); + double startY = startPoint.getLatitude(); + double startZ = startPoint.getAltitude(); + double endX = endPoint.getLongitude(); + double endY = endPoint.getLatitude(); + double endZ = endPoint.getAltitude(); + // 鐩爣鐐圭殑鍧愭爣 + double targetX = alarmPoint.getLongitude(); + double targetY = alarmPoint.getLatitude(); + double distance = Math.sqrt(Math.pow(endX - startX, 2) + Math.pow(endY - startY, 2)); + double targetDistance = Math.sqrt(Math.pow(targetX - startX, 2) + Math.pow(targetY - startY, 2)); + double t = targetDistance / distance; + double targetHeight = startZ + t * (endZ - startZ); + return targetHeight; + } + + /** + * 宸茬煡WGS84鍧愭爣绯� A 鐐癸紝B鐐�, X 鍦ˋB 寮х嚎涓�, 涓旀槸鏈�鐭殑杩欐潯, AX璺濈宸茬煡锛屾眰X鐐瑰潗鏍�. + * + * @param aPoint + * @param bPoint + * @param distance_ax_in_meter + * @return + */ + private static GeoPoint caculateRawGeoPoint(GeoPoint aPoint, GeoPoint bPoint, double distance_ax_in_meter) { + MyLatLng a = new MyLatLng(aPoint.getLongitude(), aPoint.getLatitude()); + MyLatLng b = new MyLatLng(bPoint.getLongitude(), bPoint.getLatitude()); + double angle = getAngle(a, b); + //double angle = GisUtil.getNorthAngle(a.getM_Longitude(),a.getM_Latitude(), b.getM_Longitude(),b.getM_Latitude()); + MyLatLng x = getMyLatLng(a, distance_ax_in_meter / 1000.0, angle); + GeoPoint xPoint = new GeoPoint(x.m_Longitude, x.m_Latitude, 0.0); + return xPoint; + } + + /** + * 姹侭鐐圭粡绾害 + * + * @param A 宸茬煡鐐圭殑缁忕含搴︼紝 + * @param distanceInKM AB涓ゅ湴鐨勮窛绂� 鍗曚綅km + * @param angle AB杩炵嚎涓庢鍖楁柟鍚戠殑澶硅锛�0~360锛� + * @return B鐐圭殑缁忕含搴� + */ + private static MyLatLng getMyLatLng(MyLatLng A, double distanceInKM, double angle) { + + double dx = distanceInKM * 1000 * Math.sin(Math.toRadians(angle)); + double dy = distanceInKM * 1000 * Math.cos(Math.toRadians(angle)); + + double bjd = (dx / A.Ed + A.m_RadLo) * 180. / Math.PI; + double bwd = (dy / A.Ec + A.m_RadLa) * 180. / Math.PI; + return new MyLatLng(bjd, bwd); + } + + /** + * 鑾峰彇AB杩炵嚎涓庢鍖楁柟鍚戠殑瑙掑害 + * + * @param A A鐐圭殑缁忕含搴� + * @param B B鐐圭殑缁忕含搴� + * @return AB杩炵嚎涓庢鍖楁柟鍚戠殑瑙掑害锛�0~360锛� + */ + private static double getAngle(MyLatLng A, MyLatLng B) { + double dx = (B.m_RadLo - A.m_RadLo) * A.Ed; + double dy = (B.m_RadLa - A.m_RadLa) * A.Ec; + double angle = 0.0; + angle = Math.atan(Math.abs(dx / dy)) * 180. / Math.PI; + double dLo = B.m_Longitude - A.m_Longitude; + double dLa = B.m_Latitude - A.m_Latitude; + if (dLo > 0 && dLa <= 0) { + angle = (90. - angle) + 90; + } else if (dLo <= 0 && dLa < 0) { + angle = angle + 180.; + } else if (dLo < 0 && dLa >= 0) { + angle = (90. - angle) + 270; + } + return angle; + } + + private static final double EARTH_RADIUS = 6378.137; // 6378.137涓哄湴鐞冨崐寰�(鍗曚綅:鍗冪背) + + /** + * 鏍规嵁缁忕含搴︼紝璁$畻涓ょ偣闂寸殑璺濈 + * + * @param longitude1 绗竴涓偣鐨勭粡搴� + * @param latitude1 绗竴涓偣鐨勭含搴� + * @param longitude2 绗簩涓偣鐨勭粡搴� + * @param latitude2 绗簩涓偣鐨勭含搴� + * @return 杩斿洖璺濈 鍗曚綅鍗冪背 + */ + private static double getDistance(double longitude1, double latitude1, double longitude2, double latitude2) { + // 绾害 + double lat1 = Math.toRadians(latitude1); + double lat2 = Math.toRadians(latitude2); + // 缁忓害 + double lng1 = Math.toRadians(longitude1); + double lng2 = Math.toRadians(longitude2); + // 绾害涔嬪樊 + double a = lat1 - lat2; + // 缁忓害涔嬪樊 + double b = lng1 - lng2; + // 璁$畻涓ょ偣璺濈鐨勫叕寮� + double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(b / 2), 2))); + // 寮ч暱涔樺湴鐞冨崐寰�, 杩斿洖鍗曚綅: 鍗冪背 + s = s * EARTH_RADIUS; + //System.out.println("璺濈"+s); + return s * 1000; + } + +} diff --git a/ard-work/src/main/resources/mapper/alarm/ArdAlarmTubeMapper.xml b/ard-work/src/main/resources/mapper/alarm/ArdAlarmTubeMapper.xml index 14e49fe..07e5183 100644 --- a/ard-work/src/main/resources/mapper/alarm/ArdAlarmTubeMapper.xml +++ b/ard-work/src/main/resources/mapper/alarm/ArdAlarmTubeMapper.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper -PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" -"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.alarm.tubeAlarm.mapper.ArdAlarmTubeMapper"> - + <resultMap type="ArdAlarmTube" id="ArdAlarmTubeResult"> <result property="id" column="id" /> <result property="host" column="host" /> @@ -18,18 +18,21 @@ <result property="alarmTime" column="alarm_time" /> <result property="watcher" column="watcher" /> <result property="createTime" column="create_time" /> + <result property="longitude" column="longitude" /> + <result property="latitude" column="latitude" /> + <result property="altitude" column="altitude" /> <result property="viewTime" column="view_time" /> </resultMap> <sql id="selectArdAlarmTubeVo"> - select id, host, tube_id, tube_name, tube_type, pipe_diameter, color, position, type, alarm_type, alarm_time, watcher, create_time, view_time from ard_alarm_tube + select id, host, tube_id, tube_name, tube_type, pipe_diameter, color, position, type, alarm_type, alarm_time, watcher, create_time, longitude, latitude, altitude, view_time from ard_alarm_tube </sql> <select id="selectArdAlarmTubeList" parameterType="ArdAlarmTube" resultMap="ArdAlarmTubeResult"> <include refid="selectArdAlarmTubeVo"/> - <where> + <where> <if test="host != null and host != ''"> and host = #{host}</if> - <if test="tubeId != null "> and tube_id = #{tubeId}</if> + <if test="tubeId != null and tubeId != ''"> and tube_id = #{tubeId}</if> <if test="tubeName != null and tubeName != ''"> and tube_name like '%'||#{tubeName}||'%'</if> <if test="tubeType != null and tubeType != ''"> and tube_type = #{tubeType}</if> <if test="pipeDiameter != null and pipeDiameter != ''"> and pipe_diameter = #{pipeDiameter}</if> @@ -39,15 +42,18 @@ <if test="alarmType != null and alarmType != ''"> and alarm_type = #{alarmType}</if> <if test="alarmTime != null "> and alarm_time = #{alarmTime}</if> <if test="watcher != null and watcher != ''"> and watcher = #{watcher}</if> + <if test="longitude != null and longitude != ''"> and longitude = #{longitude}</if> + <if test="latitude != null and latitude != ''"> and latitude = #{latitude}</if> + <if test="altitude != null and altitude != ''"> and altitude = #{altitude}</if> <if test="viewTime != null "> and view_time = #{viewTime}</if> </where> </select> - + <select id="selectArdAlarmTubeById" parameterType="String" resultMap="ArdAlarmTubeResult"> <include refid="selectArdAlarmTubeVo"/> where id = #{id} </select> - + <insert id="insertArdAlarmTube" parameterType="ArdAlarmTube"> insert into ard_alarm_tube <trim prefix="(" suffix=")" suffixOverrides=","> @@ -64,8 +70,11 @@ <if test="alarmTime != null">alarm_time,</if> <if test="watcher != null">watcher,</if> <if test="createTime != null">create_time,</if> + <if test="longitude != null">longitude,</if> + <if test="latitude != null">latitude,</if> + <if test="altitude != null">altitude,</if> <if test="viewTime != null">view_time,</if> - </trim> + </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="id != null">#{id},</if> <if test="host != null">#{host},</if> @@ -80,8 +89,11 @@ <if test="alarmTime != null">#{alarmTime},</if> <if test="watcher != null">#{watcher},</if> <if test="createTime != null">#{createTime},</if> + <if test="longitude != null">#{longitude},</if> + <if test="latitude != null">#{latitude},</if> + <if test="altitude != null">#{altitude},</if> <if test="viewTime != null">#{viewTime},</if> - </trim> + </trim> </insert> <update id="updateArdAlarmTube" parameterType="ArdAlarmTube"> @@ -99,6 +111,9 @@ <if test="alarmTime != null">alarm_time = #{alarmTime},</if> <if test="watcher != null">watcher = #{watcher},</if> <if test="createTime != null">create_time = #{createTime},</if> + <if test="longitude != null">longitude = #{longitude},</if> + <if test="latitude != null">latitude = #{latitude},</if> + <if test="altitude != null">altitude = #{altitude},</if> <if test="viewTime != null">view_time = #{viewTime},</if> </trim> where id = #{id} @@ -109,7 +124,7 @@ </delete> <delete id="deleteArdAlarmTubeByIds" parameterType="String"> - delete from ard_alarm_tube where id in + delete from ard_alarm_tube where id in <foreach item="id" collection="array" open="(" separator="," close=")"> #{id} </foreach> diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index b069583..b54f333 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -36,6 +36,7 @@ # 鏃ュ織閰嶇疆 logging: level: + com.ruoyi.utils.tube: debug com.ruoyi.inspect: info org.springframework: warn -- Gitblit v1.9.3