我有一个自己的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并且它的速度不是很快......因为我在打电话,我需要它才能表现得很好。
感谢您提供任何帮助
答案 0 :(得分:2)
您可能需要考虑四叉树。这些树代表一个矩形空间(lat / lon会好的,除非你在北极/南极周围有很多POI :)),节点的子节点将它细分为四个相等的部分。 Quadtrees有很好的文档记录,你找到一个能满足你需要的算法应该没有任何问题。
另一方面,一个更简单的解决方案可能只是一个问题。想象世界是一个大网格。您可以根据需要将网格单元格设置为大或小,但最后它只是网格,每个网格单元格包含一组PointOfInterest对象。将您的POI插入网格上的适当位置,当您需要时,可以轻松找到您想要过滤的所有POI。
答案 1 :(得分:0)
我用C#代码做了一个bucket(grid)版本的例子。 这应该能够处理许多点(快速运行时间代码)。
http://kunuk.wordpress.com/2011/09/15/clustering-grid-cluster