如何确定坐标是否在当前可见的地图区域内?

3

我有一个包含数百个位置的列表,只想在屏幕上显示当前可见的MKPinAnnotation。屏幕从用户的当前位置开始,半径为2英里。当然,用户可以滚动和缩放屏幕。目前,我等待地图更新事件,然后循环遍历我的位置列表,并像这样检查坐标:

-(void)mapViewDidFinishLoadingMap:(MKMapView *)mapView {
  CGPoint point;
  CLLocationCoordinate2D coordinate;

  . . .
  /* in location loop */
  coordinate.latitude = [nextLocation getLatitude];
  coordinate.longitude = [nextLocation getLongitude];

  /* Determine if point is in view. Is there a better way then this? */
  point = [mapView convertCoordinate:coordinate toPointToView:nil];
  if( (point.x > 0) && (point.y>0) ) {
    /* Add coordinate to array that is later added to mapView */
  }

我想要将点应该在屏幕上的坐标转换一下(除非我误解了这种方法,这是很有可能的)。如果该坐标不在屏幕上,则我不会将其添加到地图视图中。

我的问题是,这是确定位置的纬度/经度是否出现在当前视图并应该添加到地图视图中的正确方法吗?还是我应该用另一种方式来做这件事?


这对我似乎不起作用。由于某种原因,我的所有对象似乎都匹配。大多数x和y的值非常高。有什么想法吗? - Kevin Elliott
我不确定,我现在正在旅行中,没有Mac电脑可用。首先想到的是检查地图区域。但即使如此,如果该点不在屏幕上(至少在我的测试中),convertCoordinate方法始终返回0。等我回到Mac电脑前再仔细检查一下。 - ryanday
3个回答

7
在你的代码中,应该为toPointToView:选项传递一个视图。我使用了我的mapView。你也需要指定x和y的上限。
这是一些对我有用的代码(在循环注解时告诉我地图上当前可见的注解):
for (Shop *shop in self.shops) {
    ShopAnnotation *ann = [ShopAnnotation annotationWithShop:shop];
    [self.mapView addAnnotation:ann];

    CGPoint annPoint = [self.mapView convertCoordinate:ann.coordinate 
            toPointToView:self.mapView];

    if (annPoint.x > 0.0 && annPoint.y > 0.0 && 
            annPoint.x < self.mapView.frame.size.width && 
            annPoint.y < self.mapView.frame.size.height) {
        NSLog(@"%@ Coordinate: %f %f", ann.title, annPoint.x, annPoint.y);
    }
}

6

我知道这是一个旧的帖子,不确定当时有什么可用的... 但你应该这样做:

// -- Your previous code and CLLocationCoordinate2D init --
MKMapRect visibleRect = [mapView visibleMapRect];
if(MKMapRectContainsPoint(visibleRect, MKMapPointForCoordinate(coordinate))) {

    // Do your stuff

}

不需要转换回屏幕空间。 此外,我不确定你为什么要这样做,我认为在注释不在屏幕上时不添加注释是奇怪的…MapKit已经优化了这一点,并且只创建(和回收)可见的注释视图。


我记得这个项目 :) 不过那么久远的细节我已经记不清了。我想问题可能是我的应用程序只显示应该显示的坐标,所以加载速度更快。也许当时MapKit还没有优化?我想这是iOS4时期。 - ryanday
是的,我认为值得一提的是,这可能不是现在应该采取的方法... 谢谢回复,我很感激。 - Christophe Fondacci
我认为你应该使用MKMapPointForCoordinate(<#CLLocationCoordinate2D coordinate#>)而不是直接使用coordinate - gklka

2

经过一些阅读,我没有找到任何说这是一个坏主意的东西。我在我的应用程序中进行了一些测试,我总是得到正确的结果。当我只添加将显示在当前可见地图区域中的坐标时,应用程序加载速度更快,而不是一次性添加所有的300多个坐标。

我正在寻找的是像[mapView isCoordinateInVisibleRegion:myCoordinate]这样的方法,但到目前为止,这个方法很快并且似乎很准确。

我还将标题更改为“在可见的地图区域内”,而不是以前的标题,因为我认为错误的标题可能会使我的意思混淆。


请问您能否提供一些关于[mapView isCoordinateInVisibleRegion:myCoordinate]的示例代码吗?这样我就可以知道如何在我的应用程序中使用它了。 - Nitin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接