应项目需求,需要判断一个点所属哪个区域范围内管辖,突然想起来三年前做了个外卖的项目里面有个功能,判断用户是否在商家自己划的配送范围内,又找回来以前的代码来看了下,所以在此处记录一下

@Data

@NoArgsConstructor

@AllArgsConstructor

public class Point {

private Double lat;

private Double lng;

}

/**

* 判断当前位置是否在多边形区域内

*

* @param checkPoint 当前经纬度

* @param areaAround 围栏范围

* @return

*/

public static boolean checkIsInPolygon(Point checkPoint, List areaAround) {

Point2D.Double point = new Point2D.Double(checkPoint.getLat(), checkPoint.getLng());

List pointList = new ArrayList<>();

for (Point everyPoint : areaAround) {

Point2D.Double polygonPoint = new Point2D.Double(everyPoint.getLat(), everyPoint.getLng());

pointList.add(polygonPoint);

}

return checkIsPtInPoly(point, pointList);

}

/**

* 判断点是否在多边形内,如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true

*

* @param point 检测点

* @param pts 多边形的顶点

* @return 点在多边形内返回true, 否则返回false

*/

public static boolean checkIsPtInPoly(Point2D.Double point, List pts) {

int N = pts.size();

//如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true

boolean boundOrVertex = true;

//cross points count of x

int intersectCount = 0;

//浮点类型计算时候与0比较时候的容差

double precision = 2e-10;

//neighbour bound vertices

Point2D.Double p1, p2;

//当前点

Point2D.Double p = point;

//left vertex

p1 = pts.get(0);

//check all rays

for (int i = 1; i <= N; ++i) {

if (p.equals(p1)) {

//p is an vertex

return boundOrVertex;

}

//right vertex

p2 = pts.get(i % N);

//ray is outside of our interests

if (p.x < Math.min(p1.x, p2.x) || p.x > Math.max(p1.x, p2.x)) {

p1 = p2;

//next ray left point

continue;

}

//ray is crossing over by the algorithm (common part of)

if (p.x > Math.min(p1.x, p2.x) && p.x < Math.max(p1.x, p2.x)) {

//x is before of ray

if (p.y <= Math.max(p1.y, p2.y)) {

//overlies on a horizontal ray

if (p1.x == p2.x && p.y >= Math.min(p1.y, p2.y)) {

return boundOrVertex;

}

//ray is vertical

if (p1.y == p2.y) {

//overlies on a vertical ray

if (p1.y == p.y) {

return boundOrVertex;

//before ray

} else {

++intersectCount;

}

} else {

//cross point on the left side

//cross point of y

double xinters = (p.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) + p1.y;

//overlies on a ray

if (Math.abs(p.y - xinters) < precision) {

return boundOrVertex;

}

//before ray

if (p.y < xinters) {

++intersectCount;

}

}

}

} else {

//special case when ray is crossing through the vertex

//p crossing over p2

if (p.x == p2.x && p.y <= p2.y) {

//next vertex

Point2D.Double p3 = pts.get((i + 1) % N);

//p.x lies between p1.x & p3.x

if (p.x >= Math.min(p1.x, p3.x) && p.x <= Math.max(p1.x, p3.x)) {

++intersectCount;

} else {

intersectCount += 2;

}

}

}

//next ray left point

p1 = p2;

}

//偶数在多边形外

if (intersectCount % 2 == 0) {

return false;

} else {

//奇数在多边形内

return true;

}

}

还是三年前写的,先记录一下,抽时间再优化一下代码

