我收集了一個覆蓋二維平面且沒有重疊的物體java.awt.Shape
。這些來自美國各州的數據集,分辨率相當低。對於(x,y)緯度/經度點,我想快速確定哪個縣包含該點的形狀。什麼是索引這個最佳方式?查看包含X,Y座標的形狀
蠻力將如下所示:
for (Shape eachShape : countyShapes) {
if (eachShape.contains(x, y)) {
return eachShape;
}
}
爲了優化此,我可以存儲(可能複雜)的形狀的最小/最大界限,和來電contains(x, y)
形狀上,其矩形邊界涵蓋給定的x ,y座標。建立這個索引的最好方法是什麼? A SortedMultiset可用於索引x
最小值和最大值,但如何在索引中包含y
座標?
對於這個特定的實現,做幾秒鐘的前期工作來索引形狀不是問題。
這個問題非常廣泛,可能*太寬泛。有數十種空間數據結構,從(着名的)Quadtrees,kD-Trees和BSP到[空間散列](https://conkerjo.wordpress.com/2009/06/13/spatial-hashing - 實施換快速-2D-碰撞/)。在大多數情況下,關於內存消耗,精度,查詢時間與構建時間等有幾個折衷。或者是關於如何用'SortedMultiSet'解決這個問題的*具體問題? – Marco13
謝謝@ Marco13,這是美國的縣級數據,啓動時間不是問題。我在單個請求中提取了數千個地址,並且需要儘快將它們按縣分組,因此最終用戶體驗很快。 –
這增加了一些重要的信息(這可能是問題的一部分,縮小一點):所以形狀的數量將是~3000。他們將有「相似」的大小。他們會很簡單,並且「大多是凸面的」。也許其他人可以基於此給出提示。我無法在此提出具體建議。我的方法是將其隱藏在一個接口後面(非常簡單,單一方法:'Collection get(Point p)'),並嘗試/測試某些實現。它們中的很多可能可以在現有庫中直接找到。 –
Marco13