From 8e2ba733d9d37025d4d5ad71a8a245a90d00729f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=B0=A2=E6=AC=A3=E6=82=A6?= <2289014031@qq.com>
Date: Thu, 10 Oct 2024 21:53:27 +0800
Subject: [PATCH 1/2] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=9B=B4=E6=A0=8F?=
=?UTF-8?q?=E7=9B=91=E5=90=AC=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=88=A4=E6=96=AD?=
=?UTF-8?q?=E8=BD=A6=E8=BE=86=E6=98=AF=E5=90=A6=E9=A9=B6=E5=85=A5=E6=8C=87?=
=?UTF-8?q?=E5=AE=9A=E5=8C=BA=E5=9F=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 添加FenceGroup类,用于判断点是否在多边形围栏内
- 实现FenceListener监听器,监听车辆位置事件
- 在CarFenceGroupsResp中增加启动状态字段
- 通过新增的监听功能,判断车辆是否驶入或驶出指定区域
---
cloud-modules/cloud-modules-carData/pom.xml | 6 ++
.../muyu/carData/listener/FenceListener.java | 73 +++++++++++++++++++
.../com/muyu/carData/util/FenceGroup.java | 59 +++++++++++++++
.../muyu/domain/resp/CarFenceGroupsResp.java | 2 +-
.../server/service/CarMessageService.java | 13 ++++
5 files changed, 152 insertions(+), 1 deletion(-)
create mode 100644 cloud-modules/cloud-modules-carData/src/main/java/com/muyu/carData/listener/FenceListener.java
create mode 100644 cloud-modules/cloud-modules-carData/src/main/java/com/muyu/carData/util/FenceGroup.java
diff --git a/cloud-modules/cloud-modules-carData/pom.xml b/cloud-modules/cloud-modules-carData/pom.xml
index 5388022..87b697b 100644
--- a/cloud-modules/cloud-modules-carData/pom.xml
+++ b/cloud-modules/cloud-modules-carData/pom.xml
@@ -97,5 +97,11 @@
com.muyu
cloud-common-rabbit
+
+ com.muyu
+ cloud-modules-enterprise-common
+ 1.0.0
+ compile
+
diff --git a/cloud-modules/cloud-modules-carData/src/main/java/com/muyu/carData/listener/FenceListener.java b/cloud-modules/cloud-modules-carData/src/main/java/com/muyu/carData/listener/FenceListener.java
new file mode 100644
index 0000000..d4b0c42
--- /dev/null
+++ b/cloud-modules/cloud-modules-carData/src/main/java/com/muyu/carData/listener/FenceListener.java
@@ -0,0 +1,73 @@
+package com.muyu.carData.listener;
+
+import com.alibaba.fastjson.JSONObject;
+import com.muyu.carData.event.EsSaveEvent;
+import com.muyu.carData.event.EventListener;
+import com.muyu.carData.util.CacheUtil;
+import com.muyu.carData.util.FenceGroup;
+import com.muyu.domain.req.FenceGroupReq;
+import io.swagger.v3.oas.models.security.SecurityScheme;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import com.muyu.domain.resp.CarFenceGroupsResp;
+import java.util.List;
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+@Log4j2
+@Component
+public class FenceListener implements EventListener {
+
+ @Autowired
+ private CacheUtil cacheUtil;
+
+
+ /**
+ * 监听事件
+ * @param event
+ */
+ @Override
+ public void onEvent(EsSaveEvent event) {
+ try {
+ log.info("开始事件运行监听");
+
+ JSONObject data = event.getData();
+ String vin = (String) data.get("VIN");
+ Integer longitude = (Integer) data.get("longitude");
+ Integer latitude = (Integer) data.get("latitude");
+ HashMap map = (HashMap) cacheUtil.get(vin);
+ if (map != null) {
+ CarFenceGroupsResp fence = (CarFenceGroupsResp) map.get("fence");
+ String status = fence.getStatus(); //启动状态(1.驶入 2.驶出)
+ String fenceText = fence.getFenceText();
+ String[] split = fenceText.split(";");
+ ArrayList points = new ArrayList<>();
+ for (int i = 0; i < split.length; i++) {
+ String[] latitudeAndLongitude = split[i].split(",");
+ Integer longi = Integer.valueOf(latitudeAndLongitude[0]);
+ Integer lati = Integer.valueOf(latitudeAndLongitude[1]);
+ Point point = new Point(longi, lati);
+ points.add(point);
+ }
+ List> fences = List.of(
+ points
+ );
+ FenceGroup fenceGroup = new FenceGroup(fences);
+ Point testPoint = new Point(longitude, latitude); // 应该在第一个围栏内
+ System.out.println(fenceGroup.isPointInFenceGroup(testPoint)); // 应该输出true
+ }
+ }catch(NumberFormatException e){
+ log.error("数据格式异常,数据发送错误",e);
+ throw new RuntimeException(e);
+
+ }
+
+ }
+
+ @Override
+ public void onApplicationEvent(EsSaveEvent event) {
+ onEvent(event);
+ }
+}
diff --git a/cloud-modules/cloud-modules-carData/src/main/java/com/muyu/carData/util/FenceGroup.java b/cloud-modules/cloud-modules-carData/src/main/java/com/muyu/carData/util/FenceGroup.java
new file mode 100644
index 0000000..c310d4a
--- /dev/null
+++ b/cloud-modules/cloud-modules-carData/src/main/java/com/muyu/carData/util/FenceGroup.java
@@ -0,0 +1,59 @@
+package com.muyu.carData.util;
+
+import java.awt.*;
+import java.util.List;
+
+public class FenceGroup {
+ private List> fences;
+
+ public FenceGroup(List> fences){
+ this.fences = fences;
+ }
+
+ /**
+ * 判断点是否在围栏组内。
+ * @param point 检查的点。
+ * @return 如果点在任何围栏内返回true,否则返回false。
+ */
+ public boolean isPointInFenceGroup(Point point) {
+ for (List fence : fences) {
+ if (isPointInsidePolygon(point, fence)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * 辅助方法,判断点是否在多边形内。
+ * @param point 检查的点。
+ * @param polygon 多边形的顶点列表。
+ * @return 如果点在多边形内返回true,否则返回false。
+ */
+ private boolean isPointInsidePolygon(Point point, List polygon) {
+ int n = polygon.size();
+ boolean inside = false;
+
+ Point p1 = polygon.get(0);
+ for (int i = 1; i <= n; i++) {
+ Point p2 = polygon.get(i % n);
+ if (point.getY() > Math.min(p1.getY(), p2.getY())) {
+ if (point.getY() <= Math.max(p1.getY(), p2.getY())) {
+ if (point.getX() <= Math.max(p1.getX(), p2.getX())) {
+ if (p1.getY() != p2.getY()) {
+ double xinters = (point.getY() - p1.getY()) * (p2.getX() - p1.getX()) / (p2.getY() - p1.getY()) + p1.getX();
+ if (p1.getX() == p2.getX() || point.getX() <= xinters) {
+ inside = !inside;
+ }
+ }
+ }
+ }
+ }
+ p1 = p2;
+ }
+ return inside;
+ }
+
+
+
+}
diff --git a/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-common/src/main/java/com/muyu/domain/resp/CarFenceGroupsResp.java b/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-common/src/main/java/com/muyu/domain/resp/CarFenceGroupsResp.java
index 853c580..043d665 100644
--- a/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-common/src/main/java/com/muyu/domain/resp/CarFenceGroupsResp.java
+++ b/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-common/src/main/java/com/muyu/domain/resp/CarFenceGroupsResp.java
@@ -31,7 +31,7 @@ public class CarFenceGroupsResp {
*/
private Integer priority;
/**
- * 启动状态
+ * 启动状态(1.驶入 2.驶出)
*/
private String status;
/**
diff --git a/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-server/src/main/java/com/muyu/server/service/CarMessageService.java b/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-server/src/main/java/com/muyu/server/service/CarMessageService.java
index ea6d162..fc47bc6 100644
--- a/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-server/src/main/java/com/muyu/server/service/CarMessageService.java
+++ b/cloud-modules/cloud-modules-enterprise/cloud-modules-enterprise-server/src/main/java/com/muyu/server/service/CarMessageService.java
@@ -53,4 +53,17 @@ public interface CarMessageService extends IService {
* 获取报文最终信息
*/
JSONObject inciseCarMessage(String testString);
+
+
+
+
+
+
+
+
+
+
+
+
+
}
From e8ed8e0f6e75fdfe418b920c9ee111e9692f43a1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=B0=A2=E6=AC=A3=E6=82=A6?= <2289014031@qq.com>
Date: Thu, 10 Oct 2024 22:13:59 +0800
Subject: [PATCH 2/2] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=A2=84=E8=AD=A6?=
=?UTF-8?q?=E4=BF=A1=E6=81=AF=E7=9B=91=E5=90=AC=E5=99=A8=E5=92=8C=E7=94=B5?=
=?UTF-8?q?=E5=AD=90=E5=9B=B4=E6=A0=8F=E5=8C=BA=E5=9F=9F=E5=88=A4=E5=AE=9A?=
=?UTF-8?q?=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 添加FaultWarningListener类,实现对预警信息的监听和处理
---
.../listener/FaultWarningListener.java | 47 +++++++++++++++++++
.../muyu/carData/listener/FenceListener.java | 3 ++
2 files changed, 50 insertions(+)
create mode 100644 cloud-modules/cloud-modules-carData/src/main/java/com/muyu/carData/listener/FaultWarningListener.java
diff --git a/cloud-modules/cloud-modules-carData/src/main/java/com/muyu/carData/listener/FaultWarningListener.java b/cloud-modules/cloud-modules-carData/src/main/java/com/muyu/carData/listener/FaultWarningListener.java
new file mode 100644
index 0000000..f097ecd
--- /dev/null
+++ b/cloud-modules/cloud-modules-carData/src/main/java/com/muyu/carData/listener/FaultWarningListener.java
@@ -0,0 +1,47 @@
+package com.muyu.carData.listener;
+
+import com.alibaba.fastjson.JSONObject;
+import com.muyu.carData.event.EsSaveEvent;
+import com.muyu.carData.event.EventListener;
+import com.muyu.carData.util.CacheUtil;
+import com.muyu.domain.WarnRule;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.HashMap;
+
+/**
+ * 预警信息监听器
+ */
+@Component
+@Log4j2
+public class FaultWarningListener implements EventListener {
+
+ @Autowired
+ private CacheUtil cacheUtil;
+
+ @Override
+ public void onEvent(EsSaveEvent event) {
+ try {
+ log.info("事件开始");
+ JSONObject data = event.getData();
+ String vin = (String) data.get("VIN");
+ HashMap map = (HashMap) cacheUtil.get(vin);
+ if (map != null) {
+ WarnRule warnRule = (WarnRule) map.get("warnRule");
+ Long maxValue = warnRule.getMaxValue();
+ Long minValue = warnRule.getMinValue();
+ }
+ } catch (Exception e) {
+ log.error("事件发送错误",e);
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void onApplicationEvent(EsSaveEvent event) {
+ onEvent(event);
+ }
+}
diff --git a/cloud-modules/cloud-modules-carData/src/main/java/com/muyu/carData/listener/FenceListener.java b/cloud-modules/cloud-modules-carData/src/main/java/com/muyu/carData/listener/FenceListener.java
index d4b0c42..12bb1e1 100644
--- a/cloud-modules/cloud-modules-carData/src/main/java/com/muyu/carData/listener/FenceListener.java
+++ b/cloud-modules/cloud-modules-carData/src/main/java/com/muyu/carData/listener/FenceListener.java
@@ -16,6 +16,9 @@ import java.awt.*;
import java.util.ArrayList;
import java.util.HashMap;
+/**
+ * 电子围栏区域判定
+ */
@Log4j2
@Component
public class FenceListener implements EventListener {