WGS84 坐标中的聚类或过滤点
Clustering or Filtering points in WGS84 Coordinates
所以我正在尝试解决一个问题。我有一个可以作为玩家的点,我周围有几个物体,有些更远有些更近。例如,我想排除所有较远的点并包括较近的使用距离。如何聚类或过滤对象。我在考虑空间分区。对象位于地理坐标中。对象数量可以是10.000
如果允许移动每个单独的点,对于 kd 树或类似的自适应结构,更新可能会变得昂贵。我想我会采用静态分区方法,例如将 space 分成一组单元格(二次或矩形),并为每个单元格存储对包含点的引用以及包含点集的最大和最小坐标。当点在移动时,您可以简单地计算它们所在的当前单元格。当涉及到距离计算时,您只需确定相关单元格,然后用线性时间计算到它们包含的点的距离。
我看到了这种方法的三个基本优势:
通过查看每个单元格当前包含的最小和最大坐标,您可以轻松确定它是否为空,如果不是,则整组包含的点与玩家的当前位置相关.
您可以以完美平衡的树结构(例如四叉树)组织静态单元格。对于树的每个内部节点,您存储和更新其子节点的组合最小和最大坐标。请注意,更新非常便宜,因为树的结构根本不受影响。
您不需要对您的观点进行排序(因为对于其他结构或特定实现而言,这是必需的)。如果对象快速移动,这可以为您节省很多性能。
构建和维护数据结构很简单。您不必为奇异的测试用例和复杂的结构更新而伤脑筋。
当然,选择非自适应数据结构也有一些缺点,因为它是非自适应的。例如,您高度依赖网格单元格的大小。如果你选择它太小(最坏的情况:每个单元格一个点),树的深度会膨胀并且遍历变得昂贵。另一方面,如果你选择的太大(最坏的情况:在某些时候,所有点都在同一个单元格中),你将执行许多不需要的和可能昂贵的距离计算。
总而言之,这实际上取决于您拥有的数据类型。我给你的建议应该会产生相当好的结果,但可能有更有效的方法来做到这一点。如果您有足够的时间,同时实施自适应和静态分区方法,提出一些有代表性的测试并将它们相互比较。
希望这对您有所帮助 ;)
所以我正在尝试解决一个问题。我有一个可以作为玩家的点,我周围有几个物体,有些更远有些更近。例如,我想排除所有较远的点并包括较近的使用距离。如何聚类或过滤对象。我在考虑空间分区。对象位于地理坐标中。对象数量可以是10.000
如果允许移动每个单独的点,对于 kd 树或类似的自适应结构,更新可能会变得昂贵。我想我会采用静态分区方法,例如将 space 分成一组单元格(二次或矩形),并为每个单元格存储对包含点的引用以及包含点集的最大和最小坐标。当点在移动时,您可以简单地计算它们所在的当前单元格。当涉及到距离计算时,您只需确定相关单元格,然后用线性时间计算到它们包含的点的距离。
我看到了这种方法的三个基本优势:
通过查看每个单元格当前包含的最小和最大坐标,您可以轻松确定它是否为空,如果不是,则整组包含的点与玩家的当前位置相关.
您可以以完美平衡的树结构(例如四叉树)组织静态单元格。对于树的每个内部节点,您存储和更新其子节点的组合最小和最大坐标。请注意,更新非常便宜,因为树的结构根本不受影响。
您不需要对您的观点进行排序(因为对于其他结构或特定实现而言,这是必需的)。如果对象快速移动,这可以为您节省很多性能。
构建和维护数据结构很简单。您不必为奇异的测试用例和复杂的结构更新而伤脑筋。
当然,选择非自适应数据结构也有一些缺点,因为它是非自适应的。例如,您高度依赖网格单元格的大小。如果你选择它太小(最坏的情况:每个单元格一个点),树的深度会膨胀并且遍历变得昂贵。另一方面,如果你选择的太大(最坏的情况:在某些时候,所有点都在同一个单元格中),你将执行许多不需要的和可能昂贵的距离计算。
总而言之,这实际上取决于您拥有的数据类型。我给你的建议应该会产生相当好的结果,但可能有更有效的方法来做到这一点。如果您有足够的时间,同时实施自适应和静态分区方法,提出一些有代表性的测试并将它们相互比较。
希望这对您有所帮助 ;)