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;
    }

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【老文新发】Otsu大津法详解及python实现

原文&#xff1a;A Threshold Selection Method from Gray-Level Histograms A Fast Algorithm for Multilevel Thresholding 前言 大津法包含两个重要的概念&#xff1a;类间方差&#xff08;between-class variance&#xff09;和类内方差&#xff08;within-class varianc…

opencv-图像轮廓

轮廓可以简单认为成将连续的点&#xff08;连着边界&#xff09;连在一起的曲线&#xff0c;具有相同的颜色或者灰度。轮廓在形状分析和物体的检测和识别中很有用。 • 为了更加准确&#xff0c;要使用二值化图像。在寻找轮廓之前&#xff0c;要进行阈值化处理或者 Canny 边界检…

虹科分享 | 平衡速度与优先级:为多样化的实时需求打造嵌入式网络(3)——CAN与CANopen的实时能力与局限性

在回顾了选择具有实时能力的嵌入式通信系统的基本要求之后&#xff0c;我们现在将更详细地探讨CAN和CANopen的实时能力和局限性。 控制器局域网(CAN)协议是各个行业众多应用的基础&#xff0c;每个应用都有其独特的实时需求。CANopen和J1939等著名示例强调了该协议的多种适应性…

Python---变量的作用域

变量作用域&#xff1a;指的是变量的作用范围&#xff08;变量在哪里可用&#xff0c;在哪里不可用&#xff09;&#xff0c;主要分为两类&#xff1a;局部变量和全局变量。 定义在函数外部的变量就称之为全局变量&#xff1b; 定义在函数内部的变量就称之为局部变量。 # 定义…

麒麟v10系统,在虚拟机上直接连公司同一个局域网,设置静态ip

1.更改配置信息 cd /etc/sysconfig/network-scripts vi ifcfg-ens33 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic DEFROUTEyes IPV4_FAILURE_FATALno IPV6INITyes IPV6_AUTOCONFyes IPV6_DEFROUTEyes IPV6_FAILURE_FATALno IPV6_ADDR_GEN_MODEstable-pri…

小米智能摄像机云台版pro 拆解教程

拆解原因 因为设备提示无内存卡&#xff0c;摄像头手动调整方向到最上面&#xff0c;就可以看到内存卡插槽 但是这个摄像头因为内存卡弹出来了&#xff0c;导致无法插入也无法取出&#xff0c;所以决定拆开重新安装 第一步&#xff0c;拆开后即可拔出底座&#xff0c;拔掉摄像…

Vuetify:定制化、响应式的 Vue UI 库 | 开源日报 No.83

vuetifyjs/vuetify Stars: 38.1k License: MIT Vuetify 是一个无需设计技能的 UI 库&#xff0c;具有精美手工制作的 Vue 组件。它具有以下核心优势和主要功能&#xff1a; 可定制性&#xff1a;使用 SASS/SCSS 进行广泛自定义&#xff0c;并提供默认配置和蓝图。响应式布局&…

2023年中国合成云母行业现状及市场格局分析[图]

合成云母是一种通过化工原料经高温熔融冷却析晶而制得的单斜晶系矿物&#xff0c;属于典型的层状硅酸盐&#xff0c;许多性能都优于天然云母&#xff0c;如合成云母的耐温高达1200℃以上&#xff0c;而天然白云母在550℃下就会开始分解&#xff0c;金云母则在800℃开始分解。除…

Python中使用requests库遇到的问题及解决方案

目录 一、引言 二、问题1&#xff1a;无法导入requests库 三、问题2&#xff1a;请求超时 四、问题3&#xff1a;无法处理重定向 五、问题4&#xff1a;无法处理Cookies 六、问题5&#xff1a;无法上传文件 七、问题6&#xff1a;无法处理HTTPS请求 八、问题7&#xff…

振南技术干货集:制冷设备大型IoT监测项目研发纪实(4)

