簡體   English   中英

谷歌地圖api v3的服務器端群集

[英]Server-side clustering for google maps api v3

我目前正在開發一種谷歌地圖概覽小部件,在地圖上顯示位置作為標記。 標記物的數量從幾百到幾千個標記物(10000個以上)變化。 現在我正在使用MarkerClusterer進行谷歌地圖v3 1.0谷歌地圖javascript api v3(總理) ,它的工作相當不錯,讓我們說一百個標記。 由於標記的數量將增加,我需要一種新的聚類標記的方法。 從我讀到的,保持性能提升的唯一方法是將集群從客戶端移動到服務器端。 有誰知道一個好的PHP5庫能夠為我完成這個嗎?

Atm我正在深入研究谷歌地圖的層機制。 也許還有一些領先的PHP庫我可以開始檢查? 我也遇到了FusionTables,但由於我需要群集,我認為這可能不是正確的解決方案。

提前致謝!

我不知道服務器端庫會為你做什么。 但是,我可以給你一些關於如何自己實現一個的指示。

聚類的基本方法是簡單地計算標記之間的距離,當它們中的兩個足夠接近時,用位於兩者之間的中點的單個標記替換它們。

您可以(或者相反)選擇限制所需的聚類/標記數量,而不僅僅限制彼此標記的接近程度。

要完成此操作,您可以計算所有標記對之間的距離,對它們進行排序,然后從頂部進行合並,直到您只擁有任意數量的標記/簇。

要在形成聚類時細化中點定位,您可以考慮要合並的兩個中的每一個所代表的實際標記的數量。 將該數字視為權重,將兩個標記之間的線條視為比例。 然后,不要總是選擇中點,而是選擇能夠平衡比例的點。

我想如果你的標記數量有限,那么這種簡單的聚類形式就足夠了。 如果您的數據集(標記的數量及其位置)大致是靜態的,您可以偶爾計算服務器上的群集,直接從緩存中緩存它和服務器客戶端。

但是,如果您需要支持世界各地可能使用標記的大規模方案,則需要采用更復雜的方法。

提到的聚類算法不能擴展。 事實上,它的計算成本通常會隨着標記的數量呈指數增長。

要解決此問題,您可以將世界拆分為分區並計算群集並為每個分區的客戶端提供服務。 這確實會支持擴展,因為工作負載可以由幾個(大致)獨立的服務器拆分和執行。

那么問題是如何找到一個好的分區方案。 您可能還需要考慮在不同的縮放級別提供不同的標記聚類,並且您的分區方案也應該包含此標記以允許縮放。

Google將地圖划分為具有x,y和z坐標的圖塊,其中xy是從地圖的西北角開始的圖塊的水平和垂直位置,其中z是縮放級別。

在最小縮放級別(零)處,整個地圖由單個圖塊組成。 (所有圖塊均為256x256像素)。 在下一個縮放級別,該圖塊被划分為四個子圖塊。 這繼續,因此在縮放級別2中,這四個圖塊中的每一個都被划分為四個子圖塊,這給出了總共16個圖塊。 縮放級別3有64個圖塊,級別4有256個圖塊,依此類推。 (任何縮放級別的圖塊數量可以表示為4^z 。)

使用此分區方案,您可以從最低縮放級別(最高z坐標)開始計算每個拼貼的聚類,然后冒泡直至到達頂部。

要為單個圖塊聚類的標記集是其四個子圖塊的所有標記(其中一些可以表示聚類)的並集。

這為您提供了有限的計算成本,並為您提供了一種很好的方法來分塊發送到客戶端的數據。 客戶端可以在加載到地圖中時逐個圖塊地請求標記,而不是請求給定縮放級別的所有標記( 不會縮放)。

然而,這種方法存在一個缺陷:考慮兩個相鄰的瓷磚,一個在左邊,一個在右邊。 如果左側磁貼在其最右側包含標記/集群,而右側磁貼在其最左側包含標記/集群,那么這兩個標記/集群應該合並但不會是因為我們正在執行集群每個瓷磚單獨的機制。

要解決此問題,您可以在對其進行聚類后對其進行后處理,以便合並位於四個邊緣中的每個邊上的標記/聚類,同時考慮給定切片的八個相鄰切片中的每一個。 這種后合並機制僅在我們可以假設沒有單個簇足夠大以影響不在同一子區塊中的周圍標記時才起作用。 然而,這是一個合理的假設。

最后要注意的是:通過擴展方法,您可以讓客戶提出幾個小請求。 這些請求將具有局部性(即,瓦片不是隨機請求的,而是通常也一起訪問在地理上彼此接近的瓦片)。

為了提高查找/查詢性能,您將受益於使用也具有此局部性屬性的搜索鍵(表示切片)(因為這將存儲磁盤上相鄰數據塊中相鄰切片的數據 - 從而提高了讀取時間和緩存利用率)。

您可以使用tile / sub tile分區方案來形成這樣的密鑰。 讓頂部圖塊(跨越整個圖的單個圖塊)將空字符串作為鍵。 接下來,讓它的每個子瓦片具有鍵A,B,C和D.下一級將具有鍵AA,AB,AC,AD,BA,BC,...,DC,DD。

遞歸地應用這個,你最終會得到一個識別你的圖塊的分區鍵,允許快速轉換為x,y,z坐標並具有locality屬性。 這種關鍵命名方案有時被稱為Quad Key,源於分區方案形成四叉樹的事實。 當使用Z順序曲線將2D值映射到1D值時,locality屬性與您獲得的屬性相同。

如果您需要更多詳細信息,請與我們聯系。

你可以嘗試我的免費群集應用程序。 它能夠比客戶端谷歌地圖api更多的引腳。 它為kmeans提供基於網格的聚類。

https://github.com/biodiv/anycluster

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM