public class GeoJudgeUtils {/*** 地球半径(米)*/private static final double EARTH_RADIUS = 6378137.0;private static double rad(double d) {return d * Math.PI / 180.0;}/*** 计算是否在圆内* @param radius 半径(单位/米)* @param p1 圆心坐标* @param p2 判断点坐标* @return: boolean true:在圆内,false:在圆外* @date: 2019/10/25 10:27*/public static boolean isInCircle(double radius, Point p1, Point p2) {double radLat1 = rad(p1.getLat());double radLat2 = rad(p2.getLat());double a = radLat1 - radLat2;double b = rad(p1.getLng()) - rad(p2.getLng());double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));s = s * EARTH_RADIUS;s = Math.round(s * 10000) / 10000;return !(s > radius);}/*** 是否在矩形区域内* @param lat    测试点经度* @param lng    测试点纬度* @param minLat 纬度范围限制1* @param maxLat 纬度范围限制2* @param minLng 经度范围限制1* @param maxLng 经度范围限制2* @return boolean true:在矩形内, false:在矩形外* @Title: isInArea*/public static boolean isInRectangleArea(double lat, double lng, double minLat,double maxLat, double minLng, double maxLng) {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);}}} else {return false;}}/*** 是否在矩形区域内* @param point    测试点* @param gpsPoints 矩形GPS坐标点* @return boolean true:在矩形内, false:在矩形外* @Title: isInArea*/public static boolean isInRectangleArea(Point point, Point[] gpsPoints) {if (gpsPoints.length != 4) {return false;}double[] lats = new double[4];double[] lngs = new double[4];for (int i = 0; i < gpsPoints.length; i++) {lats[i] = gpsPoints[i].getLat();lngs[i] = gpsPoints[i].getLng();}Arrays.sort(lats);Arrays.sort(lngs);return isInRectangleArea(point.getLat(), point.getLng(), lats[0], lats[3], lngs[0], lngs[3]);}/*** 判断是否在经纬度范围内* @param point* @param left* @param right* @return boolean*/public static boolean isInRange(double point, double left, double right) {return point >= Math.min(left, right) && point <= Math.max(left, right);}/*** 判断点是否在多边形内* @param point 测试点* @param pts   多边形的点* @return boolean true:在多边形内, false:在多边形外* @throws* @Title: IsPointInPoly*/public static boolean isInPolygon(Point point, List<Point> pts) {int N = pts.size();boolean boundOrVertex = true;int intersectCount = 0;//交叉点数量double precision = 2e-10; //浮点类型计算时候与0比较时候的容差Point p1, p2;//临近顶点Point p = point; //当前点p1 = pts.get(0);for (int i = 1; i <= N; ++i) {if (p.equals(p1)) {return boundOrVertex;}p2 = pts.get(i % N);if (p.getLng() < Math.min(p1.getLng(), p2.getLng()) || p.getLng() > Math.max(p1.getLng(), p2.getLng())) {p1 = p2;continue;}//射线穿过算法if (p.getLng() > Math.min(p1.getLng(), p2.getLng()) && p.getLng() < Math.max(p1.getLng(), p2.getLng())) {if (p.getLat() <= Math.max(p1.getLat(), p2.getLat())) {if (p1.getLng() == p2.getLng() && p.getLat() >= Math.min(p1.getLat(), p2.getLat())) {return boundOrVertex;}if (p1.getLat() == p2.getLat()) {if (p1.getLat() == p.getLat()) {return boundOrVertex;} else {++intersectCount;}} else {double xinters = (p.getLng() - p1.getLng()) * (p2.getLat() - p1.getLat()) / (p2.getLng() - p1.getLng()) + p1.getLat();if (Math.abs(p.getLat() - xinters) < precision) {return boundOrVertex;}if (p.getLat() < xinters) {++intersectCount;}}}} else {if (p.getLng() == p2.getLng() && p.getLat() <= p2.getLat()) {Point p3 = pts.get((i + 1) % N);if (p.getLng() >= Math.min(p1.getLng(), p3.getLng()) && p.getLng() <= Math.max(p1.getLng(), p3.getLng())) {++intersectCount;} else {intersectCount += 2;}}}p1 = p2;}return intersectCount % 2 != 0;}}
@Data
@NoArgsConstructor
@ToString
public class Point {/*** 经度(7位小数)(-180~180,东经正数,西经负数)*/private double lng;/*** 维度(7位小数)(-90~90,北纬正数,南纬负数)*/private double lat;public Point(double lng, double lat) {this.lng = lng;this.lat = lat;}
}

注意:
@Data
@NoArgsConstructor
@ToString
这三个注解需要依赖Lombok, 如果不希望依赖, 可以去掉注解, 自己把get,set方法加上

Lombok依赖:

<!--Lomobok-->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.6</version>
</dependency>

电子围栏进出判断工具类相关推荐

