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

news2024/10/3 0:20:52

准备:
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.coloradmin.cn/o/1241157.html

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

相关文章

小黑子—Maven高级

Maven高级篇 二 小黑子的Maven高级篇学习1. 分模块开发1.1 分模块开发设计1.2 分模块开发实现1.2.1 抽取domain层1.2.2 抽取dao层 2. 依赖管理2.1 依赖传递2.2 可选依赖2.3 排除依赖 3. 继承与聚合3.1 聚合3.2 继承3.3 总结 4. 属性4.1 配置文件加载属性4.2 版本管理 5. 多环境…

浅谈JDK动态代理(上)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 到目前为止&#xff0c…

Java面向对象(高级)-- 类中属性赋值的位置及过程

文章目录 一、赋值顺序&#xff08;1&#xff09;赋值的位置及顺序&#xff08;2&#xff09;举例&#xff08;3&#xff09;字节码文件&#xff08;4&#xff09;进一步探索&#xff08;5&#xff09;最终赋值顺序&#xff08;6&#xff09;实际开发如何选 二、(超纲)关于字节…

梦开始的地方——Adobe Premiere Pro

今天&#xff0c;我们来说说一款老生常谈的相信也是很多人都经常迫切需要的软件。Adobe Premiere Pro&#xff0c;简称Pr&#xff0c;是由Adobe公司开发的一款视频编辑软件。 Premiere Pro是视频编辑爱好者和专业人士必不可少的视频编辑工具。它可以提升您的创作能力和创作自由…

Element中el-table组件右侧空白隐藏-滚动条

开发情况&#xff1a; 固定table高度时&#xff0c;出现滚动条&#xff0c;我们希望隐藏滚动条&#xff0c;或修改滚动条样式&#xff0c;出现table右边出现15px 的固定留白。 代码示例 <el-table class"controlTable" header-row-class-name"controlHead…

httpd(Web服务器)

名词解释 1、URL&#xff1a;Uniform Resource Locator&#xff0c;统⼀资源定位符 2、⽹址格式&#xff1a;<协议>://<主机或主机名>[:port]/<⽬录资源,路径> 3、主机地址/主机名&#xff1a;主机地址是服务器在因特⽹所在的IP地址。主机名就需要域名解析…

arduino入门一:点亮第一个led

