2009-07-25 35 views
2

我有一个地图点的数据库,我想限制显示一次最多显示50个点。当用户放大时,可能会显示更多的点。如何过滤空间数据

目前,我只是随机抽取结果集。这不是很好,因为可能有空白区域,当放大时突然显示一个点。

我的下一个想法是我可以创建一个10x5网格,并迭代结果。如果网格中的某个位置是空的,我会显示一个点。这解决了以前的问题,但也不能让用户了解集中区域的位置。而且,如果用户决定缩小到整个世界,这是非常缓慢的。

现在,我没有使用任何空间算法来排序数据。我的计划是先让它正常工作,然后快速完成。在RTress,kd-trees和quad-trees中稍微阅读一下,我找不到任何能帮助我选择样本的“智能”子集的东西。似乎应该有某种广度优先搜索能够很容易地解决这个问题。

+0

我建议你搜索术语聚类算法,许多空间库实现它或有一些例子来实现它,例如http://openlayers.org/dev/examples/strategy-cluster-threshold.html – phipex 2014-08-25 19:39:27

回答

0

由于我只有几千个点和大量的离线时间,我创建了一个算法来创建一个弥散因子,通过这个弥散因子我可以对数据进行排序。

  1. 我开始从我设定一个随机点,给它一个分数N = 1,并把它添加到选择名单。
  2. 然后,我搜索从选定的列表中的任意点开始的点。
  3. 我拿这点,给它一个n + 1的分数,把它加到选中的列表中,然后重复第二步,直到所有点都被选中。

在我的地图中,我将所有与范围过滤器相匹配的点按排名升序进行排序。无论过滤器还是缩放,我都会在屏幕上分布点。

3

如何延长你原来的想法一点。将其分解为网格,然后使用密度分析根据该区域中的特征数量创建不同大小的点。这样,用户通过查看更大(或更小)的点就可以更直观地了解功能密度。

至于让它更快,也许你可以为每个网格设置一个阈值。如果计数达到一定数量,请转到下一个网格。通过这种方式,您可以获得“最大”的点,并通过忽略高于人为设置的阈值(您可以根据对数据的实证分析确定的点)来加快速度。

1

迈克尔托德提出了一些很好的建议。 +1。

我想补充一点(取决于数据的类型),你可以添加一个额外的属性到你的地图点。

例如,对于城市,您可以添加生活在其中的人数。 然后根据缩放级别,您只显示一定大小的城市。或者更好的是,在选择算法中给他们更高的分数。在空白区域,您仍会看到较小的区域,在拥挤的区域您只会看到大城市。

这种方法可以很好地适用于任何缩放级别,而每个缩放级别的预定义数据集只能以分立步骤工作。