Преобразование значения 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 в результате.
Спасибо за вашу помощь,
Винсент
Ответы
Ответ 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,
latitudeDeltaSTRONG >
Количество расстояния между севером и югом (измеренное в градусах) для отображения на карте. В отличие от продольных расстояний, которые варьируются в зависимости от широты, одна градус широты всегда составляет приблизительно 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;
}