Strava-具有纬度、经度和时间的团体路线接近度

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

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

背景:我是一个狂热的骑自行车的人,想逆向工程 Strava 如何将骑自行车的人分组在一起。这是他们确定骑自行车的人是否在一起的方法(他们使用时间和一次骑行的 lat / lon):https://support.strava.com/hc/en-us/articles/216919497-Why-don-t-I-get-grouped-in-Activities-when-I-rode-ran-with-others-

骑自行车完成后,我每秒都有一个纬度和经度文件。

Rider 1 Route: Rider1 Route

Rider 2 Route: Rider 2 Route

您可以看到 Rider 1 和 Rider 2 一起骑行,但是 Rider 2 从另一个地方开始,后来加入了 Rider 1。

我想用最少的计算密集的方式来确定这两个骑手一起骑,尽管从不同的位置开始。

我认为 Strava 的方法很好-基本上在路线上的每个点周围建立一个邻近区域(150 米),并比较骑手的路线,看看骑手是否在彼此 150 米内花费了 70 % 的时间。

骑士 1-位置:
2016-03-27T11:47:45Z42.113059-87.736485
2016-03-27T11:47:46Z 42.113081-87.736511
2016-03-27T11:47:47Z 42.113105-87.43649538
2016-03:48br 7275

Rider 2-位置:
-2016-03-27T11:47:45Z42.113049-87.736394 & lt;= 查找 Rider 1 的相同时间并确定是否在 150 米内。如果 & lt;150 米分配 1,如果 & gt;150 分配 0。

我将遍历 Rider 2 的每个点与 Rider 1 的每个点。然后总结 1s 和 0s。如果(1s 和 0s 的总和)/(总分)大于 70 %,则将骑手分组在一起。

我认为这种方法通常会起作用,但似乎非常计算密集,特别是如果有成千上万的骑手要评估。此外,数据并不总是每秒有纬度和经度。一种方法是每分钟平均位置并按分钟比较平均位置。至少它将减少 60 次迭代。

我希望有一些统计或 GIS 方法来建立路线的“签名”并比较签名,而不是逐点比较。

关于如何以最有效的方式计算路线比较的任何想法?

注意:我在 GIS 论坛上发布了类似的问题,但还没有人回应,尽管,我确实认为这里写的问题更清楚。
https://gis.stackexchange.com/questions/187019/strava-activity-route-grouping

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 在数据库中,说自连接一个表的两个骑自行车的人。对于一个合理数量的行 (例如 & lt;10E5,& lt;10E6) 和正确设置的索引,这种计算根本不是资源密集型的。特别是如果我们考虑到数据库查询可以这样写,值 D 不是每个位置的输出,但计算出的总计数比 (count) 少。

让我们看一个例子。如果数据库中有这样的表,名为 CyclistPosition:

CyclistId-骑自行车的人的标识符

采样时间-采样 (位置) 的 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...

赫特

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(917)
使用MSAccess数据库跟踪十二个月公式
上一篇
如何在一个元素上有多个CSS转换
下一篇

相关推荐

  • java上传文件:如何使用Java实现文件上传

    Java上传文件是指使用Java程序将文件上传到Web服务器的过程。通常情况下,我们使用HTTP协议来实现文件上传,使用POST方法发送请求,并将文件作为请求体发送给服务器。下面是一个使用Java实现文件上传的示例代码:…

    2023-01-28 13:27:23
    0 66 64
  • java在线运行代码基础知识与实践

    示例示例Java在线运行代码是指使用Java语言编写的代码可以在网上直接运行,而不需要下载和安装任何软件。下面是一个简单的Java示例代码:…

    2023-01-06 14:36:41
    0 92 71
  • python和java哪个好就业哪种更适合就业?

    Python和Java哪个好就业这个问题的答案取决于你的职业目标。如果你想从事机器学习或数据科学方面的工作,那么Python是一个更好的选择,因为它拥有更多的库和API,可以帮助你更快地完成项目。然而,如果你想从事更传统的软件开发,如Web开发,那么Java可能是一个更好的选择,因为它拥有更多的框架和工具,可以帮助你更快地完成项目。…

    2023-01-25 02:56:59
    0 48 66
  • java实习生实习报告:Java实习生实践总结报告

    Java实习生实习报告是一种用来描述实习生在实习期间学习和实践Java技术的报告文件。它包括实习期间学习的Java基础知识、实践的Java项目、实习期间获得的技术收获以及实习期间的工作总结等内容。…

    2023-01-08 12:26:48
    0 95 31
  • java抛出异常什么意思如何捕获和处理异常

    Java抛出异常意味着在运行时发生了一个错误,导致程序不能正常运行。异常是一种特殊的对象,它提供了有关错误的信息,以便程序员可以查找并修复问题。…

    2023-01-06 05:07:07
    0 50 35
  • java数组必须定义长度吗:Java数组的定义和初始化

    示例示例不必要定义长度,可以使用动态初始化的方式来定义数组。代码示例:…

    2023-01-23 02:02:30
    0 53 53
  • java历史版本下载从Java 1.0到Java 11的发展史

    Java历史版本下载:Java…

    2023-01-02 04:20:50
    0 52 79
  • java游戏引擎一次不同的游戏体验!

    Java游戏引擎是一种用于创建复杂的2D或3D游戏的软件开发工具。它使用Java语言,以及一系列的框架和库,为游戏开发者提供了一个基本的游戏开发平台。Java游戏引擎可以帮助游戏开发者节省时间和金钱,因为它们可以重复使用代码,而不必每次都重新编写代码。它们还可以提供一个可扩展的游戏开发框架,允许开发者更轻松地创建和管理游戏的各个方面。…

    2023-01-22 14:30:21
    0 15 65

发表评论

登录 后才能评论

评论列表(43条)