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); + + + + + + + + + + + + + }