如何按纬度对我的 WP7 应用程序的兴趣点进行分组
Posted
技术标签:
【中文标题】如何按纬度对我的 WP7 应用程序的兴趣点进行分组【英文标题】:how to group points of interest by lat lon for my WP7 app 【发布时间】:2011-03-29 22:16:24 【问题描述】:我有自己的 PointOfInterest
类(大约 1500 个)集合,每个类都有自己的 Latitude
和 Longitude
双重属性。
我试图在我的屏幕上绘制它们,但在一定的逻辑缩放级别上,显示其中一些是没有意义的,因为它们靠得很近。
我怎样才能通过它们的纬度属性非常有效地对 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,而且速度不是很快……因为我在打电话,所以我需要它来表现得非常好。
感谢您提供的任何帮助
【问题讨论】:
您可能需要考虑四叉树。这些树代表一个矩形空间(纬度/经度很好,除非您在北极/南极周围有很多 POI :)),并且节点的子节点将其细分为四个相等的部分。四叉树有据可查,您应该可以轻松找到满足您需要的算法。
另一方面,一个更简单的解决方案可能只是分桶。把世界想象成一个大网格。您可以根据需要将网格单元设置为大或小,但最终它只是网格,每个网格单元都包含一个 PointOfInterest 对象的集合。将您的兴趣点插入到网格上的适当位置,当您需要时,很容易找到您想要过滤的所有兴趣点。
【讨论】:
好的,感谢您的回复,我正在研究四叉树。它们看起来相当复杂...... 是的,这是他们的缺点。 :) 如果你只有 1500 个 POI,我会选择桶。基本上数据结构就是: 糟糕,那条评论搞砸了 :) 是的,这是他们的缺点。 :) 如果你只有 1500 个 POI,我会选择桶。基本上数据结构就是:List<PointOfInterest>[,] buckets = new List<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,按最近点过滤点列表(经度,纬度)