计算3个地理坐标点之间的夹角
生活随笔
收集整理的這篇文章主要介紹了
计算3个地理坐标点之间的夹角
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
火車地圖搞了有半年了,在做火車地圖的過程中,遇到了一個問題,就是由于火車站點的地理坐標是直接請求api拿到的,部分api返回的結果可能千差萬別。所以我需要一個方法,來在地圖顯示的過程中,判斷出某個站點的坐標有誤,并上報到服務器端,從而便于我的修正。一個典型的站點錯誤如下面這張圖片所示:
我最開始的思路是計算站點之間的距離,然后根據兩站點之間的到站時間算出速度,如果超出某個值,比如300km/h,就判斷該站點中有錯誤。
但是這種方法適用于坐標差出去比較多的站點,對于坐標差別比較少的站點就無能為力了,所以接下來,我要提到第二種方法,就是計算站點夾角的方法。
從上圖可以看出,錯誤的站點會形成一個很小的銳角,如果我們能計算出這個銳角的大小,問題就解決了。
那么問題可以描述如下:
有3個站點坐標P1,P2,P3,求角?P1P2P3的大小。
問題很簡單,解出來不容易,因為高中所學的功夫,由于很長時間沒有使用,基本已經忘完了。好在有搜索引擎,一番搜索之后,終于找到了一個方案,計算夾角可以分為下面兩步:
θ=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个地理坐标点之间的夹角的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Codeforces Round #49
- 下一篇: 图像处理类期刊选择