Попытка получить размер пролета в метрах для iOS MKCoordinateSpan

Когда мне нужно сделать MKCoordinateRegionЯ делаю следующее:

var region = MKCoordinateRegion
               .FromDistance(coordinate, RegionSizeInMeters, RegionSizeInMeters);

очень просто - работает отлично.

Теперь я хочу сохранить значение текущего диапазона области. Когда я смотрю на region.Span значение, это MKCoordinateSpan который имеет два свойства:

public double LatitudeDelta;
public double LongitudeDelta;

Как я могу конвертировать LatitudeDelta значение в latitudinalMeters пожалуйста? (Так что тогда я могу воссоздать свой регион (позже), используя вышеуказанный метод...

3 ответа

Решение

Как я вижу, у вас уже есть регион карты. Он содержит не только широту и длину дельты, но и центральную точку региона. Вы можете рассчитать расстояния в метрах, как показано на рисунке:

введите описание изображения здесь

1: Получить область охвата (насколько большой регион в широте / долготе)

MKCoordinateSpan span = region.span;

2: Получить центр региона (координаты широты / долготы)

CLLocationCoordinate2D loc = region.center;

3. Создайте два местоположения (loc1 и loc2, север - юг) на основе местоположения центра и рассчитайте расстояние между ними (в метрах)

//get latitude in meters
CLLocation *loc1 = [[CLLocation alloc] initWithLatitude:(center.latitude - span.latitudeDelta * 0.5) longitude:center.longitude];
CLLocation *loc2 = [[CLLocation alloc] initWithLatitude:(center.latitude + span.latitudeDelta * 0.5) longitude:center.longitude];
int metersLatitude = [loc1 distanceFromLocation:loc2];

4. Создайте два местоположения (loc3 и loc4, запад - восток) на основе местоположения центра и рассчитайте расстояние между ними (в метрах)

//get longitude in meters
CLLocation *loc3 = [[CLLocation alloc] initWithLatitude:center.latitude longitude:(center.longitude - span.longitudeDelta * 0.5)];
CLLocation *loc4 = [[CLLocation alloc] initWithLatitude:center.latitude longitude:(center.longitude + span.longitudeDelta * 0.5)];
int metersLongitude = [loc3 distanceFromLocation:loc4];

Быстрое внедрение решения Hannes:

    let span = mapView.region.span
    let center = mapView.region.center

    let loc1 = CLLocation(latitude: center.latitude - span.latitudeDelta * 0.5, longitude: center.longitude)
    let loc2 = CLLocation(latitude: center.latitude + span.latitudeDelta * 0.5, longitude: center.longitude)
    let loc3 = CLLocation(latitude: center.latitude, longitude: center.longitude - span.longitudeDelta * 0.5)
    let loc4 = CLLocation(latitude: center.latitude, longitude: center.longitude + span.longitudeDelta * 0.5)

    let metersInLatitude = loc1.distanceFromLocation(loc2)
    let metersInLongitude = loc3.distanceFromLocation(loc4)

Основываясь на вышеизложенном, вот полезное расширение, которое я использую в своих картографических проектах:

      extension MKCoordinateRegion {
    public var radius: CLLocationDistance {
        let loc1 = CLLocation(latitude: center.latitude - span.latitudeDelta * 0.5, longitude: center.longitude)
        let loc2 = CLLocation(latitude: center.latitude + span.latitudeDelta * 0.5, longitude: center.longitude)
        let loc3 = CLLocation(latitude: center.latitude, longitude: center.longitude - span.longitudeDelta * 0.5)
        let loc4 = CLLocation(latitude: center.latitude, longitude: center.longitude + span.longitudeDelta * 0.5)
    
        let metersInLatitude = loc1.distance(from: loc2)
        let metersInLongitude = loc3.distance(from: loc4)
        let radius = max(metersInLatitude, metersInLongitude) / 2.0
        return radius
    }
}
Другие вопросы по тегам