我要去假設以下爲真:
- 每個騎自行車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
現在我們就來彙總數據和指望它。我們必須限制數據的開始和結束時間(T1
和T2
),並確定騎車人騎在一起的最大距離(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
它看起來相當簡單的我。我會在我的孩子睡着時回答... ;-) – OzrenTkalcecKrznaric
更正 - 明天。我的孩子發燒了:-( – OzrenTkalcecKrznaric