火车地图搞了有半年了,在做火车地图的过程中,遇到了一个问题,就是由于火车站点的地理坐标是直接请求api拿到的,部分api返回的结果可能千差万别。所以我需要一个方法,来在地图显示的过程中,判断出某个站点的坐标有误,并上报到服务器端,从而便于我的修正。一个典型的站点错误如下面这张图片所示:

我最开始的思路是计算站点之间的距离,然后根据两站点之间的到站时间算出速度,如果超出某个值,比如300km/h,就判断该站点中有错误。

但是这种方法适用于坐标差出去比较多的站点,对于坐标差别比较少的站点就无能为力了,所以接下来,我要提到第二种方法,就是计算站点夹角的方法。

从上图可以看出,错误的站点会形成一个很小的锐角,如果我们能计算出这个锐角的大小,问题就解决了。

那么问题可以描述如下:

有3个站点坐标P1,P2,P3,求角⦣P1P2P3的大小。

问题很简单,解出来不容易,因为高中所学的功夫,由于很长时间没有使用,基本已经忘完了。好在有搜索引擎,一番搜索之后,终于找到了一个方案,计算夹角可以分为下面两步:

  1. 将经纬度转换成笛卡尔坐标系下的值
  2. 利用向量求夹角
    θ=acos(v1⋅v2/||v1||||v2||)

代码如下:

