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] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=9B=B4=E6=A0=8F=E7=9B=91?=
=?UTF-8?q?=E5=90=AC=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=88=A4=E6=96=AD=E8=BD=A6?=
=?UTF-8?q?=E8=BE=86=E6=98=AF=E5=90=A6=E9=A9=B6=E5=85=A5=E6=8C=87=E5=AE=9A?=
=?UTF-8?q?=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);
+
+
+
+
+
+
+
+
+
+
+
+
+
}