2016-06-09 10 views
0

我正在繪製谷歌地圖上的旅程。數據量使地圖的性能下降,所以我們正在尋找一種減少數據量的方法。具體而言,我正在尋找刪除彼此非常相似的繪圖點。刪除數據集中的類似數據點

我有一組描述人員旅程的位置數據。這些數據點本質上是一個經緯度/長整數列表,並帶有一些相關的元數據,例如速度。

我記得一個線性迴歸模型可以用來去除沿着基於位置數據的線出現的「相似」點,但是它可以被擴展爲還包括另一個域,例如速度?

即如果我有以下幾點(爲簡潔起見,我會用X,Y而不是latlng)。生病的情節在直徑

  • 點{緯度:0,LNG:0,速度:0}
  • {緯度:1,LNG:1,速度:0} //可以去掉
  • {緯度:2,LNG:2,速度:1} //可以被移除
  • {緯度:3,LNG:3,速度:30} //大的變化,保持
  • {緯度:4,LNG: 4,Speed:30} //可以被移除
  • {Lat:5,Lng:5,Speed:30} //可以被移除
  • {L在:1,Lng:5,速度:30} //大變化,保持

任何人都可以給我一些真正的代碼如何做到這一點?我正在使用JavaScript,但可以從任何語言或僞代碼轉換。如果速度不能包括在內,有人可以幫助我使用線性迴歸算法,只是爲了類似的繪圖點?

道歉,如果我的數學術語不是很好,我有點出於我的深度數學智慧!

+1

難道你不只是迭代通過數組和比較每個點到前一點,拋出那些不夠不同? – carebdayrvis

+0

你如何定義不同的?如果兩點之間有一點不同,那麼它完全位於兩者之間,但是當它們之間劃一條線時,它完全相交,這是多餘的? – Chris

回答

1

下面是使用reduce循環遍歷創建新數組的所有條目的示例,如果條目與前一條目(distance*speed > 5)過於相似,則會忽略條目;

var data = [ 
 
    { Lat: 0, Lng: 0, Speed: 0 }, 
 
    { Lat: 1, Lng: 1, Speed: 0 }, // could be removed 
 
    { Lat: 2, Lng: 2, Speed: 1 } ,// could be removed 
 
    { Lat: 3, Lng: 3, Speed: 30 }, // big change, keep 
 
    { Lat: 4, Lng: 4, Speed: 30 }, // could be removed 
 
    { Lat: 5, Lng: 5, Speed: 30 }, // could be removed 
 
    { Lat: 1, Lng: 5, Speed: 30 } 
 
] 
 

 
function distance(a,b){ 
 
    return Math.sqrt(Math.pow(a.Lat - b.Lat, 2) + Math.sqrt(Math.pow(a.Lng - b.Lng, 2))) 
 
} 
 

 
function speedDif(a,b){ 
 
    return Math.abs(a.Speed - b.Speed) 
 
} 
 
var res = data.reduce((ac,x) =>{ 
 
    if(!ac.length) 
 
    ac.push(x); 
 
    else { 
 
    const last = ac[ac.length -1 ]; 
 
    if(distance(last, x) * speedDif(last, x) > 5) //for ex.5 
 
    ac.push(x) 
 
    } 
 
    return ac; 
 
},[]) 
 

 
console.log(res)

1

你在找什麼似乎是點之間的簡單距離計算器。因此,對於每個點,計算到下一個點的距離,如果它大於某個預定距離,則保留它,否則將其移除。唯一的問題就是,假設你從(1,1)到(2,2)到(3,3)到(4,4)到...(1000,1000),並且你繼續刪除所有東西!我的建議是將每個節點與前一個節點進行比較,計算距離,然後如果要刪除它,首先將它與您未刪除的最後一個節點進行比較。這樣,即使您不斷移除彼此靠近的多個節點,您仍然會知道自己包含的最後一個節點的距離。這只是一個方法來做到這一點,沒有所有討厭的線性迴歸的東西...