Java通过两点经纬度和范围距离计算范围四个顶点的经纬度

2023-10-30

   参考博文:https://blog.csdn.net/zengmingen/article/details/68490497

private static final double mile = 1609.344;//米-》英里换算
//通过起点、终点的经纬度求方位角
double azimuth = gps2d(originLat, originLong, destinationLat, destinationLong);
double range = 50;//范围 单位:英里mile
double dist = (range+1)*mile;//由于计算顶点经纬度的方法存在误差,所以距离需要+1
//求范围四个顶点的经纬度
Map<String,Object> origin1 = computerThatLonLat(originLong, originLat, azimuth+90, dist);
Map<String,Object> origin2 = computerThatLonLat(originLong, originLat, azimuth-90, dist);
Map<String,Object> destination1 = computerThatLonLat(destinationLong, destinationLat, azimuth+90, dist);
Map<String,Object> destination2 = computerThatLonLat(destinationLong, destinationLat, azimuth-90, dist);
    /* 
     * 大地坐标系资料WGS-84 长半径a=6378137 短半径b=6356752.3142 扁率f=1/298.2572236 
     */  
    /** 长半径a=6378137 */  
    private static double a = 6378137;  
    /** 短半径b=6356752.3142 */  
    private static double b = 6356752.3142;  
    /** 扁率f=1/298.2572236 */  
    private static double f = 1 / 298.2572236;  
  
    /** 
     * 经纬度换成弧度 (°)  
     * @param d 度 
     * @return 弧度 
     */  
    private static double rad(double d) {  
        return d * Math.PI / 180.0;  
    } 
  
    /** 
     * 弧度换成度  
     * @param x 弧度 
     * @return 度 
     */  
    private static double deg(double x) {  
        return x * 180 / Math.PI;  
    } 
    /** 
     * 通过一个点的经纬度、距离、方位角,计算另一点经纬度
     * @param lon 经度 
     * @param lat 纬度 
     * @param lonlat 已知点经纬度 
     * @param brng 方位角 
     * @param dist 距离(米) 
     */  
    public static Map<String,Object> computerThatLonLat(double lon, double lat, double brng, double dist) {
    	Map<String,Object> map = new HashMap<String,Object>();
    	double alpha1 = rad(brng);  
        double sinAlpha1 = Math.sin(alpha1);  
        double cosAlpha1 = Math.cos(alpha1);    
        double tanU1 = (1 - f) * Math.tan(rad(lat));  
        double cosU1 = 1 / Math.sqrt((1 + tanU1 * tanU1));  
        double sinU1 = tanU1 * cosU1;  
        double sigma1 = Math.atan2(tanU1, cosAlpha1);  
        double sinAlpha = cosU1 * sinAlpha1;  
        double cosSqAlpha = 1 - sinAlpha * sinAlpha;  
        double uSq = cosSqAlpha * (a * a - b * b) / (b * b);  
        double A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)));  
        double B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));    
        double cos2SigmaM=0;  
        double sinSigma=0;  
        double cosSigma=0;  
        double sigma = dist / (b * A), sigmaP = 2 * Math.PI;  
        while (Math.abs(sigma - sigmaP) > 1e-12) {  
            cos2SigmaM = Math.cos(2 * sigma1 + sigma);  
            sinSigma = Math.sin(sigma);  
            cosSigma = Math.cos(sigma);  
            double deltaSigma = B * sinSigma * (cos2SigmaM + B / 4 * (cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM)  
                    - B / 6 * cos2SigmaM * (-3 + 4 * sinSigma * sinSigma) * (-3 + 4 * cos2SigmaM * cos2SigmaM)));  
            sigmaP = sigma;  
            sigma = dist / (b * A) + deltaSigma;  
        }  
  
        double tmp = sinU1 * sinSigma - cosU1 * cosSigma * cosAlpha1;  
        double lat2 = Math.atan2(sinU1 * cosSigma + cosU1 * sinSigma * cosAlpha1,  
                (1 - f) * Math.sqrt(sinAlpha * sinAlpha + tmp * tmp));  
        double lambda = Math.atan2(sinSigma * sinAlpha1, cosU1 * cosSigma - sinU1 * sinSigma * cosAlpha1);  
        double C = f / 16 * cosSqAlpha * (4 + f * (4 - 3 * cosSqAlpha));  
        double L = lambda - (1 - C) * f * sinAlpha  
                * (sigma + C * sinSigma * (cos2SigmaM + C * cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM)));  
  
        double revAz = Math.atan2(sinAlpha, -tmp); // final bearing  
        double new_lng = lon+deg(L);
        double new_lat = deg(lat2);
        map.put("longitude", new_lng);
        map.put("latitude", new_lat);
        return map;
    }    
    
    /**
     * 经纬度方位角计算
     * @param lat_a 起点纬度
     * @param lng_a 起点经度
     * @param lat_b 终点纬度
     * @param lng_b 终点经度
     * @return 方位角度数
     */
    public static double gps2d(double lat_a, double lng_a, double lat_b, double lng_b) {
        double d = 0;
        lat_a=lat_a*Math.PI/180;
        lng_a=lng_a*Math.PI/180;
        lat_b=lat_b*Math.PI/180;
        lng_b=lng_b*Math.PI/180;     
        d=Math.sin(lat_a)*Math.sin(lat_b)+Math.cos(lat_a)*Math.cos(lat_b)*Math.cos(lng_b-lng_a);
        d=Math.sqrt(1-d*d);
        d=Math.cos(lat_b)*Math.sin(lng_b-lng_a)/d;
        d=Math.asin(d)*180/Math.PI;
        return d;
     }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java通过两点经纬度和范围距离计算范围四个顶点的经纬度 的相关文章

  • 使用 REST API 实现属性/字段级安全

    我正在为支持多租户授权模型的 REST API 构建概念验证 该模型不仅控制用户可以访问哪些对象 还控制对象中的字段 此模型的目标是确保租户管理员只能修改其租户并且只能查看允许的对象属性 我有一个正在开发的现有代码库 可在以下位置公开获取
  • Zuul不转发请求到其他微服务

    我正在使用 Spring Boot 微服务 我已经配置了 eureka zuul 代理和另一个微服务 帐户 如果我直接从帐户拨打电话 则工作正常 帐户和 zuul 服务器都显示在 eureka 上 当我尝试使用 zuul 代理进行访问时 它
  • Java 访问被拒绝

    C Program Files x86 Java jdk1 6 0 17 bin gt javac VendingMachine java VendingMachine java 27 error while writing Vending
  • Java泛型类型要么扩展要么是父类

    我正在寻找一些如下所示的代码 public class Parent
  • 可以使用注解进行代码注入吗?

    我意识到这可能是一个已经被提出和回答的问题 但请耐心等待 我想知道是否可以使用注释将代码注入到类编译时 典型的示例是为对象的成员生成 getter 和 setter 这并不完全是我所需要的 但它可以说明基本思想 现在在互联网上我得到的基本答
  • Gradle中的build-by-convention深度解释是什么?

    The 摇篮用户指南 http www gradle org docs current userguide userguide html经常提到 Gradle 是陈述性的和用途按惯例构建 这是什么意思 据我了解 这意味着 例如 在java插
  • 我在 Android Studio 中使用哪个版本的 JDK 有关系吗?

    I know I can choose the SDK location in Android Studio s Project Structure 我有两个问题 当我们已经使用Android SDK时 为什么还需要JDK 毕竟我们不是为
  • 如何设置Java线程的CPU核心亲和力?

    我搜索了以前关于类似主题的帖子 但找不到合适的答案 因此提出这个问题 非常感谢您帮助回答 我知道在 Linux 中通过任务集命令设置进程与特定 CPU 核心的关联性 但我想设置 Java 线程与特定 cpu 核心的亲和力 以便属于同一进程的
  • 有没有办法在@Service上使用@ControllerAdvice

    我有一个项目需求 但我没有任何需求 Controller or RestController但我需要为我的服务层提供一个全局异常处理程序 所以我需要配置 ControllerAdvice on Service 请告诉我是否还有其他方法可以做
  • Bean 属性不可读或具有无效的 getter 方法

    因此 我的任务是为注册表路由编写一个简单的 Web 应用程序 使用 Spring MVC 所以我有 路线 类 我想在其中保留起点 终点和中间点列表 但我不明白如何将值从 jsp 放入列表 例如使用 jstl 所以我决定解析一个字符串 pub
  • 在同一个容器但不同的耳朵中使用本地EJB

    我正在尝试在同一个 Glassfish 但不同的耳朵中使用本地 EJB 但是Glassfish找不到本地EJB或者无法消费 我读到了这个 根据 JavaEE 教程 Local bean 的客户端 必须在与其访问的企业 bean 相同的 JV
  • Jlist 自定义渲染器

    我正在尝试添加一个我猜你会称其为列表中每个项目的子列表 我构建了一个自定义渲染器 它提供以下输出 正如你所看到的 有些东西不对劲 我没能找到问题的答案 我猜我需要更改面板布局中的某些内容才能获得正确的结果 但不知道是什么 https i s
  • 使用 GSON 将 JSON 字符串转换为 Java 对象

    我正在尝试将 json 解析为 java 根据 jsonlint com 我有以下字符串 该字符串是有效的 json private final static String LOC JSON lat1 39 737567 lat2 32 7
  • Eclipse java 断点 - 目的是什么?

    我正在学习 Android 教程 刚刚进入调试部分 我想知道断点的用途是什么 我还不能告诉 它实际上停止了应用程序 以便我可以确定它运行到该点 或者我可以设置多个断点并将它们用作标记来从断点到断点检查 停止和运行 我的代码 断点是执行停止的
  • 解析XML文件以获取所有命名空间信息

    我希望能够从给定的 XML 文件中获取所有名称空间信息 例如 如果输入 XML 文件类似于
  • Android 自定义相机 - 在矩形内裁剪图像

    我有一个自定义相机应用程序 它有一个居中的矩形视图 如下所示 当我拍照时 我想忽略矩形之外的所有内容 该视图与我的 XML 视图中的 Camera Preview 或 SurfaceView 没有任何联系 如下所示
  • 用 Java 编写“漂亮”代码的标准? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Spring MVC 和复选框

    我正在使用 Spring MVC 3 0 并且不能完全看到这个问题的所有部分 我的控制器将生成一个域对象列表 假设有一个简单的 User 对象 具有firstName lastName age 和role 属性 我想在表中输出该用户列表 每
  • 将菜单添加到空活动

    我在 Android Studio 中制作了一个 Android 应用程序 并想在其上创建一个选项菜单 我将其创建为一个空活动 现在意识到我最好创建一个空白活动来获取选项菜单 无论如何 是否可以在空活动中创建选项菜单 如果有人能给我指出一个
  • 寻找基于循环固定大小数组的双端队列

    我正在寻找一个Deque其具有以下特点 它有固定的大小 如果我在头 尾添加元素 则另一端的元素会丢失 它是基于数组的 所以我可以在恒定时间内访问随机元素 我可以在前面或末尾添加元素 双端队列 我检查了Deque的实施JCF但我没有找到任何合

