根据位置列表缩放 MKMapView 以最适合距离缩放级别

Nei*_*ard 3 mkmapview ios

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

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

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

谢谢
索伦

Nei*_*ard 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;
}
Run Code Online (Sandbox Code Playgroud)

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

-(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];
}
Run Code Online (Sandbox Code Playgroud)

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

最好的问候
Søren