注解目录 1.制冷设备的监测迫在眉睫 1.1 冷食的利润贡献 1.2 冷设监测系统的困难 &#xff08;制冷设备对于便利店为何如何重要&#xff1f;了解一下你所不知道的便利店和新零售行业。关于电力线载波通信的论战。&#xff09; 2、电路设计 2.1 防护电路 2.1.1 强电防护 …

【UE】线框材质

一、方式1 新建一个材质&#xff0c;混合模式设置为“已遮罩”&#xff0c;勾选“双面” 勾选“线框” 然后可以随便给一个自发光颜色&#xff0c;这样最基本的线框材质就完成了 二、方式2 新建一个材质&#xff0c;混合模式设置为“已遮罩”&#xff0c;勾选“双面”&#x…

Linux学习第44天:Linux 多点电容触摸屏实验(二):难忘记第一次牵你手的温存

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本章的思维导图内容如下&#xff1a; 二、硬件原理图分析 三、实验程序编写 1、修改设备树 1&#xff09;、添加FT5426所使用的IO 一个复位 IO、一个中断 IO、…

Git本地库操作

对本地库的操作很少&#xff0c;我们学习1~6节即可&#xff0c;其他了解下。我们可以在idea中完成对本地库还有远程库的操作&#xff0c;可视化界面用起来更加舒适而且也不会混淆。 1. Git概述 Git 是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小…

技术为业务赋能:深度剖析开发与业务的紧密结合

技术为业务赋能&#xff1a;深度剖析开发与业务的紧密结合 很多做开发的同学有一种认知&#xff0c;技术最牛&#xff0c;进而忽视了对业务的理解和积累&#xff0c;眼里认为技术和游戏一样&#xff0c;有着层出不穷的新技术&#xff0c;更新迭代的非常快&#xff0c;而业务方…

【考研】数据结构(更新到双链表)

声明&#xff1a;所有代码都可以运行&#xff0c;可以直接粘贴运行&#xff08;只有库函数没有声明&#xff09; 线性表的定义和基本操作 基本操作 定义 静态&#xff1a; #include<stdio.h> #include<stdlib.h>#define MaxSize 10//静态 typedef struct{int d…

NEJM一篇新文为例,聊聊孟德尔随机化研究mr

2019年3月14日&#xff0c;新英格兰医学杂志发表了一篇论著&#xff0c;Mendelian Randomization Study of ACLY and Cardiovascular disease, 即《ACLY和心血管疾病的孟德尔随机化研究》。与小咖在2017年1月9日报道的一篇发表在新英格兰医学的孟德尔随机化研究——精读NEJM&am…

2023年中国工业炉分类、产量及市场规模分析[图]

工业炉是指在工业生产中利用燃料燃烧或电能等转换产生的热量&#xff0c;将物料或工件进行熔炼、熔化、焙&#xff08;煅&#xff09;烧、加热、干馏、气化等的热工设备&#xff1b;广泛应用于机械、冶金、化工及陶瓷等国民经济的各行各业&#xff0c;具有生产效率高、产品质量…

又3本“On Hold”期刊被剔除!这本Elsevier旗下中科院2区TOP仍在调查中!

【SciencePub学术】 此前&#xff0c;继又2本期刊被“On Hold”&#xff01;标识后&#xff0c;仍处于“On Hold”状态的期刊有8本&#xff0c;其中包括4本SCI期刊和4本ESCI期刊。 2023年11月20日&#xff0c;科睿唯安更新了Web of Science核心期刊目录。 本次11月更新共64本期…

向量数据库,展望AGI时代

无论是向量数据库&#xff0c;还是大模型&#xff0c;归根结底&#xff0c;大家在追捧它时的心态&#xff0c;焦虑大于需求。 向量数据库的热潮&#xff0c;在一定程度上“外化”了人们的焦虑。 但这并不能否定向量数据库的实际价值&#xff0c;甚至更长远来看&#xff0c;向…