  1. php 正则车架号,正则判断工具类 - 我的开源中国 - OSCHINA - 中文开源技术交流社区...

    package com.gulf.utils; import java.text.ParseException; import java.text.SimpleDateFormat; /** * 正则 ...

  2. java节假日算法_「国家法定节假日」java 国家法定节假日和双休日判断工具类 - seo实验室...

    国家法定节假日 package com.newland.dateutil; import java.text.ParseException; import java.text.simpledatefo ...

  3. java 国家法定节假日和双休日判断工具类

    package com.date.dateutil;import java.text.ParseException; import java.text.SimpleDateFormat; import ...

  4. java publicdatautil_Java数据类型判断工具类DataTypeUtil

    背景 之前要写一个项目,根据配置以及前端入参来调用具体的接口执行对应的任务,需要校验前端的入参是否是指定的数据类型,防止调用后续接口时出现异常. 然后看了下JAVA自带的方法以及Spring.Apac ...

  5. java 电子围栏_怎么画电子围栏,并进行电子围栏进出判断?

    您好!关于这个问题,如果您需要在客户端中添加的电子围栏的地物的话,首先电子围栏的地物类型需要是面要素数据集,然后通过更新面要素数据及图层来添加一个电子围栏,以下代码作为参考 //执行添加地物 func ...

  6. java实体类属性非空判断工具类

    import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Map.En ...

  7. (转载)项目实战工具类(一):PhoneUtil(手机信息相关)

    项目实战工具类(一):PhoneUtil(手机信息相关) 可以使用的功能: 1.获取手机系统版本号 2.获取手机型号 3.获取手机宽度 4.获取手机高度 5.获取手机imei串号 ,GSM手机的 IM ...

  8. 节假日判断工具(Java)

    由来 节假日判断工具类:大厂接口要收费,小厂接口怕不稳定,索性自己写一个吧. 软件架构 spring boot,jdk1.8 原理:通过文本文件,维护每一年的假节日和调休日期.示例见/years/20 ...

  9. Hutool Java常用工具类汇总

    简介 Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以"甜甜的". Hu ...

最新文章

  1. 网络工程师考试部分技术要点
  2. Java多线程设计模式(4)线程池模式
  3. setTimeOut函数和setInterval函数
  4. 如何解决访问Windows Update网站时收到0X8024001D错误信息
  5. 大数据平台的搭建思路是怎样的
  6. 2019牛客暑期多校训练营(第四场)K-number
  7. 世界各国国家代码简称 - 备用
  8. 【JAVA 数据结构】 JAVA实现动态数组
  9. 手机连接linux共享打印机,连接Linux共享打印机
  10. 女主学霸男主学神小说计算机系的,5本双学霸校园甜文:忠犬学神男主VS低情商学霸女主,全程高甜!...
  11. 良心推荐:最适合玩吃鸡手游的安卓机型有哪些?刺激战场为例
  12. 列表中使用bootstrap-switch开关
  13. Java、JSP网上教务评教管理系统(教学评价系统)
  14. vcruntime140_1.dll 丢失的解决办法
  15. AVFrame相关api内存管理
  16. 2016校招面试题汇总
  17. android 学生信息管理系统,android学生信息管理系统的报告.docx
  18. 嵌入式linux编译程序,构造嵌入式Linux(一):Kernel编译
  19. 计算机领域nt=p,09计算机基础PwerPoint单选.doc
  20. W3af简单使用教程

热门文章

  1. Flask 基础教学(一)
  2. 全局异常处理以及自定义异常
  3. 静电抗扰度对金属外壳的影响
  4. Sublime Text3格式化JSON
  5. vsnprintf linux,你如何安全地调用vsnprintf()?
  6. 科普向 | 一文读懂什么是AI芯片
  7. 借助trinamic精确控制医疗设备
  8. 获取焦点和失去焦点事件
  9. 突发!李开复宣布加入中文版ChatGPT大战!要打造AI 2.0全新平台!
  10. 齐博x1教程:用户登录接口