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 */
  }

所以我问convertCoordinate 点在屏幕上的什么位置(除非我误解了这种很有可能的方法)。如果坐标不在屏幕上,那么我永远不会将它添加到 mapView。

所以我的问题是,这是确定位置的纬度/经度是否会出现在当前视图中并应添加到地图视图中的正确方法吗?或者我应该以不同的方式做到这一点?

4

3 回答 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);
    }
}
于 2010-02-04T04:47:05.000 回答
5

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

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

    // Do your stuff

}

无需转换回屏幕空间。另外我不确定您尝试这样做的原因,我认为当注释不在屏幕上时不添加注释很奇怪...... MapKit 已经对此进行了优化,并且只创建(和回收)可见的注释视图.

于 2015-10-22T19:12:54.760 回答
2

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

我正在寻找的是一种类似 [mapView isCoordinateInVisibleRegion:myCoordinate] 的方法,但到目前为止,这种方法很快而且看起来很准确。

我还将标题更改为“在可见地图区域中”而不是之前的标题,因为我认为不正确的标题可能会混淆我的意思。

于 2009-08-10T13:09:42.360 回答