MKMapView - Масштаб, чтобы соответствовать ближайшим аннотациям вокруг расположения пользователя

Я хочу увеличить свой вид карты, чтобы показать по крайней мере одну аннотацию ближайших аннотаций с максимально возможным увеличением и пользовательским местоположением. Я пробовал следующее:

-(void)zoomToFitNearestAnnotationsAroundUserLocation {


    MKMapPoint userLocationPoint = MKMapPointForCoordinate(self.restaurantsMap.userLocation.coordinate);
    MKCoordinateRegion region;
    if ([self.restaurantsMap.annotations count] > 1) {

        for (id<MKAnnotation> annotation in self.restaurantsMap.annotations) {

          MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
          CLLocationDistance distanceBetweenAnnotationsAndUserLocation = MKMetersBetweenMapPoints(annotationPoint, userLocationPoint);


             region =  MKCoordinateRegionMakeWithDistance(self.restaurantsMap.userLocation.coordinate, distanceBetweenAnnotationsAndUserLocation, distanceBetweenAnnotationsAndUserLocation);


        }

        [self.restaurantsMap setRegion:region animated:YES];

    }



}

Как мне удастся сохранить 2-3 ближайших расстояния и создать регион на основе этой информации?

2 ответа

Если вы разрабатываете для iOS 7 и выше, вы можете просто сохранить массив аннотаций, отсортированных по расстоянию между местоположением пользователя и аннотацией, а затем взять первые 3 аннотации. Если у вас есть те, которые вы можете использовать showAnnotations:animated: который расположит карту так, чтобы все аннотации были видны.

Вот другой способ (взятый отсюда):

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);
    zoomRect = MKMapRectUnion(zoomRect, pointRect);
}
[mapView setVisibleMapRect:zoomRect animated:YES];

//You could also update this to include the userLocation pin by replacing the first line with
MKMapPoint annotationPoint = MKMapPointForCoordinate(mapView.userLocation.coordinate);
MKMapRect zoomRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);

Конечно, вам придется обновить второе решение, чтобы использовать только самые близкие точки аннотации, но вы уже знаете, как их найти, чтобы это не было проблемой.

Храните свои аннотации в массиве

Добавьте эту функцию и измените расстояние по мере необходимости

- (MKCoordinateRegion)regionForAnnotations:(NSArray *)annotations
{
MKCoordinateRegion region;

if ([annotations count] == 0)
{
    region = MKCoordinateRegionMakeWithDistance(_mapView.userLocation.coordinate, 1000, 1000);
}

else if ([annotations count] == 1)
{
    id <MKAnnotation> annotation = [annotations lastObject];
    region = MKCoordinateRegionMakeWithDistance(annotation.coordinate, 1000, 1000);
} else {
    CLLocationCoordinate2D topLeftCoord;
    topLeftCoord.latitude = -90;
    topLeftCoord.longitude = 180;

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

    for (id <MKAnnotation> annotation in annotations)
    {
        topLeftCoord.latitude = fmax(topLeftCoord.latitude, annotation.coordinate.latitude);
        topLeftCoord.longitude = fmin(topLeftCoord.longitude, annotation.coordinate.longitude);
        bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, annotation.coordinate.latitude);
        bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, annotation.coordinate.longitude);
    }

    const double extraSpace = 1.12;
    region.center.latitude = topLeftCoord.latitude - (topLeftCoord.latitude - bottomRightCoord.latitude) / 2.0;
    region.center.longitude = topLeftCoord.longitude - (topLeftCoord.longitude - bottomRightCoord.longitude) / 2.0;
    region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * extraSpace;
    region.span.longitudeDelta = fabs(topLeftCoord.longitude - bottomRightCoord.longitude) * extraSpace;
}

return [self.mapView regionThatFits:region];
}

и называть это так

 MKCoordinateRegion region = [self regionForAnnotations:_locations];
[self.mapView setRegion:region animated:YES];

Теперь масштаб должен соответствовать всем аннотациям в массиве.

Удачи!!

Другие вопросы по тегам