随机推荐

  • PowerMock(一):PowerMock的基本使用

    文章目录 为啥要使用PowerMock PowerMock的使用 环境 引入依赖 注解说明 mock普通方法 mock抛出异常 mock新建对象 mock无返回值的方法 mock被final修饰的方法 参数模糊匹配 mock静态方法 moc
  • 下载安装office2019

    Hello 大家好 我是小喵 支付宝搜索 321994 领红包喽 前几天答应给大家写一篇关于安装激活Office2019的文章 一直在准备 准备制作GIF动图 制作图片等 把我电脑上的Office反复安装卸载 折腾的不像样子 终于 功夫不负
  • 在B端供应链上,看见企业增长的「密码」

    在被疫情重塑的B端市场里 在这个新的产业互联时代 发展的新答案到底是什么 作者 皮爷 出品 产业家 2022年中秋节 一款特殊的牛奶让伊利再次在B端市场破圈 在人们司空见惯的牛奶包装上 青花瓷的样本图案清晰可见 典雅大气 蓝白相间之中充斥着
  • [学C日记]---循环

    1 计算 n的阶乘 调用阶乘函数 三种循环 1 计算阶乘 int main int n 0 int m 0 scanf d n m jiecheng n printf d n m system pause return 0 int jiec
  • wsl 固定ip 方法 一劳永逸

    目前网上有很多办法 有用host 有修改bash的 非常多 也非常麻烦 目前发现这种方法最为简单 添加一个开机启动项 配置一个netsh 1 准备一个vbs 并添加到开机启动项 Set ws WScript CreateObject WSc
  • 更改内存频率导致电脑用不了怎么解决?

    目录 台式机 解决办法 笔记本 解决办法 电脑能开机 显示器指示灯闪烁但就是不亮显示器 主要问题是内存 内存超频不能超过本身内存卡的极限 至于内存卡的极限在哪里 你可以上网查一下你的内存卡的信息 超过了极限基本上一改电脑就跟死机差不多 运行
  • 2022国赛17:打印服务

    大赛试题内容 七 打印服务 任务描述 为了提高打印服务效率 节省成本 请采用共享打印服 务 实现共享打印的安全性 1 在 windows4 上安装打印机 驱动程序为 MS Publisher Color Printer 名称和共享名称均为
  • 排序算法(6)----计数排序

    不知道为什么 突然编辑器不支持颜色丰富的intellij IDEA直接复制了 博主有点沮丧 因此我先用图片的形式展示并分析 然后在最后会将全部代码呈上 排序思想 在一个数组中 对于每一个数据 都统计有多少个数字小于它 就能反应出它当前所在的
  • Centos 7开机菜单设置

    Centos 7的开机菜单设置主要是能过 etc grub2 cfg etc grub2 cfg gt boot grub2 grub cfg timeout 5 为等待用户选择时间 当5秒钟没有选择 系统会启动默认的菜单 与centos
  • 基于阿里云服务器+wordpress构建自己的网站(全过程系列,无需任何编程知识)

    1 阿里云服务器配置 既然是基于阿里云服务器 那么当然是先得申请一个阿里云服务器 本博客使用的服务器是云服务器ECS 共享计算型 n4系列 阿里云对新用户有很多优惠活动 这个是我当时花了69块钱买了一年 又通过某个渠道 返了60块钱 相当于
  • 数学建模美赛E、F题备考策略(自用,大部分复制粘贴)

    这里要讲一下故事的背景 我们小组三个人都是大一大二的学生 我的队友们都是数学专业的学生 所以比赛中的编程部分就交给了我这样的工业工程系的选手 我们在看完了历年赛题后一直认为 前面的几题我们都很难建立出很棒的模型 因此我们将目光对准E F两题
  • 为什么 Redis 中的事物很玄学,没人使用 ?

    1 为什么不使用 Redis 中的事物 Redis 中的事物是 弱事物 它在操作的时候 是将多个命令全部加入到事物队列中 然后通过 exec 命令一次性执行所有命令 这样做的好处是可以减少网络往返的次数 提高效率 它的使用示例如下 Redi
  • 输入英文有空格 解决方法

    shift 空格 直接搞定
  • Uniform convergence

    In the mathematical field of analysis uniform convergence is a mode of convergence of functions stronger than pointwise
  • vue3 + elementplus 教程

    一 初始化 安装 vue cli g 全局安装 vue cli npm install vue cli g 或者 yarn global add vue cli 二 创建项目 vue create 项目名 进行项目初始化 D workspa
  • C# JSON 常用方法 - Json字符串转对象

    创建项目 ConsoleApplication Json 选择项目右键管理NuGet程序包 搜索Newtonsoft Json 并下载安装 选择项目添加 JsonHelper cs 添加引用 using Newtonsoft Json 编写
  • [893]推荐几款提高体验与效率的Chrome插件神器

    今天推荐几款好用的 Chrome 插件 都是我自己一直在用的插件 可以到 Chrome 商店下载 话不多说 进入主题 Insight io For Github 如图 就像这样 可以以文件树的方式浏览 github 的代码文件 Toggle
  • 【注册机】JCreator Pro v4.50.010 注册机

    下载地址 http oyksoft oyksoft com oyksoft com JCreator Pro v4 50 010 Keygen Only HAZE rar
  • OpenCV均值、中值滤波器的讲解及实战应用(附Python源码)

    需要源码和图片请点赞关注收藏后评论区留言私信 在尽量保留原图像信息的情况下 去除图像内噪声 降低细节层次信息等一系列过程 叫作图像的平滑处理 或图像的模糊处理 实现平滑处理最常用的工具就是滤波器 通过调节滤波器的参数 可以控制图像的平滑程度
  • Java通过两点经纬度和范围距离计算范围四个顶点的经纬度

    参考博文 https blog csdn net zengmingen article details 68490497 private static final double mile 1609 344 米 英里换算 通过起点 终点的经纬