的MKMapView。寻找有三个散点的区域

时间:2014-08-11 02:17:38

标签: ios mkmapview mkcoordinateregion

我试图在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];

    }
 }

1 个答案:

答案 0 :(得分:1)

在编辑过的代码中,尝试缩小一点&#34;比计算的MKMapRect没有效果,因为:

  1. 调用MKCoordinateRegionForMapRect时,它会传递annotationMapRect(单个注释的矩形)而不是showMapRect(所有注释的矩形)。
  2. 跨度增量设置为固定值,而不是从showMapRect获取范围并稍微扩展(我将其乘以1.1)。
  3. 使用&#34;缩小区域&#34;调用setRegion后,代码再次使用原始setVisibileMapRect调用showMapRect,这会撤消缩小区域的所有工作。
  4. 您可以在修复上述内容后使用setRegion缩小一点,但您已经发现的更简单的方法是使用setVisibleMapRect:edgePadding:animated:而不是setVisibleMapRect:


    关于mapViewDidFailLoadingMap的问题:

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

    但无论原因如何,如果您必须让用户知道地图无法加载,我的建议是使用UILabel代替UIAlertView

    每次地图视图加载时都不会让用户点按“确定”,而是在地图视图失败/完成加载时显示/隐藏标签。

    这样,用户就会被警告&#34;但是他们不必经常点击OK。

    这可能会给用户带来更愉悦的体验。

    使标签成为地图视图是子视图的同一视图的子视图。也就是说,让他们成为兄弟姐妹。不要将标签作为地图视图的子视图。最初将标签设置为&#34;隐藏&#34;或者将alpha设置为0,这样您就可以在委托方法中为标签显示/隐藏设置动画。您可以将标签放在地图视图的前面(如果屏幕上没有空间),而不是地图视图的子