Расположение MKMapView для показа нескольких аннотаций сразу

Dicts не может быть отсортирован, но можно создать отсортированный список от них.

А отсортировал список значений dict:

sorted(d.values())

список А (ключ, значение) пары, отсортированные по значению:

from operator import itemgetter
sorted(d.items(), key=itemgetter(1))
91
задан TheNeil 24 May 2019 в 05:40
поделиться

2 ответа

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

Это, конечно, будет медленнее, чем больше вы добавляете аннотаций.

2
ответ дан 24 November 2019 в 06:35
поделиться

Я сделал что-то похожее на это, чтобы уменьшить (или увеличить) область, которая включала аннотацию точки и текущее местоположение. Вы можете расширить это, перебирая свои аннотации.

Основные шаги:

  • Вычислить мин. Широту / долготу
  • Вычислить макс. Широту / долготу
  • Создать объекты CLLocation для этих двух точек
  • Вычислить расстояние между точками
  • Создание области с использованием центральной точки между точками и расстоянием преобразовано to degrees
  • Pass region into MapView to adjust
  • Use adjusted region to set MapView region
    -(IBAction)zoomOut:(id)sender {

        CLLocationCoordinate2D southWest = _newLocation.coordinate;
        CLLocationCoordinate2D northEast = southWest;

        southWest.latitude = MIN(southWest.latitude, _annotation.coordinate.latitude);
        southWest.longitude = MIN(southWest.longitude, _annotation.coordinate.longitude);

        northEast.latitude = MAX(northEast.latitude, _annotation.coordinate.latitude);
        northEast.longitude = MAX(northEast.longitude, _annotation.coordinate.longitude);

        CLLocation *locSouthWest = [[CLLocation alloc] initWithLatitude:southWest.latitude longitude:southWest.longitude];
        CLLocation *locNorthEast = [[CLLocation alloc] initWithLatitude:northEast.latitude longitude:northEast.longitude];

        // This is a diag distance (if you wanted tighter you could do NE-NW or NE-SE)
        CLLocationDistance meters = [locSouthWest getDistanceFrom:locNorthEast];

        MKCoordinateRegion region;
        region.center.latitude = (southWest.latitude + northEast.latitude) / 2.0;
        region.center.longitude = (southWest.longitude + northEast.longitude) / 2.0;
        region.span.latitudeDelta = meters / 111319.5;
        region.span.longitudeDelta = 0.0;

        _savedRegion = [_mapView regionThatFits:region];
        [_mapView setRegion:_savedRegion animated:YES];

        [locSouthWest release];
        [locNorthEast release];
    }
44
ответ дан 24 November 2019 в 06:35
поделиться