java 判断范围_java判断一个点是否在一个围栏范围内相关推荐

  1. java 登录下线_java 实现 一个账号只能在一个地方登陆,其他地方被下线

    其实方法有很多的,我这献丑了. 使用理解java 四大作用域. 思路:理解java 四大作用域的关键. 第一个地方登陆: 1.得到请求的SessionId 和 登陆的 用户名 2.把SessionId ...

  2. JAVA判断一个地理坐标是否在一个多边形区域内和是否在一个圆形区域内(经纬度)

    怎么样判断一个坐标点在一个多边形区域内?包括规则多边形,不规则多边形,还有圆... 1 判断一个坐标是否在圆形区域内? 多边形和圆分开写,首先简单的就是判断是否在圆里面,如何判断一个坐标是否在圆形区域 ...

  3. java 判断当天_java判断一个时间是否是今天的方法

    java判断时间是否是今天:public class Test { /** * java 判断一个时间是不是今天的时间范围内 * @param args */ public static void m ...

  4. java 时间判断大小_java判断时间大小

    //构造日期格式yyyy-MM-NN SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); Date d ...

  5. java判断题_java判断题

    判断题 1.Java语言有三种技术平台,分别是JavaSE.JavaME.JavaEE(T) 2.Java是一门高级计算机语言.(T) 3.Java语言具体跨平台的特性(T) 4.JDK工具中自带了一 ...

  6. java定义负数_java定义一个负数

    提示: InsufficientFundsException,NagativeFundsException 为自定义的类,分别产生余额不足异 常和取款为负数异常,需继承 Exception 类. 通过 ...

  7. java 显示锁_Java 实现一个自己的显式锁Lock(有超时功能)

    Lock接口 package concurency.chapter9; import java.util.Collection; public interface Lock { static clas ...

  8. java输出值_java输出一个值的绝对值怎么编写?

    小伙伴们知道在java中要如何输出一个值的绝对值吗?这次我们就来实验一下如何输出绝对值吧. 例1:import java.util.Scanner; public class Question1 { ...

  9. java判断星期天_java实现一个月的最后一个星期天

    Calendar instance = Calendar.getInstance(); System.out.println(instance.getTime()); instance.add(Cal ...

最新文章

  1. 【转载】PHP面向对象(OOP)编程入门教程
  2. oracle 查询spid,查看数据库session的sid来查杀对应系统进程号spid
  3. JHipster生成微服务架构的应用栈(一)- 准备工作
  4. LeetCode 720. 词典中最长的单词(Trie树)
  5. 1.Android新版开发教程笔记—Android ADB工具使用
  6. 算法——从旋转字符串到翻转单词
  7. 巧用「打印」功能实现PDF单页提取
  8. OpenGL与gl glu glut freeglut glew glfw封装库关系(十五)
  9. qml调用python_QML使用Python的函数
  10. 21-nginx单机1W并发优化
  11. STM32的选型参考
  12. linux虚拟键盘onboard设置,求助,安装屏幕虚拟键盘onboard出错。
  13. Matlab中freqz函数使用
  14. html 设置字体加粗,css如何设置字体加粗样式?
  15. wpsmac和pc版的区别_Mac系统下金山WPS和微软Office 哪个更好更好用
  16. 整合+策略:微网通联的GMP平台如何帮助企业搭建统一智慧通信架构
  17. linux安装intel无线网卡驱动,CentOS 命令行安装intel 2200bg无线网卡驱动
  18. java中speak方法的意思_Java中的關鍵字
  19. 石头机器人拖地水量调节_科技解放双手:石头扫拖一体机器人使用体验
  20. 全球与中国汽车内饰牛皮革市场发展调研及未来前景预测报告2022-2028年

热门文章

  1. c6011取消对null指针的引用_C/C++学习笔记——C提高:指针强化
  2. 9008刷机怎么刷_OV快捷进入高通进9008或fastboot模式刷机解锁,和MTK关机解锁
  3. python用途适合做什么生意-PureQuant数字货币量化交易程序化交易python量化开源框架...
  4. 区块链 matlab,matlab可以实现区块链吗?
  5. 暗备用的运行状态_瞧:我利用“无偏二极管”发明设计出了【宇宙“暗物质”、“暗能量”探测器】...
  6. python元组求和_Python 列表和元组 - 学习笔记(持续更新)
  7. can't request region for resource [mem 0xfed40080-0xfed40fff]问题的解决办法
  8. Unity(一)Unity脚本程序开发
  9. CompletableFuture详解~思维导图
  10. Python编程从入门到实践~JSON