问题背景:自己在使用高德地图时没有发现通过已知点经纬度,角度,距离计算另一点经纬度的方法,所以只好自己实现了。查询之后发现国内的博客基本都是计算两点距离,计算点到线距离的距离等,有几篇也都是C语言形式,这里自己写一下,以作记录。
文章参考文档:
谷歌讨论版关于这个问题的问答
具体函数的网页

具体实现

需求

通过已知点的经纬度,相对角度,距离计算另一点的经纬度

实现逻辑

注意:所有这些形式都是基于球形地球的计算(忽略椭球效应) - 这对于大多数目的而言足够准确 [事实上,地球是非常略微椭圆形的; 使用球形模型时,误差通常高达0.3%
如果需要精确,那么可能这个方法不适用
*

需要参数

  1. 起始点位置经纬度,十进制;double longitude,double latitude
  2. 距离(单位千米);double distance
  3. 角度从正北方开始到目标点的角度;double angle

公式

纬度:φ2 = asin( sin φ1 ⋅ cos δ + cos φ1 ⋅ sin δ ⋅ cos θ )
经度:λ2 = λ1 + atan2( sin θ ⋅ sin δ ⋅ cos φ1, cos δ − sin φ1 ⋅ sin φ2 )
以上公式中的经纬度都需要转换成弧度radian

  1. λ2结果经度
  2. λ1起始经度
  3. φ2结果纬度
  4. φ1结果纬度
  5. θ角度,从北方顺时针方向
  6. R地球半径
  7. δ表示角距离,即d/R
  8. d距离(km)

带入数据,可以得到方法

/** 地球半径 **/private static final double R = 6371e3;/** 180° **/private static final DecimalFormat df = new DecimalFormat("0.000000");/*** 根据一点的坐标与距离,以及方向,计算另外一点的位置* @param angle 角度,从正北顺时针方向开始计算* @param startLong 起始点经度* @param startLat 起始点纬度* @param distance 距离,单位m* @return*/public static String[] calLocationByDistanceAndLocationAndDirection(double angle, double startLong,double startLat, double distance){String[] result = new String[2];//将距离转换成经度的计算公式double δ = distance/R;// 转换为radian,否则结果会不正确angle = Math.toRadians(angle);startLong = Math.toRadians(startLong);startLat = Math.toRadians(startLat);double lat = Math.asin(Math.sin(startLat)*Math.cos(δ)+Math.cos(startLat)*Math.sin(δ)*Math.cos(angle));double lon = startLong + Math.atan2(Math.sin(angle)*Math.sin(δ)*Math.cos(startLat),Math.cos(δ)-Math.sin(startLat)*Math.sin(lat));// 转为正常的10进制经纬度lon = Math.toDegrees(lon);lat = Math.toDegrees(lat);result[0] = df.format(lon);result[1] = df.format(lat);return result;}public static void main(String[] args) {String[] result = calLocationByDistanceAndLocationAndDirection(0,119.010212,32.147982, 100);String[] result2 = calLocationByDistanceAndLocationAndDirection(90,119.010212,32.147982, 100);String[] result3 = calLocationByDistanceAndLocationAndDirection(180,119.010212,32.147982, 100);System.out.print(result[0]+",");System.out.println(result[1]);System.out.print(result2[0]+",");System.out.println(result2[1]);System.out.print(result3[0]+",");System.out.println(result3[1]);}


这里当然有一些误差,但是因为此项目仅需要大概位置,所以仅需要做到这一步就可以了,如果需要十分精确的话可能需要现在平面坐标系中计算后再转换为经纬度坐标?这里先不做讨论,如果以后需要,再做补充。
如果文中存在错误,希望各位大佬斧正,感谢!

Java 通过已知点的经纬度,相对角度,距离计算另一点的经纬度相关推荐

  1. 已知基点的经纬度,根据方位角和运动距离求另外一点的经纬度

    1. 已知基点的经纬度,根据方位角和运动距离求另外一点的经纬度 1.1 需求概述及图解 假设方位角是α, 那从点1到点2的平移距离分别如下所示dsinα, dcosα. 这里正北为0度.已知基点(点1 ...

  2. 【已知一点经纬度和距离,计算另一点的经纬度】

    根据一点经纬度和距离,计算另一点的经纬度 计算代码 推理过程 计算推导 计算摄像头到目标检测点得距离d,详见: https://blog.csdn.net/qq_41694461/article/de ...

  3. 已知某个班有 30 个学生,学习 5 门课程,已知所有学生的各科成绩。计算每个学生的平均成绩,并输出

    已知某个班有 30 个学生,学习 5 门课程,已知所有学生的各科成绩.计算每个学生的平均成绩,并输出 注意: 定义一个二维数组 A,用于存放 30 个学生的 5 门成绩. 定义一个一维数组 B,用 于 ...

  4. 小程序转盘抽奖,已知圆心、半径、角度求圆上点的坐标

    因公司的需求,要在小程序语音房内部迭代一个真心话大冒险的功能,也等同于幸运转盘: 业务场景: 发送一个socket,拿到响应的结果,根据返回的数值开始启动幸运转盘,由于转盘上的人数不是固定的,所以要根 ...

  5. 已知一点经纬度和距离,计算另一点的经纬度

    因为有需求,在知道一点经纬度和距离的情况下,需要知道另一点的经纬度. 之前在网上也有查找,也有不少的案例,但是多数都是语焉不详,看不太明白.后来自己整理和重新再思考了下,这里给出一个自认为说得还算比较 ...

  6. Java学习——已知有六个数字1,2,3,4,5,6 在要求将这六个数字中所有的组合存放到数组中 (1)必须是6位数 (2)每个位置上的数不能重复

    这个题目,最笨的方法就是循环套循环 1,让每一层都输出1到6的数字,6层循环,就能得到6个1~6的数字 2,然后再给他们单行输出,就能拿到类似于123456 456123......的数字 3,再让他 ...

  7. java 从已知日期计算干支纪日_天干地支纪日纪时计算公式

    年:每个干支为一年,六十个干后,又从头算起,周而复始,循环不息.由甲子开始,满六十年称做一甲子或一花甲子.称为干支纪年法. 月:正月是由寅开始,每个月的地支固定不变,然后依次与天干组合:由第一年的正月 ...

  8. java 从已知日期计算干支纪日_天干地支纪日怎么计算?

    年:每个干支为一年,六十个干后,又从头算起,周而复始,循环不息.由甲子开始,满六十年称做一甲子或一花甲子.称为干支纪年法.月:正月是由寅开始,每个月的地支固定不变,然后依次与天干组合:由第一年的正月丙 ...

  9. java 从已知日期计算干支纪日_干支纪日在线换算(干支纪日从何时开始)

    如果纪日法算干支的时候公式没有余数,应该怎么算? ▲天干地支纪年与公历的近似换算 从已知的公历年份计算干支纪年:年份数减3,除以10的余数是天干,除以12的余数是地支.(公元前的年份则用58-&quo ...

最新文章

  1. 【Java】多线程编程(并发编程)基础(上)
  2. 深度学习时代,调包侠没有未来,但是这个“包”有
  3. SQL Server基础
  4. 微信小程序获取不到unionid还有小程序无法解析JSON字符串的问题
  5. PHP $_REQUEST获取表单提交的代码
  6. git配置远程仓库,同时配置github、gitee、gitlab,完美解决方案
  7. Mybaits-plus实战(二)
  8. 正则表达式【第二卷】
  9. springboot yml对于list列表配置方式
  10. Linux环境中MySQL主从同步--添加新的从库
  11. 2. Rust的三板斧 安全,迅速,并发
  12. Flutter格式化电话号码
  13. android远程连接windows,用微软的安卓远程桌面连接电脑没有声音
  14. 【IVI】5. [Android Automotive]音频多区
  15. 【-O1-O2-O3-Ofast...】C/C++编译器代码优化原理方案
  16. 计算机类高级工程师职称评审
  17. WPF UnhandledException
  18. 攻防世界reverse进阶easyre-153 writeup(#gdb调试父子进程、#ida版本差异)
  19. MySQL_11_范式优化
  20. 海康威视网络摄像头配置本地存储服务器(远程连接查看回放)

热门文章

  1. c语言编写银行业务模拟程序,C语言数据结构实现银行模拟
  2. NLP系列经典论文(1)-- Attention Is All You Need
  3. 【力扣周赛】第345场周赛
  4. linux配置环境变量,及PATH=$PATH中的PATH是什么意思和有些地方说的$PATH可以跟前或者跟后的原因
  5. Vue开发入门(二) | 说说Vue全家桶有哪些~
  6. 二进制转化为十进制数字的代码
  7. 关于在ICEM中导入CAD几何模型文件的问题
  8. 物联网硬件模拟软件 MqttEmu
  9. 计算机教师面试万能稿,教资面试——信息技术试讲逐字稿
  10. 网络通信上手项目(网络画图板)