2010-06-27 67 views
2

在地圖應用程序中,我使用與以下類似的查詢在基於可視地圖區域的地圖上顯示標記。MySQL Lat/Lng結果均勻分佈的邊界

SELECT * FROM (`properties`) 
WHERE `lat` > '-11.824448' AND `lat` < '84.124002' AND 
     `lng` > '-152.243398' AND `lng` < '-39.743398' 
LIMIT 20; 

由於此導致的結果通常出現在同一緯度,並出現在地圖的角落線表中的索引。機智的地圖的其餘部分是空的。

鑑於我無法在服務器負載,帶寬和加載時間顯示地圖上的所有結果,有沒有辦法在整個地圖區域內拉回結果?

我想我可以通過計算x的比例距離並告訴mysql返回結果,其中沒有結果在另一個x距離內的結果。

其他人怎麼做到的?

+0

您是否打算從視口區域挑選20個隨機屬性? – 2010-06-27 06:34:30

+0

是的,程序員錯誤#1,並試圖變得複雜 – PJT 2010-06-27 06:47:39

回答

1

如果你將有數以千計的特性,你可能要考慮在數據庫內匯聚你的屬性。也就是說,通過定義每個屬性應該出現在哪個縮放級別,您可以聚合這些點以減少一次顯示的數量。

一種方法可以是使用另一個表,也許稱其爲properties_clusters,具有以下字段:latlngnumber_of_pointszoom_level。確保zoom_level字段也包含可用索引。

無論何時插入或移動屬性,您還應該更新properties_clusters表。你可能想研究一下關於可能的聚類算法,但是如果精度不是那麼重要,你可能會想出一個簡單的解決方案,例如在每個縮放級別的鑲嵌瓦片中鑲嵌世界,然後簡單地進行聚類。

然後,每當可見區域或地圖改變縮放級別,你可以從你的properties_clusters表請求數據時,將返回點的數量較少較低縮放級別:

SELECT * FROM (`properties_clusters`) 
WHERE `lat` > '-11.824448' AND `lat` < '84.124002' AND 
     `lng` > '-152.243398' AND `lng` < '-39.743398' AND 
     `zoom_level` = 5 

你可以定義一個縮放級別閾值,您可以直接從properties表中直接顯示結果。該閾值通常設置爲可以與地圖上的標記進行交互的縮放級別(點擊它們等)。

0

「ORDER BY RAND()」似乎做一個足夠好的工作沒有得到太複雜