2016-03-29 32 views
0

Question:根據時間,經度和緯度的數據流,確定兩個騎車人是否在一起騎行時,計算最有效的方法是什麼?Strava - 團體路線與經度,緯度和時間的接近程度

背景:我是一名狂熱的自行車手,希望對Strava進行逆向工程,讓自行車騎手團隊一起分組。這裏是他們的方法來確定騎自行車的人是否一起騎(他們使用騎乘時間和緯度/經度):https://support.strava.com/hc/en-us/articles/216919497-Why-don-t-I-get-grouped-in-Activities-when-I-rode-ran-with-others-

自行車騎行完成後,我有一個每秒的經度和緯度的文件。

騎士1路線: Rider1 Route

騎士2路線: Rider 2 Route

你可以看到騎士1和2騎在一起,但騎士2從不同的點開始,並加入騎士1晚。

我想用最少的計算密集方式來確定這兩個騎手在一起,儘管從不同的位置出發。

我認爲斯特拉瓦的方法很好 - 基本上在路線上的每個點周圍建立一個鄰近區域(150米),並比較騎車人的路線,看看騎手是否在彼此的150米範圍內花費了70%的時間。

騎手1 - 位置:
2016-03-27T11:47:45Z 42.113059 -87.736485
2016-03-27T11:47:46Z 42.113081 -87.736511
2016-03-27T11:47:47Z 42.113105 -87.736538
2016-03-27T11:47:48Z 42.113142 -87.736564
2016-03-27T11:47:49Z 42.113175 -87.736587

騎士2 - 位置:
- 2016-03-27T11 :47:45Z 42.113049 -87.736394 < =找到騎手1的同一時間,並確定是否在150米以內。如果< 150米分配1,如果> 150分配0.

我會遍歷Rider 2的每個點對Rider 1的每個點。然後總結1和0。如果(總數1s和0s)/(總分數)大於70%,則將騎車人分組在一起。

我認爲這種方法通常會起作用,但似乎非常計算密集型,特別是如果有成千上萬的騎手進行評估。此外,數據並不總是每秒都有經度和緯度。一種方法是每分鐘平均位置並按分鐘平均位置。至少它會減少60次迭代。

我希望有一些統計或GIS方法來建立路由的「簽名」並比較簽名,而不是逐點比較。

有關如何以最有效的方式計算路線比較的任何想法?

注意:我在GIS論壇發佈了一個類似的問題,但還沒有人回覆。雖然,我認爲這裏寫的問題更清楚。
https://gis.stackexchange.com/questions/187019/strava-activity-route-grouping

+0

它看起來相當簡單的我。我會在我的孩子睡着時回答... ;-) – OzrenTkalcecKrznaric

+0

