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