Java实现电子围栏的小例子

主要需求是实现一个电子围栏判断的小例子其中包括前端和后端的demo代码
引入对应的依赖库

<!--jts库通常用于几何计算和表示地理空间数据-->
<dependency><groupId>org.locationtech.jts</groupId><artifactId>jts-core</artifactId><version>1.18.0</version>
</dependency>
public class GeoFenceUtils {/** geometryFactory */private static final GeometryFactory geometryFactory = new GeometryFactory();/*** 判断指定的GPS点是否在电子围栏内** @param fencePointsList 包含电子围栏的经纬度数据的列表,格式为 "经度,纬度"* @param pointStr        指定的GPS点,格式为 "经度,纬度"* @return 如果在电子围栏内则返回true,否则返回false*/public static boolean isPointInGeoFence(List<String> fencePointsList, String pointStr) {// 将电子围栏的经纬度数据转换为坐标数组Coordinate[] fencePoints = parseCoordinates(fencePointsList);// 将指定的GPS点转换为坐标Coordinate targetPoint = parseCoordinate(pointStr);// 创建电子围栏多边形Polygon geoFencePolygon = createPolygon(fencePoints);// 创建指定的GPS点Point point = geometryFactory.createPoint(targetPoint);// 检查指定的GPS点是否在电子围栏内return geoFencePolygon.contains(point);}/*** 判断指定的GPS点是否在电子围栏内** @param geoFencePolygon geo fence polygon* @param pointStr        指定的GPS点,格式为 "经度,纬度"* @return 如果在电子围栏内则返回true ,否则返回false* @since 2.0.0*/public static boolean isPointInGeoFence(Polygon geoFencePolygon, String pointStr) {// 将指定的GPS点转换为坐标Coordinate testPoint = parseCoordinate(pointStr);// 创建指定的GPS点Point point = geometryFactory.createPoint(testPoint);// 检查指定的GPS点是否在电子围栏内return geoFencePolygon.contains(point);}/*** 判断指定的GPS点是否在电子围栏内** @param fencePointsList 包含电子围栏的经纬度数据的列表,格式为 "经度,纬度"* @return 如果在电子围栏内则返回true,否则返回false*/public static Polygon getPointInGeoFence(List<String> fencePointsList) {// 将电子围栏的经纬度数据转换为坐标数组Coordinate[] fencePoints = parseCoordinates(fencePointsList);// 创建电子围栏return createPolygon(fencePoints);}/*** 根据GPS点集合创建多边形** @param coordinates GPS点集合* @return 多边形对象*/private static Polygon createPolygon(Coordinate[] coordinates) {// Ensure the polygon is closed by adding the first coordinate at the end if necessaryif (!coordinates[0].equals(coordinates[coordinates.length - 1])) {Coordinate[] closedCoordinates = new Coordinate[coordinates.length + 1];System.arraycopy(coordinates, 0, closedCoordinates, 0, coordinates.length);closedCoordinates[closedCoordinates.length - 1] = coordinates[0];coordinates = closedCoordinates;}return geometryFactory.createPolygon(coordinates);}/*** 将包含经纬度数据的列表转换为坐标数组** @param pointsList 包含经纬度数据的列表* @return 坐标数组*/private static Coordinate[] parseCoordinates(List<String> pointsList) {Coordinate[] coordinates = new Coordinate[pointsList.size()];for (int i = 0; i < pointsList.size(); i++) {coordinates[i] = parseCoordinate(pointsList.get(i));}return coordinates;}/*** 将经纬度数据字符串转换为坐标** @param pointStr 经纬度数据字符串,格式为 "经度,纬度"* @return 坐标*/private static Coordinate parseCoordinate(String pointStr) {String[] parts = pointStr.split(StringPool.COMMA);double lon = Double.parseDouble(parts[0]);double lat = Double.parseDouble(parts[1]);return new Coordinate(lon, lat);}}

单元测试类

public class GeoFenceUtilTest {/*** Test geo** @since 2.0.0*/@Testpublic void testGeo() {// 示例电子围栏点集合List<String> fencePointsList = List.of("116.403322,39.920255","116.429043,39.913906","116.438447,39.882655","116.419252,39.873514","116.406656,39.881143","116.389347,39.884167","116.389846,39.891365","116.377436,39.908228","116.410512,39.901984");// 指定的GPS点String testPointStr = "116.384112,39.899172";// 检查指定的GPS点是否在电子围栏内boolean isWithinFence = GeoFenceUtils.isPointInGeoFence(fencePointsList, testPointStr);System.out.println("指定的GPS点是否在电子围栏内: " + isWithinFence);}}

前端的测试demo,高德开放平台JS API测试平台,找到多边形编辑器,将下面的代码粘贴到执行器里面,然后点击右上角的执行代码,就可以获取到对应范围的点位地址

在这里插入图片描述

<!doctype html>
<html>
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width"><style>html,body,#container {width: 100%;height: 100%;}</style><title>多边形的绘制和编辑</title><link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" /><script src="https://webapi.amap.com/maps?v=2.0&key=您申请的key值&plugin=AMap.PolygonEditor"></script><script src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script>
</head>
<body>
<div id="container"></div>
<div class="input-card" style="width: 120px"><button class="btn" onclick="polyEditor.open()" style="margin-bottom: 5px">开始编辑</button> <button class="btn" onclick="polyEditor.close()">结束编辑</button> 
</div>
<script type="text/javascript">var map = new AMap.Map("container", {center: [116.400274, 39.905812],zoom: 14,viewMode: '3D',});var path = [[116.403322, 39.920255],[116.410703, 39.897555],[116.402292, 39.892353],[116.389846, 39.891365]]var path1 = [[116.453322, 39.920255],[116.460703, 39.897555],[116.452292, 39.892353],[116.439846, 39.891365]]var polygon = new AMap.Polygon({path: path,strokeColor: "#FF33FF",strokeWeight: 6,strokeOpacity: 0.2,fillOpacity: 0.4,fillColor: '#1791fc',zIndex: 50,bubble: true,})var polygon1 = new AMap.Polygon({path: path1,strokeColor: "green",strokeWeight: 6,strokeOpacity: 0.2,fillOpacity: 0.4,fillColor: '#1791fc',zIndex: 50,bubble: true,})map.add([polygon, polygon1])// 缩放地图到合适的视野级别map.setFitView()var polyEditor;// var polyEditor = new AMap.PolyEditor(map, polygon)// polyEditor = new AMap.PolygonEditor(map)polyEditor = new AMap.PolygonEditor(map, polygon);polyEditor.addAdsorbPolygons(polygon1)polyEditor.open();polyEditor.on("addnode", (event) => {let path = event.target.getPath();console.log('addnode');console.log(path);});polyEditor.on("adjust", (event) => {let path = event.target.getPath();console.log('adjust');console.log(path);});polyEditor.on("removenode", (event) => {let path = event.target.getPath();console.log('removenode');console.log(path);});polyEditor.on("end", (event) => {let path = event.target.getPath();console.log('end');console.log(path);});map.on('click',(e)=>{console.log('您在 [ '+e.lnglat.getLng()+','+e.lnglat.getLat()+']的位置点击了多边形!');});</script>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/40943.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 VS Code 中自动化 Xcode 项目编译和调试

在 VS Code 中自动化 Xcode 项目编译和调试 在日常的开发工作中&#xff0c;Xcode 是 macOS、iOS、watchOS 和 tvOS 应用程序开发的主要工具。为了提高工作效率&#xff0c;许多开发者选择在 Visual Studio Code (VS Code) 中编辑代码&#xff0c;并希望能够直接从 VS Code 启…

无线传感器网络(物联网通信技术)期末考试2024年真题

目录 WSN期末复习资料 第一章&#xff1a;概述 第二章MAC协议 第三章路由协议 第四章时间同步技术 第五章定位技术 第六章安全技术 第七章拓扑控制 补充TPSN、HRTS公式推导 2024年期末考试考点 一、简述 二、考试真题回忆 WSN期末复习资料 第一章&#xff1a;概述 …

蓝桥杯开发板STM32G431RBT6高阶HAL库学习FreeRtos——新建工程

一、介绍 ​ 蓝桥杯嵌入式使用的单片机是STM32G431RBT6&#xff0c;内核ARM Cortex - M4&#xff0c;MCUFPU&#xff0c;170MHz/213DMIPS&#xff0c;高达128KB Flash&#xff0c;32KB SRAM&#xff0c;其余的外设就不多介绍了&#xff0c;参照数据芯片数据手册 ​ CT117E-M4…

JavaScript——while类型

目录 任务描述 相关知识 while类型 编程要求 任务描述 质数的定义如下&#xff1a;大于1的自然数&#xff0c;且除了1和本身外没有别的因数。如2、3、5、7。 本关任务&#xff1a;利用循环结构求质数的和。 相关知识 在选择结构中&#xff0c;条件会被测试一次&#xff…

74HC165芯片验证

目录 0x01 74HC165芯片介绍0x02 编程实现 0x01 74HC165芯片介绍 74HC165的引脚定义如下&#xff0c;长这个样子 ABCDEFGH是它的八个输入引脚&#xff0c;例如你可以将它连接按键&#xff0c;让它来读取8个按键值。也可以将他级联其它的74165&#xff0c;无需增加单片机GPIO引…

代码动态编译

背景 开发环境下新加代码、改代码时要重启后生效&#xff08;耗时间&#xff09;&#xff1b;需求:不用重启且支持springboot 、spring、MyBatis。 实现 下地地址&#xff1a;https://github.com/JetBrains/JetBrainsRuntime/releases 1.根据系统类型下载压缩包 2.解压后配…

Ubuntu 22.04.4 LTS 安装配置 MySQL Community Server 8.0.37 LTS

1 安装mysql-server sudo apt update sudo apt-get install mysql-server 2 启动mysql服务 sudo systemctl restart mysql.service sudo systemctl enable mysql.service #查看服务 sudo systemctl status mysql.service 3 修改mysql root密码 #默认密码为空 sudo mysql …

SQL 注入联合查询之为什么要 and 1=2

在 SQL 注入联合查询中&#xff0c;将 id 先置为假&#xff08;如 id-1 或其他使查询结果为空的条件&#xff09;&#xff0c;通常是为了让前面的查询语句查询不到结果&#xff0c;从而使联合查询中后面的语句结果能够显示在回显位上

【串口通信】之TTL电平

1. 什么是串口 串口,全称为串行通信端口,是一种计算机硬件接口,用于实现数据的串行传输。与并行通信不同,串口通信一次只传输一个比特,数据通过串行线按顺序传输。串口通信在嵌入式系统、工业控制、计算机与外围设备通信等领域非常常见 2. 什么是串口通信 串口通信是指通过…

在线签约如何选择?2024年10款顶级app大比拼

支持电子合同签约的10大app&#xff1a;e签宝、上上签、DocuSign、契约锁、Adobe Sign、法大大、SignNow、安心签、HelloSign、PandaDoc。 无论是企业之间的交易还是个人服务合同&#xff0c;线上电子合同签约提供了一种便捷、高效且安全的方式来处理法律文档。本文将介绍几款优…

【Python实战因果推断】20_线性回归的不合理效果10

目录 Neutral Controls Noise Inducing Control Feature Selection: A Bias-Variance Trade-Off Neutral Controls 现在&#xff0c;您可能已经对回归如何调整混杂变量有了一定的了解。如果您想知道干预 T 对 Y 的影响&#xff0c;同时调整混杂变量 X&#xff0c;您所要做的…

人工智能对网络安全有何影响?

人工智能网络安全在短期、中期和长期如何变化 当今数字时代网络安全的重要性 在谈论人工智能在网络安全中的作用时&#xff0c;必须首先考虑短期影响&#xff0c;因为它们是最明显的&#xff0c;而且它是一个未知的领域&#xff0c;需要超越直接炒作的能力。 因此&#xff0…

【Altium】AD-在原理图中如何绘制贝塞尔曲线

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 在原理图中绘制贝塞尔曲线的方法 2、 问题场景 贝塞尔曲线主要用来描述各种波形曲线&#xff0c;如正弦、余弦曲线等。贝塞尔曲线的绘制和直线类似&#xff0c;需要固定多个顶点&#xff08;最少4个&#xff09;后即…

入门PHP就来我这(纯干货)08

~~~~ 有胆量你就来跟着路老师卷起来&#xff01; -- 纯干货&#xff0c;技术知识分享 ~~~~ 路老师给大家分享PHP语言的知识了&#xff0c;旨在想让大家入门PHP&#xff0c;并深入了解PHP语言。 1 PHP对象的高级应用 1.1 final关键字 final 最终的、最后的。被final修饰过的类…

采用B/S模式 可跨平台使用的数据采集监控平台!

数据采集监控平台是一款专注于工业企业生产设备管理、数据采集、数据分析、数据管理、数据存储、数据传输等的软件系统。系统具备丰富的接口&#xff0c;配置灵活&#xff0c;方便部署&#xff0c;通过采集企业生产设备的数据集中处理&#xff0c;将各个信息孤岛有机连接&#…

技术赋能政务服务:VR导视与AI客服在政务大厅的创新应用

在数字化转型的浪潮中&#xff0c;政务大厅作为服务民众的前沿阵地&#xff0c;其服务效率和质量直接影响着政府形象和民众满意度。然而&#xff0c;许多政务大厅仍面临着缺乏智能化导航系统的挑战&#xff0c;这不仅增加了群众的办事难度&#xff0c;也降低了服务效率。维小帮…

ArcEngine获取投影坐标,地理坐标,垂直坐标系统以及3或6分度带的代码

本代码是用于质检中获取图层中平面坐标系统是否采用“2000国家大地坐标系(CGCS2000)高程系统是否采用“1985国家高程基准”。然后封装的一个方法 /// <summary>/// 平面坐标系统是否采用“2000国家大地坐标系(CGCS2000)高程系统是否采用“1985国家高程基准”。/// &l…

Windows的磁盘管理

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 第一动态磁盘管理 问题&#xff1a;…

Jackson与Json、Json和各种Java数据类型的互相转化

jackson是什么 json是最常用的数据交换格式 Jackson是最流行的Json库 首先对于这种JSON序列化的库其实有非常多&#xff0c;比如我们熟悉的Gson&#xff0c;Fastjson等等&#xff0c;当然技术没有完全的好坏&#xff0c;但是从使用情况和社区生态等方面综合看来&#xff0c;Ja…

【讲解下AI Native应用中的模型微调】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…