// lat,lng为弧度表示的经纬度,r为地球半径,由于是算夹角,r是多少不重要
function ball2xyz(lat, lng, r = 6400) {return {x: r * Math.cos(lat) * Math.cos(lng),y: r * Math.cos(lat) * Math.sin(lng),z: r * Math.sin(lat)};
}
// https://blog.csdn.net/reborn_lee/article/details/82497577
// 将地理经纬度转换成笛卡尔坐标系
function geo2xyz({ lat, lng }) {let thera = (Math.PI * lat) / 180;let fie = (Math.PI * lng) / 180;return ball2xyz(thera, fie);
}// 计算3个地理坐标点之间的夹角
function angleOflocation(l1, l2, l3) {let p1 = geo2xyz(l1);let p2 = geo2xyz(l2);let p3 = geo2xyz(l3);let { x: x1, y: y1, z: z1 } = p1;let { x: x2, y: y2, z: z2 } = p2;let { x: x3, y: y3, z: z3 } = p3;// 计算向量 P2P1 和 P2P3 的夹角 https://www.zybang.com/question/3379a30c0dd3041b3ef966803f0bf758.htmllet _P1P2 = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2 + (z2 - z1) ** 2);let _P2P3 = Math.sqrt((x3 - x2) ** 2 + (y3 - y2) ** 2 + (z3 - z2) ** 2);let P = (x1 - x2) * (x3 - x2) + (y1 - y2) * (y3 - y2) + (z1 - z2) * (z3 - z2); //P2P1*P2P3return (Math.acos(P / (_P1P2 * _P2P3)) / Math.PI) * 180;
}console.log(angleOflocation({ lat: "40.80072", lng: "124.459351" },{ lat: "40.64016", lng: "124.314117" },{ lat: "40.876438", lng: "124.581062" })
);console.log(angleOflocation({ lat: "40.823978", lng: "124.639313" }, // 龙爪沟{ lat: "40.71986", lng: "124.78175" }, // 宽甸{ lat: "40.484791", lng: "124.81823" } // 永甸)
);

转载于:https://www.cnblogs.com/imgss/p/10707150.html

计算3个地理坐标点之间的夹角相关推荐

  1. 计算时针与分针之间的夹角

    计算时针和分针之间的夹角 题目 思路 代码 题目 输入小时和分数,计算两哥指针之间的夹角度数! 思路 每一分钟,时针走过的角度是 360/12/60=0.5;分钟走过的角度是 360/60=6. 看谁 ...

  2. java 角度计算_java计算时针和分针之间的夹角

    //计算时针和分针之间的夹角 import java.lang.Math; public class ClockAngle { public static void main(String[] arg ...

  3. c++计算两个三维向量之间的夹角

    计算p1p0与p2p0之间的夹角,结果返回 0 至 π 之间的计算结果,单位为弧度,在函数库中角度均以弧度来表示 //计算角度Pnt3 p1p0 = p1p2[0].Co3d() - p0.Co3d( ...

  4. 利用SQL计算两个地理坐标(经纬度)之间的地表距离

    两个地理坐标(经纬度)地表距离计算公式: 公式解释如下: Long1,Lat1表示A点经纬度,Long2,Lat2表示B点经纬度: a=Lat1–Lat2 为两点纬度之差,b=Long1-Long2为 ...

  5. Python 计算任意两向量之间的夹角

    如图所示,我们要计算任意两个向量之间的夹角. (图中的坐标数字是估计值,随手给定) python代码如下 import math AB = [1,-3,5,-1] CD = [4,1,4.5,4.5] ...

  6. 两个向量之间的夹角公式_Python 计算任意两向量之间的夹角方法

    如图所示,我们要计算任意两个向量之间的夹角. (图中的坐标数字是估计值,随手给定) python代码如下 import math AB = [1,-3,5,-1] CD = [4,1,4.5,4.5] ...

  7. 计算两坐标点球面距离、两向量夹角及多边形面积

    计算两个坐标点之间的球面距离 def calcDistance(t1, t2):'''计算两个坐标点之间的球面距离Parameters----------t1: A点坐标[lat,Lon]t2: B点 ...

  8. c++ 用 eigen与opencv计算两个向量的夹角,两个向量之间的夹角,向量的朝向

    计算两个向量的夹角,两个向量之间的夹角 eigen: #include "Eigen/Dense" #include "Eigen/Geometry" usin ...

  9. Python计算向量夹角代码:如何用代码计算两个向量之间的夹角?

    Python计算向量夹角代码:如何用代码计算两个向量之间的夹角? 向量夹角是指两个向量之间的夹角,通常用cosine来表示.在机器学习和数据科学领域,计算向量夹角是一个非常基本的概念.Python是一 ...

最新文章

  1. linux sort命令
  2. 视频专辑:Hibernate 视频
  3. word公式编号怎么右对齐_8个能帮你大忙的Word技巧,建议花几分钟学起来!
  4. ffmpeg调用directshow camera 并sdl渲染
  5. 系统科学专业 计算机,2018年北京市培养单位数学与系统科学研究院863计算机学科综合(专业)之计算机操作系统考研核心题库...
  6. 反编译那些事儿(一)
  7. 16QAM调制解调和误码率
  8. Tera term的TTL脚本使用方法
  9. 【Python 基础篇】Python代码 之 三目表达式总结
  10. 讲解:微信内直接打开第三方app
  11. VirtualBox虚拟机安装Windows XP
  12. ps动作储存覆盖原文件的原因
  13. 百度快照劫持代码的更新
  14. questasim仿真优化加速问题(object无信号,无法看波形,(vsim-12110) All optimizations are disabled,error loading design)
  15. Unity Profiler
  16. 华住有效承接环球影城开业客流;Collinson科领盛任命戴旻Colin Dai为中国区总经理 | 全球旅报...
  17. 万物互联时代,oasis助力数据存储保护
  18. 方舟服务器最新,方舟生存进化新恐龙新服务器 手机版近期更新内容一览
  19. echarts渐变进度条
  20. 揭秘华为标准岗位工资(天涯)

热门文章

  1. Photoshop | 快速抠头发(调整边缘/选择并遮住)
  2. 彩虹代刷网免授权+精美WAP端源码
  3. 论文投稿指南——中国(中文EI)期刊推荐(第5期)
  4. php无法访问_php突然不能访问的原因
  5. php gif 透明背景,php缩放gif和png图透明背景变成黑色的解决方法,缩放png_PHP教程...
  6. Excel学习日记:L8-工作表的设定与多个工作表合并计算
  7. selenium防爬无头浏览器和模拟手机浏览器
  8. C语言——三目运算符的进阶用法,比较三个或者四个数的大小
  9. 狄利克雷卷积_狄利克雷卷积莫比乌斯反演总结
  10. 适合前端学习的几个网站