void setup() { pinMode(12, OUTPUT);//12引脚设置为输出模式 } void loop() { digitalWrite(12, HIGH);//设置12引脚为高电平 delay(1000);//延迟1000毫秒&#xff08;1秒&#xff09; digitalWrite(12, LOW);//设置12引脚为低电平 delay(1000); }

【正则插件】前端正则插件以及预览插件推荐

1&#xff09; 2&#xff09; any-rule Pegex Previewer 下载好插件之后 在代码层右键选择 选择你需要的正则表达式&#xff0c;随后可以使用第二个插件 正则表达式插入之后顶部会有 Test Regex.. 点击会出现以下内容 将他 ctrl a 删除&#xff0c;输入你对应的正则表达…

HarmonyOS ArkTS HTTP数据请求(九)

1 概述 日常生活中我们使用应用程序看新闻、发送消息等&#xff0c;都需要连接到互联网&#xff0c;从服务端获取数据。例如&#xff0c;新闻应用可以从新闻服务器中获取最新的热点新闻&#xff0c;从而给用户打造更加丰富、更加实用的体验。 那么要实现这样一种能实时从服务…

Qt全球峰会2023中国站 参会概要

Qt全球峰会2023中国站 参会概要 前言峰会议程签到 & Demo 演示开场致辞Qt Group 产品总监演讲&#xff08;产品开发的趋势-开放的软件、工具和框架&#xff09;产品战略QtQuick or QtWidgets&#xff08;c or qml&#xff09;Qt如何定义AI个人看法 Qt 在券商数字化转型和信…

fseek 写操作定位无效问题

1、 fseek 代码中明明使用了fseek定位到行首。 fseek(p, 0, SEEK_SET); 但是写的内容&#xff0c;仍然添加到文件尾。 最后发现是fopen时&#xff0c;出现问题。 r 打开只读文件&#xff0c;该文件必须存在。 r 打开可读写的文件&#xff0c;该文件必须存在。 w 打开只写文…

配电房智能综合监控系统

配电房智能综合监控系统是一种针对配电房环境和设备进行实时监控和管理的系统。依托电易云-智慧电力物联网&#xff0c;它集成了多种先进技术&#xff0c;如物联网、大数据、AI视频智能分析等&#xff0c;实现对配电房全方位、智能化的监控和管理。 这个系统的主要功能可能包括…

12英寸双轴半自动划片机:颠覆传统划切工艺的五大优势

随着科技的飞速发展&#xff0c;半导体行业对精密划切设备的需求日益增长。在这篇文章中&#xff0c;我们将深入探讨12英寸双轴半自动划片机的优势&#xff0c;这种划片机在半导体制造过程中扮演着至关重要的角色。以下是这种划片机的五大优势。 一、高精度划切 12英寸双轴半自…

ABAP调用Https接口 Ssl证书导入

ABAP调用Https接口 Ssl证书导入 一、证书导入 谷歌浏览器打开对方系统URL地址&#xff0c;下载SSL Server certificate,步骤如下&#xff1a; 浏览器打开要导出certificate(证书)的网站&#xff0c;点击这个小锁的图标&#xff1a; 点击连接是安全的后面小播放按钮 点击证…

【深度学习】参数优化和训练技巧

寻找合适的学习率(learning rate) 学习率是一个非常非常重要的超参数&#xff0c;这个参数呢&#xff0c;面对不同规模、不同batch-size、不同优化方式、不同数据集&#xff0c;其最合适的值都是不确定的&#xff0c;我们无法光凭经验来准确地确定lr的值&#xff0c;我们唯一可…

22LLMSecEval数据集及其在评估大模型代码安全中的应用:GPT3和Codex根据LLMSecEval的提示生成代码和代码补全,CodeQL进行安全评估

LLMSecEval: A Dataset of Natural Language Prompts for Security Evaluations 写在最前面主要工作 课堂讨论大模型和密码方向&#xff08;没做&#xff0c;只是一个idea&#xff09; 相关研究提示集目标NL提示的建立NL提示的建立流程 数据集数据集分析 存在的问题 写在最前面…

编码的发展历史

编码的发展历史 ASCII&#xff1a; ASCII编码使用7位二进制数表示一个字符&#xff0c;范围从0到127。每个字符都有一个唯一的ASCII码值与之对应。例如&#xff0c;大写字母"A"的ASCII码是65&#xff0c;小写字母"a"的ASCII码是97。 ASCII字符集包括英文…

2023年亚太赛C题目保姆级思路代码 新能源电动汽车的发展趋势

2023年亚太赛已于23号上午6点正式开启&#xff01;本次题目难度主要在于数据都没给&#xff0c;需要进行数据收集和处理&#xff0c;总的难度看起来是C<B<A,本次我也将持续更新每道题目的思路&#xff0c; 大家也可以关注B站实时观看思路进度哦&#xff01; 不知名数学…

大数据湖及应用平台建设解决方案:PPT全39页,附下载

关键词&#xff1a;大数据湖建设&#xff0c;集团大数据湖&#xff0c;大数据湖仓一体&#xff0c;大数据湖建设解决方案 一、大数据湖定义 大数据湖是一个集中式存储和处理大量数据的平台&#xff0c;主要包括存储层、处理层、分析层和应用层四个部分。 1、存储层&#xff…

NX二次开发UF_CAM_set_clear_plane_data 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CAM_set_clear_plane_data Defined in: uf_cam_planes.h int UF_CAM_set_clear_plane_data(tag_t object_tag, double origin [ 3 ] , double normal [ 3 ] ) overview 概述 De…