Strava - 具有纬度、经度和时间的团体路线接近度
Posted
技术标签:
【中文标题】Strava - 具有纬度、经度和时间的团体路线接近度【英文标题】:Strava - Group Route Proximity with Latitude, Longitude & Time 【发布时间】:2016-03-29 20:06:55 【问题描述】:问题:在给定包含时间、纬度和经度的数据流的情况下,确定两个自行车骑手是否一起骑行的最有效的计算方法是什么?
背景:我是一名***的自行车爱好者,我想对 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 路线:
骑士 2 路线:
您可以看到骑手 1 和骑手 2 一起骑行,但骑手 2 从不同的地点开始,后来加入骑手 1。
我想找出计算量最小的方法来确定这两个骑手是否一起骑行,尽管从不同的位置开始。
我认为 Strava 的方法很好 - 基本上在路线上的每个点周围建立一个邻近区域(150 米),并比较骑手的路线,看看骑手是否有 70% 的时间在彼此相距 150 米内度过。
骑手 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 150 分配 0。
我会迭代 Rider 2 的每个点和 Rider 1 的每个点。然后总结 1 和 0。如果(1 和 0 的总和)/(总分)大于 70%,则将车手分组在一起。
我认为这种方法通常会奏效,但似乎计算量很大,尤其是在有数千名车手需要评估的情况下。此外,数据并不总是每秒都有纬度和经度。一种方法是每分钟平均位置并按分钟比较平均位置。至少它会减少 60 倍的迭代次数。
我希望有一些统计或 GIS 方法来建立路线的“签名”并比较签名,而不是逐点比较。
关于如何以最有效的方式计算路线比较有什么想法吗?
注意:我在 GIS 论坛上发布了一个类似的问题,但还没有人回复。虽然,我确实认为这里写的问题更清楚。 https://gis.stackexchange.com/questions/187019/strava-activity-route-grouping
【问题讨论】:
对我来说看起来很简单。当我的孩子睡着时我会回答...... ;-) 更正-明天。我的孩子发烧了:-( 【参考方案1】:我将假设以下是正确的:
对于每个骑车人 C,有一个时间 T、经度 X 和纬度 Y 的数据流(我们使用投影 X 和 Y 进行简化,而不关心投影;但是,我们应该) 数据流可以写入数据库或其他类型的持久数据存储 C 的数据流以 1 秒的速率进行采样,因为不能保证每个样本都被采集;我们必须假设在超过 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 在数据库中,为两个骑自行车的人自加入一个表。对于合理数量的行(例如
让我们看一个例子。如果数据库中有这样的表,命名为 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
我们现在有了这种输出,如果我们包括粗略计算的 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
【讨论】:
以上是关于Strava - 具有纬度、经度和时间的团体路线接近度的主要内容,如果未能解决你的问题,请参考以下文章