Java生成一个区域内的经纬度随机点的方式

准备:
1、四个角点(四个点确定一个框)
2、想要细分程度 (这里说的是经纬度,这里没有对经纬度做更细的区分)
如:0.000001约等于0.1m,0.00001约等于1m,0.0001约等于10m 。。。
思路:
1、四个角点的lon和lat分别放入lonList和latList中并排序(从小到大)
2、画一个最大框

 左上角的点应当取 lonList的第三位 ,latList的第零位左下角的点应当取 lonList的第零位 ,latList的第零位右上角的点应当取 lonList的第三位 ,latList的第三位右下角的点应当取 lonList的第零位 ,latList的第三位

上面做的就是画了一个极限包含我们需要点的矩形;
3、以左下角为坐标系的中心,根据unit分辨率向resList添加可能点
4、根据四个点确定的矩形来过滤resList的所有可能点,得到我们真正框内的点集合(过滤条件:落在四个点的框内)
ps:我这里得到的四个点无法确认谁左谁右,谁上谁下,所以需要画最大框

演示图:
1、我画了四个点
在这里插入图片描述
2、得到的最大框
在这里插入图片描述
3、过滤后的落点
在这里插入图片描述
此时你需要取随机点random一下list其实就可以了

demo:

    public static void main(String[] args) {//1、构建四个角落点List<Point> points = Lists.newArrayList(new Point(112.5743064, 26.8286825),new Point(112.5744284, 26.8283794),new Point(112.574591, 26.8284339),new Point(112.5745134, 26.8286289));//2、对角落点补点List<Point> theoryPoints = getInPoints(points.get(0), points.get(1), points.get(2), points.get(3), 0.00002);//3、对落在四个角点构建框内的数据进行过滤(注意四个角点需要按照顺时针或者逆时针的形式排列)List<Point> inPoints = theoryPoints.stream().filter(point -> isPtInPoly(point.getLon(), point.getLat(), points)).collect(Collectors.toList());System.out.println("inPoints = " + inPoints);}

实体:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Point {private double lon;//经度private double lat;//纬度private double alt;//高度public Point(double lon, double lat) {this.lon = lon;this.lat = lat;}}

code:
重置四边形,获取四边形内所有点

    /*** ** @param leftOnPoint    四个角点(可以不按照名称来,因为方法会重新构建最大框)* @param leftDownPoint* @param rightOnPoint* @param rightDownPoint* @param unit 分辨率* @return*/public static List<Point> getInPoints(Point leftOnPoint, Point leftDownPoint, Point rightOnPoint, Point rightDownPoint, double unit) {//重组最符合逻辑的四边形区域List<Double> lonList = new ArrayList<>();List<Double> latList = new ArrayList<>();lonList.add(leftOnPoint.getLon());lonList.add(leftDownPoint.getLon());lonList.add(rightOnPoint.getLon());lonList.add(rightDownPoint.getLon());latList.add(leftDownPoint.getLat());latList.add(leftOnPoint.getLat());latList.add(rightDownPoint.getLat());latList.add(rightOnPoint.getLat());lonList.sort(Double::compareTo);latList.sort(Double::compareTo);Point leftOnPointRel = new Point(lonList.get(lonList.size() - 1), latList.get(0));Point leftDownPointRel = new Point(lonList.get(0), latList.get(0));Point rightOnPointRel = new Point(lonList.get(lonList.size() - 1), latList.get(latList.size() - 1));Point rightDownPointRel = new Point(lonList.get(0), latList.get(latList.size() - 1));List<Point> list = new ArrayList<>();double lon = leftDownPointRel.getLon();while (true) {double lat = leftDownPointRel.getLat();while (true) {if (lat >= Math.max(rightDownPointRel.getLat(), rightOnPointRel.getLat())) {break;}list.add(new Point(lon, lat));lat += unit;}if (lon >= Math.max(leftOnPointRel.getLon(), rightOnPointRel.getLon())) {break;}lon += unit;}return list;}

过滤方法:

   /*** 判断某一个经纬度点是否在一组经纬度范围内** @param ALon A点经度* @param ALat A点纬度* @param ps   范围多边形经纬度集合* @author Klay* @date 2023/2/8 18:06*/public static boolean isPtInPoly(double ALon, double ALat, List<Point> ps) {if (CollectionUtils.isEmpty(ps)) {logger.warn("当前传入点集合为空");return false;}int iSum, iCount, iIndex;double dLon1 = 0, dLon2 = 0, dLat1 = 0, dLat2 = 0, dLon;if (ps.size() < 3) {return false;}iSum = 0;iCount = ps.size();for (iIndex = 0; iIndex < iCount; iIndex++) {if (iIndex == iCount - 1) {dLon1 = ps.get(iIndex).getLon();dLat1 = ps.get(iIndex).getLat();dLon2 = ps.get(0).getLon();dLat2 = ps.get(0).getLat();} else {dLon1 = ps.get(iIndex).getLon();dLat1 = ps.get(iIndex).getLat();dLon2 = ps.get(iIndex + 1).getLon();dLat2 = ps.get(iIndex + 1).getLat();}// 以下语句判断A点是否在边的两端点的水平平行线之间,在则可能有交点,开始判断交点是否在左射线上if (((ALat >= dLat1) && (ALat < dLat2)) || ((ALat >= dLat2) && (ALat < dLat1))) {if (Math.abs(dLat1 - dLat2) > 0) {//得到 A点向左射线与边的交点的x坐标:dLon = dLon1 - ((dLon1 - dLon2) * (dLat1 - ALat)) / (dLat1 - dLat2);// 如果交点在A点左侧(说明是做射线与 边的交点),则射线与边的全部交点数加一:if (dLon < ALon) {iSum++;}}}}if ((iSum % 2) != 0) {return true;}return false;}

如有纰漏,还望补充,小子改正

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

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

相关文章

MongoDB——索引(单索引,复合索引,索引创建、使用)

MongoDB索引 官方文档 https://docs.mongodb.com/manual/indexes/#create-an-index 默认索引 _id index Mongodb 在 collection 创建时会默认建立一个基于_id 的唯一性索引作为 document 的 primarykey&#xff0c;这个 index 无法被删除 单个字段索引 单字段索引是 Mongo…

【Skynet 入门实战练习】开发环境搭建 | 运行第一个项目 | debug console 简单使用

文章目录 写在前面开发环境搭建skynet配置文件项目&#xff0c;启动&#xff01; debug console 写在前面 本系列【Skynet 入门实战练习】所有源码同步&#xff1a;https://gitee.com/Cauchy_AQ/skynet_practice 开发环境搭建 skynet skynet 框架地址&#xff1a;https://g…

什么款式的蓝牙耳机跑步不容易掉?推荐几款很不错的运动耳机

​如果你正在寻找一款性能卓越、佩戴舒适的耳机&#xff0c;那么运动耳机绝对是你的不二选择。它们不仅具备出色的音质&#xff0c;还具备防水、防汗、防震等多项特点&#xff0c;让你在运动时更加尽情享受音乐。接下来给大家推荐几款很不错的运动耳机。 1.南卡开放式运动耳机…

南京数字孪生赋能工业制造,加速推进制造业数字化转型

随着南京信息技术的迅猛发展和工业管理的不断演进&#xff0c;传统的工业管理方式已经无法满足企业对高效、智能和可持续发展的需求。针对这一情况&#xff0c;数字孪生技术应运而生&#xff0c;为南京工业管理带来了全新的变革和机遇。以数字孪生为理念&#xff0c;三维可视化…

闪存基本原理

系列文章目录 一、SSD主控 二、PCIe和NVMe控制器前端子系统 文章目录 系列文章目录三、闪存基本原理1.结构2.衍生问题 三、闪存基本原理 闪存是SSD的存储介质&#xff08;NAND Flash&#xff09;&#xff0c;它是一种非易失性存储器&#xff08;Non-volatile memory&#xff0…

centos7 怎么让命令行显示中文(英文->中文)

要让CentOS 7命令行显示中文&#xff0c;您需要确保您的系统支持中文字符集&#xff0c;并在命令行中设置正确的语言环境。以下是设置中文字符集和语言环境的步骤&#xff1a; 首先&#xff0c;确保您的系统已经安装了中文字体。在终端中运行以下命令来查看安装的中文字体&…

开源免费的流程设计器如何选型

大家在开发OA办公自动化、ERP、CRM、BPM、低代码平台等项目的时候&#xff0c;经常用到流程引擎&#xff0c;目前主流的开源流程引擎有activiti、flowable、camunda。这几个开源的流程引擎均基于BPMN2.0国际规范标准&#xff0c;其功能均比较强大&#xff0c;接口也很丰富。但涉…

关键性进展! 小米造车露真容 预计明年上市

大家好,我是极智视界,欢迎关注我的公众号,获取我的更多前沿科技分享 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:https://t.zsxq.com/0aiNxERDq 小米在各种不同的产品上都在不断打上自己的品牌,这绝对不止于智能手机,而是有智能…

javaScript 内存管理

1 js 内存机制 内存空间&#xff1a;栈内存&#xff08;stack&#xff09;、堆内存&#xff08;heap&#xff09; 栈内存&#xff1a;所有原始数据类型都存储在栈内存中&#xff0c;如果删除一个栈原始数据&#xff0c;遵循先进后出&#xff1b;如下图&#xff1a;a 最先进栈&…

【剪枝】torch-pruning的基本使用

论文&#xff1a;DepGraph: Towards Any Structural Pruning 工程&#xff1a;https://github.com/VainF/Torch-Pruning 算法和库的使用介绍&#xff1a;CVPR 2023 | DepGraph 通用结构化剪枝 1 TP的简介 该算法介绍了DepGraph 如何建模结构化剪枝中的层依赖&#xff0c;实现任…

英国国家量子计算中心与IBM签署重要协议!英国进入实用量子时代

​&#xff08;图片来源&#xff1a;网络&#xff09; 近日&#xff0c;英国国家量子计算中心&#xff08;NQCC&#xff09;与IBM达成了一项重要协议。根据该协议&#xff0c;NQCC将为英国研究人员提供IBM量子高级计划的云访问权限&#xff0c;其中包括IBM的量子计算系统舰队。…

一文带你拿下MySQL之增删查改(基础)

✏️✏️✏️今天给各位带来的是关于数据库增删查改基础方面的知识。 清风的CSDN博客 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff01; 动动你们发财的小手&#xf…

Activiti7工作流引擎:生成实时的流程图片

实时获取当前流程对应的流程图片&#xff0c;并对当前正在审批的节点进行高亮显示。 public class ActivitiController {Autowiredprivate ProcessEngine processEngine;Autowiredprivate RepositoryService repositoryService;Autowiredprivate RuntimeService runtimeService…

vue超好用的自定义指令封装

一、指令封装 目录结构&#xff1a; index.ts 统一注册 import { App, Directive } from "vue"; import auth from "./modules/auth"; import copy from "./modules/copy"; import waterMarker from "./modules/waterMarker"; impor…

OpenStack-train版安装之基础组件安装

基础组件安装 安装MariaDB&#xff08;数据库&#xff09;安装RabbitMQ&#xff08;消息队列&#xff09;安装Memcached&#xff08;缓存&#xff09; 安装MariaDB&#xff08;数据库&#xff09; 安装 # yum install mariadb mariadb-server python2-PyMySQL -y数据库配置 …

2023年中国感应电炉产业链、产量、销量及市场规模分析[图]

感应电炉行业定义是指使用电磁感应原理&#xff0c;通过感应电流使金属工件在短时间内达到预定温度的工业设备。广泛应用于冶金、机械、汽车、航空、航天、船舶、电子、医疗器械等领域。 感应电炉行业产业链 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; …

CSS实现空心的“尖角”

大家好&#xff0c;我是南宫&#xff0c;来分享一个昨天解决的问题。 我记得之前刷面试题的时候&#xff0c;CSS面试题里面赫然有一题是“如何用CSS实现三角形”&#xff0c;我觉得这个问题确实很经典&#xff0c;我上的前端培训班当初就讲过。 大概思路如下&#xff1a; 先…

【每周一测】Java阶段三阶段考试

目录 1、SpringBoot在整合RabbitMQ时需要导入的包是 2、下列关于RabbitMQ的confirm消息确认机制解释说明正确的是 3、关于SpringBoot的配置文件&#xff0c;以下说法正确的是&#xff08;&#xff09; 4、变量命名规范说法正确的是? 5、哪个关键字可以对对象加互斥锁&…

优思学院|质量管理怎样才能做好?

质量管理怎样才能做好&#xff1f;这是一个好问题&#xff0c;很多人第一时间会想到建立一个稳定的质量管理体系&#xff0c;例如ISO9001&#xff0c;又或者善用QC七大手法等等&#xff0c;虽然以上这些方法都是实用和正确的&#xff0c;绝大多数企业通常最忽略的&#xff0c;其…

备案信息一键查询:网站备案信息查询API的操作与优势

前言 在当今数字化的时代&#xff0c;企业的在线存在至关重要。而为了确保在网络空间的法规合规性&#xff0c;了解和管理网站备案信息变得尤为重要。为了使这一过程更为高效、便捷&#xff0c;网站备案信息查询API应运而生&#xff0c;为企业提供了一种简便的方式来获取和管理…