如何通过lat lon为我的WP7应用程序分组兴趣点

时间:2011-03-29 22:16:24

标签: c# linq windows-phone-7 geolocation

我有一个自己的PointOfInterest类(大约1500)的集合,每个类都有自己的LatitudeLongitude双重属性。

我试图在我的屏幕上绘制它们,但是在某个逻辑缩放级别,没有任何一点显示它们中的一些,因为它们非常接近。

如何通过他们的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并且它的速度不是很快......因为我在打电话,我需要它才能表现得很好。

感谢您提供任何帮助

2 个答案:

答案 0 :(得分:2)

您可能需要考虑四叉树。这些树代表一个矩形空间(lat / lon会好的,除非你在北极/南极周围有很多POI :)),节点的子节点将它细分为四个相等的部分。 Quadtrees有很好的文档记录,你找到一个能满足你需要的算法应该没有任何问题。

另一方面,一个更简单的解决方案可能只是一个问题。想象世界是一个大网格。您可以根据需要将网格单元格设置为大或小,但最后它只是网格,每个网格单元格包含一组PointOfInterest对象。将您的POI插入网格上的适当位置,当您需要时,可以轻松找到您想要过滤的所有POI。

答案 1 :(得分:0)

我用C#代码做了一个bucket(grid)版本的例子。 这应该能够处理许多点(快速运行时间代码)。

http://kunuk.wordpress.com/2011/09/15/clustering-grid-cluster