【问题标题】:Clustering or Filtering points in WGS84 CoordinatesWGS84 坐标中的聚类或过滤点
【发布时间】:2017-01-04 15:37:52
【问题描述】:

所以我正在尝试解决一个问题。我有一个可以作为玩家的点,我周围有几个物体,有些更远,有些靠近呃。例如,我想排除所有较远的点并包括较近的使用距离。如何对对象进行聚类或过滤。我正在考虑空间分区。对象位于地理坐标中。对象的数量可以是 10.000

【问题讨论】:

  • 空间分区是正确的关键字,但您需要提供一些更详细的信息。例如,我假设“玩家”正在移动,但其他点也是吗?您真的需要 3D 信息来进行选择吗?此外,WGS84 是一个基于投影的非长度保持坐标系,您对分区的选择可能会受到您是否需要计算到玩家的公制距离的影响。
  • 物体也在移动。不,我不需要 3d 信息进行选择。我会将球坐标转换为笛卡尔坐标以获得公制距离。
  • @FelixLauer 你有什么想法吗?关于如何进行? kd-tree knn ?

标签: c++ algorithm math 3d wgs84


【解决方案1】:

如果允许每一个点移动,更新对于 kd-trees 或类似的自适应结构可能会变得昂贵。我想我会采用静态分区方法,例如将空间划分为一组单元格(二次或矩形),并为每个单元格存储对所包含点的引用以及所包含点集的最大和最小坐标。当点移动时,您可以简单地计算它们所在的当前单元格。在计算距离时,您只需确定相关单元格,然后使用线性时间计算到它们所包含点的距离。

我看到了这种方法的三个基本优势:

  1. 通过查看每个单元格当前包含的最小和最大坐标,您可以轻松确定其是否为空,如果不是,则包含的整组点与玩家的当前位置相关。

  2. 您可以将静态单元组织成具有完美平衡的树结构(例如四叉树)。对于树的每个内部节点,您存储并更新其子节点的组合最小和最大坐标。请注意,更新非常便宜,因为树的结构根本不受影响。

  3. 您不需要对点进行排序(因为其他结构或特定实现需要这样做)。如果物体快速移动,这可以为您节省大量性能。

  4. 构建和维护数据结构很简单。你不必用奇异的测试用例和复杂的结构更新来破坏你的大脑。

当然,选择非自适应数据结构有一些缺点,因为它是非自适应的。例如,您高度依赖网格单元的大小。如果你选择的太小(最坏的情况:每个单元格一个点),树的深度就会膨胀并且遍历变得昂贵。另一方面,如果您选择的太大(最坏的情况:在某些时候,所有点都在同一个单元格中),您将执行许多不需要且可能很昂贵的距离计算。

总而言之,这实际上取决于您拥有的数据类型。我给你的建议应该会产生相当好的结果,但可能有更有效的方法来做到这一点。如果您有足够的时间,请同时实施自适应和静态分区方法,提出一些具有代表性的测试并将它们相互比较。

希望这会有所帮助;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多