Java实现电子围栏的小例子
主要需求是实现一个电子围栏判断的小例子其中包括前端和后端的demo代码
引入对应的依赖库
org.locationtech.jts jts-core 1.18.0
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 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 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 necessary if (!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 pointsList) { Coordinate[] coordinates = new Coordinate[pointsList.size()]; for (int i = 0; i单元测试类
public class GeoFenceUtilTest { /** * Test geo * * @since 2.0.0 */ @Test public void testGeo() { // 示例电子围栏点集合 List 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测试平台,找到多边形编辑器,将下面的代码粘贴到执行器里面,然后点击右上角的执行代码,就可以获取到对应范围的点位地址
html, body, #container { width: 100%; height: 100%; } 多边形的绘制和编辑开始编辑 结束编辑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()+']的位置点击了多边形!'); });
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。