[英]how to group points of interest by lat lon for my WP7 app
我有一個自己的PointOfInterest
類(大約1500)的集合,每個類都有自己的Latitude
和Longitude
雙重屬性。
我試圖在我的屏幕上繪制它們,但是在某個邏輯縮放級別,沒有任何一點顯示它們中的一些,因為它們非常接近。
如何通過他們的lat lon屬性非常有效地對POI進行分組?
我有這種類型的東西:
var pointOfInterests = (from p in PointsOfInterest select p).Distinct(new EqualityComparer()).ToList();
EqualityComparer
是:
public class EqualityComparer : IEqualityComparer<PointOfInterest>
{
public bool Equals(PointOfInterest x, PointOfInterest y)
{
return Math.Round(x.Latitude.Value, PointOfInterest.DecimalPlaceFilterLevel) == Math.Round(y.Latitude.Value, PointOfInterest.DecimalPlaceFilterLevel) &&
Math.Round(x.Longitude.Value, PointOfInterest.DecimalPlaceFilterLevel) == Math.Round(y.Longitude.Value, PointOfInterest.DecimalPlaceFilterLevel);
}
public int GetHashCode(PointOfInterest obj)
{
return Math.Round(obj.Latitude.Value, PointOfInterest.DecimalPlaceFilterLevel).GetHashCode() ^ Math.Round(obj.Longitude.Value, PointOfInterest.DecimalPlaceFilterLevel).GetHashCode();
}
}
PointOfInterest.DecimalPlaceFilterLevel
是我在用戶處於certian縮放級別時設置的靜態int屬性。
但這不起作用,我一直在重疊POI並且它不是很快......因為我在打電話,我需要它表現得非常好。
謝謝你提供的所有幫助
您可能想要考慮四叉樹。 這些樹代表一個矩形空間(lat / lon會好的,除非你在北極/南極周圍有很多POI :)),節點的子節點將它細分為四個相等的部分。 Quadtrees有很好的文檔記錄,你找到一個能滿足你需要的算法應該沒有任何問題。
另一方面,一個更簡單的解決方案可能只是一個問題。 想象世界是一個大網格。 您可以根據需要將網格單元格設置為大或小,但最后它只是網格,每個網格單元格包含一組PointOfInterest對象。 將您的POI插入到網格上的適當位置,當您需要時,可以輕松找到要過濾的所有POI。
我用C#代碼做了一個桶(網格)版本的例子。 這應該能夠處理許多點(快速運行時間代碼)。
http://kunuk.wordpress.com/2011/09/15/clustering-grid-cluster
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.