Подтвердить что ты не робот

Преобразование значения span в метры на карте

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

Мне нужна обратная функция MKCoordinateRegionMakeWithDistance для вычисления расстояния, представленного текущим диапазоном карты.

Я пробовал следующий код, но я получаю неправильные результаты:

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    MKMapRect mRect = self.map.visibleMapRect;
    MKMapPoint northMapPoint = MKMapPointMake(MKMapRectGetMidX(mRect), MKMapRectGetMinY(mRect));
    MKMapPoint southMapPoint = MKMapPointMake(MKMapRectGetMidX(mRect), MKMapRectGetMaxY(mRect));

    self.currentDist = MKMetersBetweenMapPoints(northMapPoint, southMapPoint);
}

Если я установил область карты на 1500 метров, я получаю что-то вроде 1800 в результате.

Спасибо за вашу помощь, Винсент

4b9b3361

Ответ 1

На самом деле это была действительно глупая ошибка, если я выполняю ту же операцию вдоль оси X, тогда я получаю правильное значение:

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
MKMapRect mRect = self.map.visibleMapRect;
MKMapPoint eastMapPoint = MKMapPointMake(MKMapRectGetMinX(mRect), MKMapRectGetMidY(mRect));
MKMapPoint westMapPoint = MKMapPointMake(MKMapRectGetMaxX(mRect), MKMapRectGetMidY(mRect));

self.currentDist = MKMetersBetweenMapPoints(eastMapPoint, westMapPoint);
}

Ответ 2

- (void)mapView:(MKMapView *)map regionDidChangeAnimated:(BOOL)animated {
  MKCoordinateSpan span = mapView.region.span;
  NSLog(@" 1 = ~111 km -> %f = ~ %f km ",span.latitudeDelta,span.latitudeDelta*111);
}

В соответствии с документами http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MapKitDataTypesReference/Reference/reference.html,

latitudeDelta​​STRONG >

Количество расстояния между севером и югом (измеренное в градусах) для отображения на карте. В отличие от продольных расстояний, которые варьируются в зависимости от широты, одна градус широты всегда составляет приблизительно 111 километров (69 миль).

Ответ 3

Спасибо за сообщение. У меня есть приложение, требующее радиус в милю, чтобы выяснить, сколько записей местоположения нужно извлечь, чтобы это было удобно. Вот быстрый эквивалент для всех, кто может столкнуться с этим в будущем.

let mRect: MKMapRect = self.mapView.visibleMapRect
        let eastMapPoint = MKMapPointMake(MKMapRectGetMinX(mRect), MKMapRectGetMidY(mRect))
        let westMapPoint = MKMapPointMake(MKMapRectGetMaxX(mRect), MKMapRectGetMidY(mRect))
        let currentDistWideInMeters = MKMetersBetweenMapPoints(eastMapPoint, westMapPoint)
        let milesWide = currentDistWideInMeters / 1609.34  // number of meters in a mile
        println(milesWide)

Ответ 4

Здесь более простой способ (получить ширину и высоту в метрах)...

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {

    MKMapRect rect = mapView.visibleMapRect;

    double mapWidth = MKMapRectGetWidth(rect) / 10;
    double mapHeight = MKMapRectGetHeight(rect) / 10;

}