3

我有一个要MKMapView缩放的中心位置以及一个位置列表(纬度/经度)。我想根据这个位置列表设置缩放级别(距离),以便MKMapView在同一时间可以看到尽可能多的这些位置,但具有最小缩放级别(或最大距离),这样我MKMapView就不会缩放太多了。

因此,假设我有一个包含 10 个位置的列表,但其中一个位置离我的中心位置太远,如果我在上面显示一个位置,MKMapView它将被缩小很多,我如何计算距离参数MKCoordinateRegionMakeWithDistance

我希望我能很好地解释我的问题,我认为我很难解释它。


谢谢索伦_

4

5 回答 5

5

我让它与以下解决方案一起工作。

我使用大圆距离公式来计算我的中心点和所有找到的纬度/经度点之间的距离,如果这个距离大于我的最小距离和我的最大距离并且大于我设置的“最后找到的距离”这个距离就是我的变焦距离。它就像一个魅力,实际上很简单。

这是我的距离计算代码:

-(double)distanceBetweenLocations:(CLLocationCoordinate2D)c1 :(CLLocationCoordinate2D)c2 {
    int r = 6371 * 1000;//meters
    double dLat = (c2.latitude - c1.latitude) * M_PI / 180;
    double dLon = (c2.longitude - c1.longitude) * M_PI / 180;
    double lat1 = c1.latitude * M_PI / 180;
    double lat2 = c2.latitude * M_PI / 180;

    double a = sin(dLat / 2) * sin(dLat / 2) + sin(dLon / 2) * sin(dLon / 2) * cos(lat1) * cos(lat2);
    double c = 2 * atan2(sqrt(a), sqrt(1 - a));
    double d = r * c;

    return d;
}

这是我的代码,它使用计算出的距离缩放到我的中心点:

-(void)zoomToLocation {
    double MAX_DISTANCE = 10000.0;
    double MIN_DISTANCE = 600.0;

    double zoomDistance = MIN_DISTANCE;

    CLLocationCoordinate2D center;
    center.latitude = self.searchLocationLatitude;
    center.longitude = self.searchLocationLongitude;
    BOOL treaterVisible = NO;
    for (Treater *treater in treaters) {
        CLLocationCoordinate2D c2;
        c2.latitude = treater.latitude;
        c2.longitude = treater.longitude;
        double distance = [self distanceBetweenLocations:center :c2];
        if(distance > zoomDistance && distance < MAX_DISTANCE) {
            zoomDistance = distance;
            treaterVisible = YES;
        }
    }

    if(!treaterVisible) {
        zoomDistance = MAX_DISTANCE;
    }

    CLLocationCoordinate2D location;
    location.latitude = self.searchLocationLatitude;
    location.longitude = self.searchLocationLongitude;

    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(location, zoomDistance, zoomDistance);
    MKCoordinateRegion adjustedRegion = [self.mapView regionThatFits:region];
    [self.mapView setRegion:adjustedRegion];
}

只是如果有人需要类似的东西。

最好的问候
索伦

于 2013-02-11T09:21:57.963 回答
0

编辑 didAddAnnotationViews 方法。我希望这是你正在寻找的,

-(void) mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views
{
MKMapRect zoomRect = MKMapRectNull;
for (id <MKAnnotation> annotation in mapView.annotations)
{

        MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
        MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);
        if (MKMapRectIsNull(zoomRect)) {
            zoomRect = pointRect;
        } else {
            zoomRect = MKMapRectUnion(zoomRect, pointRect);
        }
}
[mapView setVisibleMapRect:zoomRect animated:YES];
}
于 2013-02-08T12:05:27.703 回答
0

DDAnnotation 是显示引脚的自定义类(PlaceMark)

-(void)zoomToFitMapAnnotations:(MKMapView*)mapView
{
    if([mapView.annotations count] == 0)
        return;

    CLLocationCoordinate2D topLeftCoord;
    topLeftCoord.latitude = -90;
    topLeftCoord.longitude = 180;

    CLLocationCoordinate2D bottomRightCoord;
    bottomRightCoord.latitude = 90;
    bottomRightCoord.longitude = -180;

    for(DDAnnotation* annotation in mapView.annotations)
    {
        topLeftCoord.longitude = fmin(topLeftCoord.longitude, annotation.coordinate.longitude);
        topLeftCoord.latitude = fmax(topLeftCoord.latitude, annotation.coordinate.latitude);

        bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, annotation.coordinate.longitude);
        bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, annotation.coordinate.latitude);

    }

    NSLog(@"A%f, B%f, C%f, D%f,", topLeftCoord.latitude, topLeftCoord.longitude, bottomRightCoord.latitude, bottomRightCoord.longitude);

    MKCoordinateRegion region;
    region.center.latitude = topLeftCoord.latitude - (topLeftCoord.latitude - bottomRightCoord.latitude) * 0.5;
    region.center.longitude = topLeftCoord.longitude + (bottomRightCoord.longitude - topLeftCoord.longitude) * 0.5;
    region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 1.1;
    region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 1.1;

    region = [mapView regionThatFits:region];
    [mapView setRegion:region animated:YES];
}
于 2013-02-08T12:08:56.347 回答
0

几天前,我在一本书中读到了您问题的解决方案,我认为它是 Preparata Shamos,计算几何。

不幸的是,解决方案是复杂的:问题是:找到在给定半径内可见的最佳/最大点子集。

如果您的点数不高,少于一万,我会按如下方式进行
0)将所有点添加到当前选定的子集中。
1)遍历所有点insubset,calcualte重力点,计算到重力点的所有距离,它是否适合最大缩放级别所需的距离?是的,准备好了。
2) 不是吗?从子集中删除距离最大的点,然后再次执行步骤 1。这样做直到所有点都在距当前子集中心所需的距离内。

重力点是子集中具有平均 x(或经度)和平均 y(或纬度)坐标的点。

(如果接受请不要点赞)

于 2013-02-08T12:36:36.950 回答
0

为此,我们需要找到最小和最大纬度和经度,然后我们需要制作这些纬度和经度之和的平均区域。然后将该区域分配给地图视图并在其上拟合该区域。就是这样。

于 2013-04-27T08:20:37.210 回答