我正在尝试记录 GPS 至少停止 X 分钟的每个地方,但我在识别它时遇到了一些问题。到目前为止,我所做的是遍历每个点,检查从最后一点开始的速度是否小于 Y km/h,但这是沉重(且愚蠢)的方式,我相信(尽管我没有发现任何东西)那里必须是更好的方法。我想知道是否有现有的算法可以做到这一点,或者你们是否可以就去哪里提供一些指导。
我没有任何传感器访问权限,只有每 6 秒一次的 GPS 位置。
你不需要检查速度。您需要做的就是检查位置。假设您有一系列职位,您可以执行以下操作:
int secondsStopped = 0;
Position stoppedPos = positions[0];
for (int i = 1; i < positions.Length; ++i)
{
if (positions[i] == stoppedPos)
{
secondsStopped += 6;
}
else
{
// it moved.
if (secondsStopped >= TARGET_TIME)
{
output("Stopped at " + stoppedPos + " for " + secondsStopped + " seconds.");
stoppedPos = positions[i];
secondsStopped = 0;
}
}
}
// check last period
if (secondsStopped >= TARGET_TIME)
{
output("Stopped at " + stoppedPos + " for " + secondsStopped + " seconds.");
}
因为 GPS 通常不会在每个周期为您提供完全相同的位置,即使事情完全静止,您可能需要将相等性检查更改为:
if (ComputeDistance(positions[i], stoppedPos) <= SOME_SMALL_VALUE)
我不知道SOME_SMALL_VALUE
应该是什么。您必须进行实验以找出似乎合理的方法。
您还必须找到一个距离公式。应该不会太难。而且由于 GPS 不会在 6 秒内移动很远,您可以假装世界是平的(使距离计算变得非常容易)。我不知道您的 GPS 数据是什么样的,但假设您已获得纬度和经度,您可以查看我的文章Computing Track Information in GPS以进行简单的距离计算。