目标 C:如何列出具有最近地理位置的位置集

Posted

技术标签:

【中文标题】目标 C:如何列出具有最近地理位置的位置集【英文标题】:Objective C: How to list set of locations with the nearest geolocation 【发布时间】:2011-05-06 05:51:53 【问题描述】:

我编制了一份包含经纬度信息的地点列表。我可以根据我当前的位置检查在表格和地图视图中过滤和填充“最近”地理位置列表的最佳方法是什么? (或用户输入的目的地)。也可以指出我感兴趣的半径是多少?例如只选择距离我所在位置 5 公里内的所有最近的书店等

感谢您对此的建议

郑和

【问题讨论】:

【参考方案1】:

也许我遗漏了一些东西,但您为什么不直接将您的位置添加到 mapView 中,然后将地图置于用户当前位置或他们想要的任何位置的中心? MapKit 将为您完成所有计算,并且只显示靠近中心的那些。用户可以通过放大和缩小设置自己的半径。 MapKit 正是为此目的进行了高度优化,这就是您可以实时看到“针雨”的方式。

更新: 您也可以采用另一种方式:一旦您在地图上获得了注释,您就可以在地图上查询可见区域中的那些注释:

- (NSSet *)annotationsInMapRect:(MKMapRect)mapRect

来自文档:

此方法提供了一种快速检索地图特定部分中的注释对象的方法。此方法比您自己对 annotations 属性中的对象进行线性搜索要快得多

【讨论】:

@Mike,这听起来像我需要的:)。我可以和你核实一下如何触发这个吗?我可以在启动时将所有注释添加到 mapView(大约 1000+),我如何不显示所有 1000,而只显示用户位置附近的那些?我现在正在使用核心数据来存储我想要显示的地方的所有坐标。谢谢! 你可以用setRegion:指定地图的显示区域,以用户所在的位置为中心,地图只会显示在可见区域内。设置跨度以调整有效缩放级别。 @Mike,谢谢!我可以确认我应该如何实施该方法吗?我做了这样的事情 NSSet *nearby = [self annotationsInMapRect:self.mapView.frame];但这会导致程序崩溃。我在这里做错了什么? 你正在传递一个 self.mapView.frame,它是一个 CGRect(它在内部使用 CGFloat),你需要传递一个 MKMapRect(它在内部使用双精度)。在文档中查找 MKMapRect。 P.S.每当您说“它崩溃了”时,您还应该提供有关它崩溃的方式和位置的信息;事情崩溃的方式有无数种。【参考方案2】:

您可能会发现- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location 非常有用 http://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLLocation_Class/CLLocation/CLLocation.html#//apple_ref/occ/instm/CLLocation/distanceFromLocation:

【讨论】:

【参考方案3】:

haversine formula 经常用于导航计算坐标之间的距离。 This 是一个相当不错的距离计算资源,甚至还有一个用于 hasrsine 的代码示例(尽管它是在 javascript 中的)。

如果您的位置列表相对较小(甚至数百个),您可能只需遍历整个列表并计算每个位置与当前位置之间的距离。

【讨论】:

如果列表很大,有几千个,您可以使用 dispatch_async 遍历它们,并在完成时通知委托。 :) @Radek,是的,我的列表可能会非常庞大​​(1000 +),即使我做多线程也会太慢吗? 不,iPhone 的处理器速度很快。

以上是关于目标 C:如何列出具有最近地理位置的位置集的主要内容,如果未能解决你的问题,请参考以下文章

您将如何转换具有可变 ID 位置数量的表,以使位置成为列?

Visual Studio 2010 发布具有相对路径的配置文件目标位置

给定两个位置,如何从谷歌地图获取所有纬度和经度

返回与用户位置(地理位置)最近的 3 个位置并为他们列出这些位置

Linux指令集

如何在iOS(目标C)中将字符从一个位置修剪到另一个位置?