更正 - 明天。我的孩子發燒了:-( – OzrenTkalcecKrznaric

回答

1

我要去假設以下爲真:

  • 每個騎自行車C,有時間T,經度X和緯度的Y(數據流,我們使用投射X和Y是爲了簡化,不關心投影;但是,我們應該)
  • 數據流可以寫入數據庫或其他類型的持久數據存儲器
  • C的數據流以1s的速率採樣,假設有不保證每個樣品都被拿走;我們必須假設樣本在超過50%的情況下(最好> 95%; 99.7%將是完美的)

在這種情況下,數據庫中的一個表包含分析所需的所有數據。讓我們來看看兩個騎車人C1和C2相比較的情況。

╔════╦════╦════╦════╦════╦═══════╗ 
║ T ║ X1 ║ Y1 ║ X2 ║ Y2 ║ D ║ 
╠════╬════╬════╬════╬════╬═══════╣ 
║ 1 ║ 10 ║ 15 ║ - ║ - ║  - ║ 
║ 2 ║ 11 ║ 16 ║ - ║ - ║  - ║ 
║ 3 ║ 11 ║ 17 ║ 19 ║ 11 ║ 10,00 ║ 
║ 4 ║ 12 ║ 18 ║ 18 ║ 11 ║ 9,22 ║ 
║ 5 ║ 12 ║ 17 ║ 17 ║ 12 ║ 7,07 ║ 
║ 6 ║ - ║ - ║ 15 ║ 12 ║  - ║ 
║ 7 ║ 13 ║ 16 ║ 14 ║ 13 ║ 3,16 ║ 
║ 8 ║ 13 ║ 15 ║ 13 ║ 14 ║ 1,00 ║ 
║ 9 ║ 14 ║ 14 ║ 13 ║ 14 ║ 1,00 ║ 
║ 10 ║ 14 ║ 13 ║ 14 ║ 13 ║ 0,00 ║ 
║ 11 ║ 14 ║ 14 ║ 14 ║ 14 ║ 0,00 ║ 
║ 12 ║ 14 ║ 15 ║ 14 ║ 14 ║ 1,00 ║ 
║ 13 ║ 15 ║ 15 ║ 15 ║ 15 ║ 0,00 ║ 
║ 14 ║ 15 ║ 16 ║ 15 ║ 16 ║ 0,00 ║ 
║ 15 ║ 16 ║ 16 ║ 16 ║ 17 ║ 1,00 ║ 
║ 16 ║ 17 ║ 18 ║ 16 ║ 16 ║ 2,24 ║ 
╚════╩════╩════╩════╩════╩═══════╝ 

這個比較可以很容易地用例如,在數據庫中選擇SELECT,自動加入兩個騎車人的表格。對於合理數量的行(例如< 10E5,< 10E6)並正確設置索引,該計算完全不是資源密集型的。尤其是如果我們考慮到數據庫查詢可以寫成這樣一種方式,即不爲每個位置輸出值D,而是爲了聚合(計數)值而計算出的值。在這種情況下,您所需要的只是行數的比率,其中D小於您的首選閾值D0與總行數。如果這個比例等於或超過你的極限(比如70%),騎自行車的人就一起騎車。

我們來看一個例子。如果有這樣的表在數據庫中,命名CyclistPosition:

  • CyclistId - 騎車人
  • SamplingTime的標識符 - 樣品(位置)的UTC時間採取
  • 龍 - 經度
  • 緯度 - 緯度

...數據如下:

╔═══════════╦═══════════════════════╦═══════════╦════════════╗ 
║ CyclistId ║  SamplingTime  ║ Long ║ Lat  ║ 
╠═══════════╬═══════════════════════╬═══════════╬════════════╣ 
║   1 ║ 2016-03-27T11:47:45Z ║ 42,113059 ║ -87,736485 ║ 
║   1 ║ 2016-03-27T11:47:46Z ║ 42,113081 ║ -87,736511 ║ 
║   1 ║ 2016-03-27T11:47:47Z ║ 42,113105 ║ -87,736538 ║ 
║   1 ║ 2016-03-27T11:47:48Z ║ 42,113142 ║ -87,736564 ║ 
║   1 ║ 2016-03-27T11:47:49Z ║ 42,113175 ║ -87,736587 ║ 
║   2 ║ 2016-03-27T11:47:45Z ║ 42,113059 ║ -87,736394 ║ 
║   2 ║ 2016-03-27T11:47:46Z ║ 42,113085 ║ -87,736481 ║ 
║   2 ║ 2016-03-27T11:47:47Z ║ 42,113103 ║ -87,736531 ║ 
║   2 ║ 2016-03-27T11:47:48Z ║ 42,113139 ║ -87,736572 ║ 
║   2 ║ 2016-03-27T11:47:49Z ║ 42,113147 ║ -87,736595 ║ 
╚═══════════╩═══════════════════════╩═══════════╩════════════╝ 

......然後我們就可以使用提取的騎自行車1和2的數據:

SELECT SamplingTime, Long, Lat FROM CyclistPosition WHERE CyclistId = 1 
SELECT SamplingTime, Long, Lat FROM CyclistPosition WHERE CyclistId = 2 

...並使用此查詢的數據交叉引用...

SELECT 
    cp1.SamplingTime, 
    Long1 = cp1.Long, 
    Lat1 = cp1.Lat, 
    Long2 = cp2.Long, 
    Lat2 = cp2.Lat 
FROM 
    CyclistPosition cp1 
    JOIN CyclistPosition cp2 
    ON cp2.SamplingTime = cp1.SamplingTime 
WHERE 
    cp1.CyclistId = 1 
    AND cp2.CyclistId = 2 

我們現在有這種輸出的,如果我們包括rougly計算X和Y(使用墨卡託),我們得到:

╔═══════════════════════╦═══════════╦════════════╦═══════════╦════════════╦══════════════╗ 
║  SamplingTime  ║ Long1 ║ Lat1 ║ Long2 ║ Lat2 ║  Dm  ║ 
╠═══════════════════════╬═══════════╬════════════╬═══════════╬════════════╬══════════════╣ 
║ 2016-03-27T11:47:45Z ║ 42,113059 ║ -87,736485 ║ 42,113059 ║ -87,736394 ║ 10,118517 ║ 
║ 2016-03-27T11:47:46Z ║ 42,113081 ║ -87,736511 ║ 42,113085 ║ -87,736481 ║ 3,334919  ║ 
║ 2016-03-27T11:47:47Z ║ 42,113105 ║ -87,736538 ║ 42,113103 ║ -87,736531 ║ 0,777079  ║ 
║ 2016-03-27T11:47:48Z ║ 42,113142 ║ -87,736564 ║ 42,113139 ║ -87,736572 ║ 0,890572  ║ 
║ 2016-03-27T11:47:49Z ║ 42,113175 ║ -87,736587 ║ 42,113147 ║ -87,736595 ║ 0,900635  ║ 
╚═══════════════════════╩═══════════╩════════════╩═══════════╩════════════╩══════════════╝ 

注意,對於距離的米粗略計算,你必須找到公式;我這裏使用的一種:

http://bluemm.blogspot.hr/2007/01/excel-formula-to-calculate-distance.html

現在我們就來彙總數據和指望它。我們必須限制數據的開始和結束時間(T1T2),並確定騎車人騎在一起的最大距離(D0)。最簡單的方法做,在SQL是:

DECLARE @togetherPositions int 
DECLARE @allPositions int 
DECLARE @ratio decimal(18,2) 

SELECT @togetherPositions = count(*) 
FROM 
    CyclistPosition cp1 
    JOIN CyclistPosition cp2 
    ON cp2.SamplingTime = cp1.SamplingTime 
WHERE 
    cp1.SamplingTime BETWEEN @T1 AND @T2 
    AND {formula to get distance in meters} <= @D0 

SELECT @allPositions = count(*) 
FROM 
    CyclistPosition cp1 
    JOIN CyclistPosition cp2 
    ON cp2.SamplingTime = cp1.SamplingTime 
WHERE 
    cp1.SamplingTime BETWEEN @T1 AND @T2 

SET @ratio = @togetherPositions/@allPositions * 1.0 

現在,你只需要決定是否比爲0.7,0.8,0.85 ...

HTH