如何按纬度对我的 WP7 应用程序的兴趣点进行分组

Posted

技术标签:

【中文标题】如何按纬度对我的 WP7 应用程序的兴趣点进行分组【英文标题】:how to group points of interest by lat lon for my WP7 app 【发布时间】:2011-03-29 22:16:24 【问题描述】:

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

我试图在我的屏幕上绘制它们,但在一定的逻辑缩放级别上,显示其中一些是没有意义的,因为它们靠得很近。

我怎样才能通过它们的纬度属性非常有效地对 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 是我在用户处于特定缩放级别时设置的静态 int 属性。

但这不起作用,我不断得到重叠的 POI,而且速度不是很快……因为我在打电话,所以我需要它来表现得非常好。

感谢您提供的任何帮助

【问题讨论】:

也可能会产生一些好的答案。 谢谢,我刚刚在那里发布了同样的问题:) 如果我得到答案,那么我一定会在这里发布 【参考方案1】:

您可能需要考虑四叉树。这些树代表一个矩形空间(纬度/经度很好,除非您在北极/南极周围有很多 POI :)),并且节点的子节点将其细分为四个相等的部分。四叉树有据可查,您应该可以轻松找到满足您需要的算法。

另一方面,一个更简单的解决方案可能只是分桶。把世界想象成一个大网格。您可以根据需要将网格单元设置为大或小,但最终它只是网格,每个网格单元都包含一个 PointOfInterest 对象的集合。将您的兴趣点插入到网格上的适当位置,当您需要时,很容易找到您想要过滤的所有兴趣点。

【讨论】:

好的,感谢您的回复,我正在研究四叉树。它们看起来相当复杂...... 是的,这是他们的缺点。 :) 如果你只有 1500 个 POI,我会选择桶。基本上数据结构就是: 糟糕,那条评论搞砸了 :) 是的,这是他们的缺点。 :) 如果你只有 1500 个 POI,我会选择桶。基本上数据结构就是:List&lt;PointOfInterest&gt;[,] buckets = new List&lt;PointOfInterest[XCells,YCells]; 然后迭代数组并分配每个列表对象。要找到特定 POI 的存储桶,它看起来像这样(即兴发挥):buckets[(poi.Lat+90)/180*XCells,poi.Lon/360*YCells].Add(poi); 然后,当您搜索附近的 POI 时,您只需要考虑与您所在位置足够近的存储桶有兴趣。【参考方案2】:

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

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

【讨论】:

您的解决方案有 2013/2015 年的项目吗?

以上是关于如何按纬度对我的 WP7 应用程序的兴趣点进行分组的主要内容,如果未能解决你的问题,请参考以下文章

iphone iOS mapkit,按最近点过滤点列表(经度,纬度)

如何在wp7中找到一个地方的经纬度

Jekyll/Liquid 模板:如何按年份对博客文章进行分组?

如何创建启动器来对我的 Jumplists 进行分组

按分组列求和值

Swift 2 MapKit Annotations - 如何对注释进行分组?