MKMapView.寻找有三个分散点的区域



我试图在MKMapView上绘制多个点。在两个直线点之间,这很容易——我只需要找到中间坐标并使用它们:

// Center
CLLocationCoordinate2D center;
center.latitude = self.midLatitude;
center.longitude = self.midLongitude;
myRegion.center = center;

但是如果我在地图上有洛杉矶,华盛顿特区和西雅图呢?我有我自己的代码,计算基于第一个和最后一个坐标在数组的中心。在上面的例子中,我只看到了洛杉矶和西雅图。

有没有别的方法来确定三个点之间的中心?

谢谢!

编辑:

新增MKMapRect代码:

-(void) addAnnotation {
MKMapRect showMapRect = MKMapRectNull;
CLLocationCoordinate2D mapLocation;
IGAMapAnnotation *mapAnnotation;
// Calculate how many points are included in the plan
NSInteger numberOfPoints = [coordinatesTempArray count];
MKMapPoint annotationMapPoint;
MKMapRect annotationMapRect;
if (numberOfPoints > 0) {
    // Trying to add coordinates from the array of coordinates
    for (NSInteger i=0; i < ([coordinatesTempArray count]); i++) {
        ... // Code that adds annotations
        // Adding the annotation to the array that will be added to the map
        [mapLocations addObject:mapAnnotation];
        // Adding Annotation coordinates to MKMapRect so that they all be visible in the view
        annotationMapPoint = MKMapPointForCoordinate(mapLocation);
        annotationMapRect = MKMapRectMake(annotationMapPoint.x, annotationMapPoint.y, 0, 0);
        showMapRect = MKMapRectUnion(showMapRect, annotationMapRect);
        }       
    }
    // Showing all annotations at a time
    self.mapView.visibleMapRect = showMapRect;
    // Now I am trying to zoom out a bit since the extreme annotation are right at the border of the mapview. THIS DOES NOT WORK.
    MKCoordinateRegion region;
   region = MKCoordinateRegionForMapRect(annotationMapRect);
    MKCoordinateSpan span;
    span.latitudeDelta = 0.09;
    span.longitudeDelta = 0.09;
    region.span = span;
    region = [self.mapView regionThatFits:region];
    [self.mapView setRegion:region animated:YES];

    // Showing all annotations at a time
    self.mapView.visibleMapRect = showMapRect;

    // Adding annotations to the map
    [self.mapView addAnnotations:mapLocations];
    }
 }

在编辑的代码中,试图"缩小一点"比计算的MKMapRect不起作用,因为:

  1. 当调用MKCoordinateRegionForMapRect时,它传递annotationMapRect(单个注释的rect)而不是showMapRect(所有注释的rect)。
  2. 跨度增量设置为固定值,而不是从showMapRect中获取跨度并扩展它一点(我将其乘以1.1)。
  3. 在使用"缩小区域"调用setRegion之后,代码再次使用原始showMapRect调用setVisibileMapRect,这将取消所有使用缩小区域的工作。

你可以用setRegion来缩小一点,但是你已经发现的更简单的方法是用setVisibleMapRect:edgePadding:animated:来代替setVisibleMapRect:


关于mapViewDidFailLoadingMap的问题:

很难说为什么地图在你的特定情况下无法加载。

但无论原因是什么,如果你必须让用户知道地图加载失败,我的建议是使用UILabel而不是UIAlertView

与其让用户在每次地图视图加载出现问题时点击OK,不如在地图视图加载失败/完成加载时显示/隐藏标签。

这样,用户会被"提醒",但他们不会因为不断点击OK而烦恼。

这可能会给用户一个更愉快的体验。

使标签成为地图视图所属的同一视图的子视图。也就是说,让他们成为兄弟姐妹。不要让标签成为地图视图的子视图。将标签初始设置为"hidden"或将alpha设置为0,以便您可以在委托方法中动画显示/隐藏标签。你可以把标签放在地图视图的前面(如果屏幕上没有空间的话),但不能放在地图视图的子视图中。

的例子:

//initialize label alpha to 0 in viewDidLoad...
mapLoadFailedLabel.alpha = 0;
-(void)mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error
{
    [UIView animateWithDuration:0.5 animations:^{
        mapLoadFailedLabel.alpha = 1.0;
    }];
}
-(void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
{
    [UIView animateWithDuration:0.5 animations:^{
        mapLoadFailedLabel.alpha = 0.0;
    }];
}

相关内容

  • 没有找到相关文章

最新更新