2009-07-25 79 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。

我想補充一點(取決於數據的類型),你可以添加一個額外的屬性到你的地圖點。

例如,對於城市,您可以添加生活在其中的人數。 然後根據縮放級別,您只顯示一定大小的城市。或者更好的是,在選擇算法中給他們更高的分數。在空白區域,您仍會看到較小的區域,在擁擠的區域您只會看到大城市。

這種方法可以很好地適用於任何縮放級別,而每個縮放級別的預定義數據集只能以分立步驟工作。