问题:在计算上最有效的方法是确定两个骑自行车的人是否在给定时间、纬度和经度的数据流的情况下一起骑车?
背景:,我是一个热衷于骑自行车的人,想要扭转斯特拉把骑自行车的人组合在一起的想法。这是他们确定骑自行车的人是否一起骑的方法(他们使用时间和骑行的时间):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米),并比较骑手的路线,看看骑手们是否在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。
我会把骑士2的每一点对着骑士1的每一点进行迭代,然后把1和0相加。如果( 1s和0s之和)/(总分)大于70%,则将骑手组合在一起。
我认为这种方法一般是可行的,但似乎计算量很大,特别是如果有成千上万的骑手要评估的话。而且,数据并不总是每秒都有纬度和经度。一种方法是每分钟平均位置并逐分钟比较平均位置。至少可以将迭代次数减少60倍。
我希望有一些统计或地理信息系统方法来建立一个路线的“签名”和比较签名,而不是逐点比较。
对于如何以最有效的方式计算路径比较,有什么想法吗?
注:我在地理信息系统论坛上发布了一个类似的问题,但还没有人回应。不过,我确实认为这里写的问题比较清楚。
https://gis.stackexchange.com/questions/187019/strava-activity-route-grouping
发布于 2016-03-30 07:20:23
我将假定以下内容是正确的:
在这种情况下,数据库中的一个表包含分析所需的所有数据。让我们看看两个骑自行车的人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 in数据库,为两个骑自行车的人自动连接一个表。对于合理的行数(例如<10E5、<10E6)和正确设置索引,这种计算根本不需要资源。特别是考虑到数据库查询可以用这样的方式编写,即不是为每个位置输出值D,而是为了聚合(计数)值而计算值。在这种情况下,您所需要的只是D较少等于的行数比,您喜欢的重持卡器D0与行总数之间的比率。如果这个比率等于或超过了你的极限(比如说,70%),骑自行车的人就一起去兜风。
让我们看看一个例子。如果数据库中有这样的表,名为CyclistPosition:
...with提供以下数据:
╔═══════════╦═══════════════════════╦═══════════╦════════════╗
║ 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 ║
╚═══════════╩═══════════════════════╩═══════════╩════════════╝...then我们可以使用以下方法提取骑自行车者1和2的数据:
SELECT SamplingTime, Long, Lat FROM CyclistPosition WHERE CyclistId = 1
SELECT SamplingTime, Long, Lat FROM CyclistPosition WHERE CyclistId = 2...and交叉引用使用此查询的数据.
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(使用Mercator),我们得到:
╔═══════════════════════╦═══════════╦════════════╦═══════════╦════════════╦══════════════╗
║ 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
https://stackoverflow.com/questions/36294143
复制相似问题