【问题标题】:Python: Find out most frequent locations on a set of gps coordinatesPython:找出一组gps坐标上最常见的位置
【发布时间】:2013-03-25 20:13:42
【问题描述】:

我需要在 python 中分析一组 GPS 坐标。我需要找出最常见的位置。考虑到GPS数据的精度问题,定位精度不是很高。难以解释(以及在 google 上搜索信息),因此举个例子:

  • 我每天从家里开车上班,持续了 2 个月
  • 我每次旅行都会启动我的 gps 记录器,并在旅行结束时停止
  • 偶尔,我会去别的地方

如果我运行脚本,我需要分析驱动器开始和停止的坐标,位置半径精度为 20m,我会发现最常出现的地方是我的家和我的工作(每个都有一个半径 20m)。在这个范围内我停在哪里都没关系。

python中有没有可以执行此类操作的库?你有什么建议吗?

谢谢

【问题讨论】:

  • 为了降低精度,我只删除最后几个数字。
  • 根据纬度/经度计算两点之间的距离非常简单......这是毕达哥拉斯定理的东西。鉴于您的坐标数量相对较少(仅限开始和停止),只需做一些简单的数学运算,无需库。
  • @Endophage ...我明白了,不需要考虑地球曲率?
  • @otmezger 是的。另外一个小的优化,如果你使用正方形 20m 的距离而不是圆的半径,计算会更便宜:diff_x < 20 and diff_y < 20 而不是sqrt(diff_x**2 + diff_y**2) < 20

标签: python geolocation gps


【解决方案1】:

如果您最感兴趣的地方是您去的地方,您可以考虑从每个驱动器中取第一个和最后一个点,并且仅在您在那里停留超过 x 时间时才取中间点.也许如果您在最后 k 个数据点上的平均速度小于某个阈值。这应该可以更容易地应用一些聚类技术(如k-means clustering)。

可能会派上用场的是使用approximate nearest neighbors 为任何给定点查找相对靠近它的点的集合。

要从图形中获取页面,您甚至可以尝试在所有数据点的空间上叠加一个高分辨率网格,并为每个点在该网格上制作一个小半径的 splat。每次添加 splat 时,您都可以累积在该点花费的时间,然后跟踪网格中累积时间最长的点。

【讨论】:

    【解决方案2】:

    为了计算最常见的位置,一种简单的方法是仅使用纬度/经度小数点后的前 3 位数字,或者更好地舍入到逗号后的 3 位数字。

    在赤道:

    4 位数:11 m
    3位111m
    2位数1.1公里
    1 位数 11.1km
    0位111.111公里(两条经线之间的距离):40 000 000 / 360

    然后您可以用作哈希表,乘以例如 1000 以去掉 3 个小数点, 并作为 java.awt.Point 存储在哈希表中。

    有更好的解决方案,但这给出了第一个想法。

    【讨论】:

    • 我认为这不是一个好主意,因为如果我在 2 个“4 位”之间有一个点,它会被舍入错误
    • 位于该 3 位网格边界上的点可以落在另一个网格中。但是在 60m - 100m 的光栅上没关系,那么在最坏的情况下,如果你的停车位不同,你家周围就有两个热点。所有其他解决方案都需要高度的特殊地理空间知识知识。 (例如使用 PMR-quadtree 等)您可能会阅读 Hana Samet:多维和度量搜索结构的基础。
    • 更新答案,四舍五入到 3 位数。 (把灵魂想象成一个棋盘,你的轨迹就像面包屑,当面包屑位于每个棋盘上时,你会增加每个棋盘的计数器。)
    猜你喜欢
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 2017-05-29
    • 2013-04-29
    • 2016-09-19
    相关资源
    最近更新 更多