java电子围栏
java版的电子围栏违规判断经过测试准确率百分之百经过各大AI审查已经无限趋近于完美本工具类支持圆形矩形多边形性能与准确率都有保障实测判断多边形围栏单线程执行千万次次只需要十几秒多线程只需要1秒废话不说直接上代码先贴工具类代码import com.core.entity.Point;import java.util.List;/*** 描述: 电子围栏计算【V4.2 上线定稿防御增强版】* 版本: 4.2.0* 日期: 2026-08-13* 数学前提与约束重要* 1. 多边形边界容差采用【经纬度平面求垂足 Haversine球面距离】组合方案* ✅ 围栏边长 ≤50km垂足误差厘米~分米级国内园区/城配业务完全可用* ⚠️ 围栏边长 100km平面垂足和球面大圆垂足存在偏差会引入数米~数十米误差不推荐使用* 2. AABB轴对齐矩形说明* ✅ 天然支持跨本初子午线(0°经度)* ⚠️ 跨±180°国际日期变更线矩形调用方必须传入 minLng maxLng 格式例minLng170,maxLng-170否则判定失效* ⚠️ 斜旋转矩形禁止使用本方法斜矩形请组装4个顶点调用多边形方法 isInPolygon* 3. 多边形射线法不支持跨±180°国际日期变更线围栏* 4. 强制约束围栏坐标、点位【坐标系必须完全一致 WGS84 / GCJ02 / BD09 不可混用】*/public class GeofencingUtils {/*** WGS84 椭球长半轴(赤道半径) 米Haversine公式使用*/private static final double EARTH_RADIUS 6378137.0;private static double rad(double d) {return d * Math.PI / 180.0;}/*** 圆形围栏判断球面大圆距离全球通用* param radius 半径米* param center 圆心点位* param point 待判断点位* return true 在圆内*/public static boolean isInCircle(double radius, Point center, Point point) {// 防御判空if (center null || point null) {return false;}double radLat1 rad(center.getLat());double radLat2 rad(point.getLat());double a radLat1 - radLat2;double b rad(center.getLng()) - rad(point.getLng());double temp Math.pow(Math.sin(a / 2), 2) Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2);if (temp 1.0) temp 1.0;if (temp 0.0) temp 0.0;double s 2 * Math.asin(Math.sqrt(temp));s s * EARTH_RADIUS;return s radius;}/*** AABB轴对齐矩形仅适用于正北正南对齐矩形* ⚠️ 斜旋转矩形绝对不要用斜矩形请组装4个顶点调用多边形方法 isInPolygon* ⚠️ 跨±180°日期变更线场景必须传入 minLng maxLng否则逻辑失效* param lng 检测点经度* param lat 检测点纬度* param minLng 最小经度跨180场景填大数如170* param maxLng 最大经度跨180场景填小数如-170* param minLat 最小纬度* param maxLat 最大纬度* return true 在矩形包围盒内*/public static boolean isInRectangleArea(double lng, double lat, double minLng, double maxLng,double minLat, double maxLat) {if (isInRange(lat, minLat, maxLat)) {if (minLng * maxLng 0) {return isInRange(lng, minLng, maxLng);} else {if (Math.abs(minLng) Math.abs(maxLng) 180) {return isInRange(lng, minLng, maxLng);} else {double left Math.max(minLng, maxLng);double right Math.min(minLng, maxLng);return isInRange(lng, left, 180) || isInRange(lng, right, -180);}}}return false;}private static boolean isInRange(double point, double left, double right) {return point Math.min(left, right) point Math.max(left, right);}/*** 球面点到线段【真实地面距离(米)】* 原理经纬度平面求垂足 → Haversine计算球面米距* ⚠️ 适用约束围栏边长 ≤50km超大范围100km会存在球面垂足近似偏差*/private static double pointToSegmentSphereMeter(Point target, Point segStart, Point segEnd) {double lng0 target.getLng();double lat0 target.getLat();double lng1 segStart.getLng();double lat1 segStart.getLat();double lng2 segEnd.getLng();double lat2 segEnd.getLat();double a lng0 - lng1;double b lat0 - lat1;double c lng2 - lng1;double d lat2 - lat1;double dot a * c b * d;double lenSq c * c d * d;double param;if (lenSq 0) {param -1;} else {param dot / lenSq;}// 平面投影垂足经纬度double footLng, footLat;if (param 0) {footLng lng1;footLat lat1;} else if (param 1) {footLng lng2;footLat lat2;} else {footLng lng1 param * c;footLat lat1 param * d;}// Haversine 计算目标点 ↔ 垂足 球面大圆距离米return calcHaversineMeter(target.getLng(), target.getLat(), footLng, footLat);}/*** Haversine 计算两点球面大圆距离返回米* ✅ 增加浮点钳位保护防止asin入参越界产生NaN*/private static double calcHaversineMeter(double lngA, double latA, double lngB, double latB) {double radLat1 rad(latA);double radLat2 rad(latB);double a radLat1 - rad(latB);double b rad(lngA) - rad(lngB);double temp Math.pow(Math.sin(a / 2), 2) Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2);// 钳位处理防止浮点精度溢出导致 asin NaNif (temp 1.0) temp 1.0;if (temp 0.0) temp 0.0;double s 2 * Math.asin(Math.sqrt(temp));return s * EARTH_RADIUS;}/*** 多边形围栏标准奇偶射线法 【球面真实米级边界容差】* ⚠️ 限制1.暂不支持跨±180°日期变更线多边形2.边长100km存在球面垂足近似误差* param point 检测点位* param pts 多边形顶点集合顺时针/逆时针均可简单不自交多边形* param toleranceMeter 边界容差(米)普通GPS推荐3米* return true 在内部/边界容差范围内*/public static boolean isInPolygon(Point point, ListPoint pts, double toleranceMeter) {// 防御校验空对象、顶点不足直接返回falseif (point null || pts null || pts.size() 3) {return false;}// 容差负数保护强制最小为0if (toleranceMeter 0) {toleranceMeter 0;}boolean inside false;int size pts.size();for (int i 0, j size - 1; i size; j i) {Point pi pts.get(i);Point pj pts.get(j);// 顶点对象防御顶点null直接跳过这条边容错避免NPEif (pi null || pj null) {continue;}double distMeter pointToSegmentSphereMeter(point, pi, pj);if (distMeter toleranceMeter) {return true;}// 标准奇偶射线穿透算法if (((pi.getLat() point.getLat()) ! (pj.getLat() point.getLat()))) {double lngIntersect ((point.getLat() - pi.getLat()) * (pj.getLng() - pi.getLng()))/ (pj.getLat() - pi.getLat()) pi.getLng();if (point.getLng() lngIntersect) {inside !inside;}}}return inside;}/*** 重载兼容老代码默认3米球面容差*/public static boolean isInPolygon(Point point, ListPoint pts) {return isInPolygon(point, pts, 3.0);}}再贴实体类package com.core.entity;import lombok.Data;import lombok.ToString;DataToStringpublic class Point {/*** 经度-180~180东经正西经负*/private double lng;/*** 纬度-90~90北纬正南纬负*/private double lat;public Point(double lng, double lat) {this.lng lng;this.lat lat;}}说明用哪种坐标系不重要但是围栏的经纬度与要判断的坐标点必须保持是同一种坐标系踩坑记录如果要用行政区划来做围栏国内的行政区划例如上海市的边界范围是由好几个独立模块组成的所以做判断的时候这几个独立模块要分开来单独判断否则会导致判断不准确

相关新闻

Seedance 2.0:下一代分布式任务编排与调度引擎深度解析

Seedance 2.0:下一代分布式任务编排与调度引擎深度解析

引言:为什么需要 Seedance 2.0? 在当今云原生与微服务架构盛行的时代,复杂的业务逻辑往往被拆分为无数个细粒度的任务。如何高效、可靠、可观测地编排与调度这些任务,成为开发者面临的核心挑战。传统的定时任务框架(如…

2026/8/15 13:22:06 阅读更多 →
嵌入式从0到精通——数据结构

嵌入式从0到精通——数据结构

一、基本概念数据结构数据结构:存储具有一种或多种特定关系的数据的集合(如何组织和存储数据)。程序设计 数据结构 算法数据与数据之间的关系逻辑结构 : 数据元素与元素之间的关系集合 :数据元素与元素之间关系平等线…

2026/8/15 11:07:29 阅读更多 →
如何快速切换OneNav主题:从默认到自定义的完整指南

如何快速切换OneNav主题:从默认到自定义的完整指南

如何快速切换OneNav主题:从默认到自定义的完整指南 【免费下载链接】onenav 使用PHP SQLite 3开发的书签管理系统,将浏览器书签集中式管理,做到一处部署,随处访问。 项目地址: https://gitcode.com/gh_mirrors/on/onenav …

2026/8/15 11:12:58 阅读更多 →

最新新闻

开源项目第187期:Pi — 哲学驱动的极简 AI Coding Agent,86k Stars,30+ LLM 提供商,无限扩展

开源项目第187期:Pi — 哲学驱动的极简 AI Coding Agent,86k Stars,30+ LLM 提供商,无限扩展

引言 “Adapt pi to your workflows, not the other way around.” 这是「每日一个开源项目」系列的第 187 篇。今天的项目是 Pi —— 一个极简哲学驱动的 AI coding agent harness,86,334 颗 Star,由游戏开发者 Mario Zechner(libGDX 作者&a…

2026/8/15 14:04:09 阅读更多 →
SNMP Trap实战指南:从协议原理到Python代码实现

SNMP Trap实战指南:从协议原理到Python代码实现

1. 从一次深夜告警说起:为什么我们需要SNMP Trap?那天凌晨两点,手机突然震动个不停。不是电话,而是一连串的监控告警。我睡眼惺忪地抓起来一看,核心机房的某台交换机端口流量飙到了95%,眼看就要触发业务中断…

2026/8/15 14:04:09 阅读更多 →
Java基础复习08:File类、字节流、字符流、缓冲流、转换流、序列化、打印流、Commons-io包介绍

Java基础复习08:File类、字节流、字符流、缓冲流、转换流、序列化、打印流、Commons-io包介绍

目录一、File类与IO流概述1.1 文件路径的写法和相对路径1.2 File类对象的创建1.3 File类常用API1.4 文件搜索1.5 字符集的编码/解码1.6 IO流概述1.7 IO流的分类1.8 IO体系图二、字节流2.1 文件字节输入流(FileInputStream)创建对象与常用API每次读取一个字节int read()每次读取…

2026/8/15 14:04:09 阅读更多 →
DeepSeek Harness 开源:对标 Claude Code,v0.1 先尝鲜别上生产

DeepSeek Harness 开源:对标 Claude Code,v0.1 先尝鲜别上生产

8 月 13 日,DeepSeek 把自家 Agent 框架 Harness v0.1 以 MIT 协议开源了,GitHub 星数很快逼近 6 万。一句话概括这件事:这是一个"模型无关"的编程 Agent 框架,官方定位就是对标 Anthropic 的 Claude Code 和 OpenAI 的…

2026/8/15 14:04:09 阅读更多 →
DeepSeek V4 Pro 正式版上线:Agent 能力大涨,涨价也安排上了

DeepSeek V4 Pro 正式版上线:Agent 能力大涨,涨价也安排上了

8 月 13 日凌晨,DeepSeek 没开发布会,直接把官方 API 文档里的 V4 Pro 从预览版更新成了正式版 0813:调用名还是 deepseek-v4-pro,接口格式没变,存量代码一行都不用动。同一天,官方还放出了两个跟钱直接相关…

2026/8/15 14:04:09 阅读更多 →
网盘下载太慢太折腾?一个脚本搞定八大网盘直链下载

网盘下载太慢太折腾?一个脚本搞定八大网盘直链下载

网盘下载太慢太折腾?一个脚本搞定八大网盘直链下载 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…

2026/8/15 14:03:09 阅读更多 →

日新闻

内景 空间站内部 中国空间站 太空 内仓

内景 空间站内部 中国空间站 太空 内仓

本项目为前几天收费帮学妹做的一个项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 空间站内部 中国空间站 太空 内仓 地址:本地PC端运行(或Web…

2026/8/15 0:00:30 阅读更多 →
重新定义数据接口:3个突破性场景让通达信数据读取更智能

重新定义数据接口:3个突破性场景让通达信数据读取更智能

重新定义数据接口:3个突破性场景让通达信数据读取更智能 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 当我们面对海量金融数据时,传统的数据获取方式往往让我们陷入困境—…

2026/8/15 0:00:30 阅读更多 →
一文读懂快消WMS怎么选?2026年国内外10大主流WMS品牌盘点

一文读懂快消WMS怎么选?2026年国内外10大主流WMS品牌盘点

快消品(FMCG)是流通速度较快、竞争较为激烈的行业之一。一瓶饮料从出厂到消费者手中,往往只有几十天甚至几天的周转窗口。这决定了快消行业的仓储管理系统(WMS)与制造业、电商行业存在明显区别:它不仅需要管…

2026/8/15 0:02:30 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/15 12:59:14 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/14 13:40:53 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/14 14:06:45 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/15 2:35:29 阅读更多 →