首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >斯特拉-群路线邻近纬度、经度和时间

斯特拉-群路线邻近纬度、经度和时间
EN

Stack Overflow用户
提问于 2016-03-29 20:06:55
回答 1查看 244关注 0票数 0

问题:在计算上最有效的方法是确定两个骑自行车的人是否在给定时间、纬度和经度的数据流的情况下一起骑车?

背景:,我是一个热衷于骑自行车的人,想要扭转斯特拉把骑自行车的人组合在一起的想法。这是他们确定骑自行车的人是否一起骑的方法(他们使用时间和骑行的时间):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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-30 07:20:23

我将假定以下内容是正确的:

  • 对于每一个骑自行车的人C,都有一个时间流T、经度X和纬度Y(我们使用投影X和Y来简化,而不关心投影;但是,我们应该)
  • 数据流可以写入数据库或其他类型的持久数据存储。
  • C的数据流是以1s的速率采样的,因为不能保证每个样本都被采集;我们必须假设在超过50%的情况下采样(最好> 95%;99,7%将是完美的)。

在这种情况下,数据库中的一个表包含分析所需的所有数据。让我们看看两个骑自行车的人C1和C2的样子,比较一下其中一个和另一个。

代码语言:javascript
复制
╔════╦════╦════╦════╦════╦═══════╗
║ 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:

  • CyclistId -自行车手的标识符
  • SamplingTime - UTC采样时间(位置)
  • 长经度
  • 拉特纬度

...with提供以下数据:

代码语言:javascript
复制
╔═══════════╦═══════════════════════╦═══════════╦════════════╗
║ 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的数据:

代码语言:javascript
复制
SELECT SamplingTime, Long, Lat FROM CyclistPosition WHERE CyclistId = 1
SELECT SamplingTime, Long, Lat FROM CyclistPosition WHERE CyclistId = 2

...and交叉引用使用此查询的数据.

代码语言:javascript
复制
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),我们得到:

代码语言:javascript
复制
╔═══════════════════════╦═══════════╦════════════╦═══════════╦════════════╦══════════════╗
║     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中这样做的简单方法是:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36294143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档