MKCoordinateRegion расстояние между центром и границами
(Пересмотренный вопрос основан на комментарии:)
ОК, я попытаюсь спросить по-другому... Как я могу получить координаты границы наложения этого круга:
(Оригинальный вопрос:)
У меня странная проблема с моим приложением для iPhone. У меня есть MKCoordinateRegion, который имеет широту центра координат: 51.509980 и долготу: -0.133700. Я использовал метод MKCoordinateRegionMakeWithDistance и установил расстояние в 16 093,44 метра (10 миль).
Я хочу получить границу этого региона, поэтому у меня есть этот код:
MKCoordinateRegion region2 = self.myMapView.region;
float minLat = region2.center.latitude - (region2.span.latitudeDelta / 2.0);
float maxLat = region2.center.latitude + (region2.span.latitudeDelta / 2.0);
float minLong = region2.center.longitude - (region2.span.longitudeDelta / 2.0);
float maxLong = region2.center.longitude + (region2.span.longitudeDelta / 2.0);
Я нашел этот сайт для моего тестирования http://boulter.com/gps/distance/ который рассчитывает расстояние между двумя координатами. Когда я ввожу как координату ОТ: 51.509980 и долготу: -0.133700 (Лондон) и координату ТО:
2011-11-26 01:15:42.830 NearMeTest[3911:11603] MinLAT 51.334381 and MaxLAT 51.684814
2011-11-26 01:15:42.830 NearMeTest[3911:11603] MinLONG -0.352936 and MaxLONG 0.086517
Я понял, что расстояние между этими двумя координатами составляет 15,40 мили вместо ожидаемых 10 миль.
Скриншот:
Почему такая разница? Когда я пытался сделать то же самое, но с разных координат центра (Токио, Нью-Йорк), результат был правильным, 10 миль.
Спасибо за ответ
2 ответа
(Пересмотренный ответ на основе комментария:)
Если вы хотите получить координаты ограничивающего прямоугольника для наложения круга, используйте наложение boundingMapRect
имущество:
//"theCircle" is the MKCircle overlay object
CLLocationCoordinate2D topLeftCoord =
MKCoordinateForMapPoint(theCircle.boundingMapRect.origin);
MKMapPoint bottomRightMapPoint = MKMapPointMake (
MKMapRectGetMaxX(theCircle.boundingMapRect),
MKMapRectGetMaxY(theCircle.boundingMapRect));
CLLocationCoordinate2D bottomRightCoord =
MKCoordinateForMapPoint(bottomRightMapPoint);
(Оригинальный ответ:)
Во-первых, когда вы звоните setRegion
на виде карты вид карты почти всегда изменяет запрошенный регион, чтобы он соответствовал виду карты. Эта корректировка основана на форме представления карты и на том, может ли она правильно отображать запрошенный диапазон на одном из фиксированных уровней масштабирования.
Например, если ваш вид карты не квадратный, и вы просите пролет в 10 миль в обоих направлениях, по крайней мере, один из них определенно будет скорректирован. Даже если вы попросите интервал, который вы установили на основе пропорций вида, он все равно может быть скорректирован, если вид карты не может отображать плитки с таким уровнем масштабирования (или, возможно, если вы не взяли Землю кривизна во внимание).
Далее latitudeDelta
а также longitudeDelta
определить всю высоту и ширину области (не расстояние от центральной координаты).
Таким образом, ваш тест на скриншоте нельзя сравнивать с дельтой диапазона. На снимке экрана вы вычисляете расстояние от центральной координаты до минимальной широты и долготы (нижний левый угол), но дельты пролета проходят весь путь справа налево и снизу вверх. (Из-за этого можно подумать, что расстояние от центра до угла должно быть меньше дельты - не больше. Оно короче, но дельта также увеличилась до более чем 10 из-за причин, описанных выше.)
Наконец, чтобы получить угловые координаты (внизу слева и вверху справа), это, вероятно, более точный способ сделать это:
CLLocationCoordinate2D bottomLeftCoord =
[myMapView convertPoint:CGPointMake(0, myMapView.frame.size.height)
toCoordinateFromView:myMapView];
CLLocationCoordinate2D topRightCoord =
[myMapView convertPoint:CGPointMake(myMapView.frame.size.width, 0)
toCoordinateFromView:myMapView];
На скриншоте веб-формы вы получаете другое расстояние, потому что измеряемая вами линия (от центра до MinLAT / MinLONG) диагональна и выходит за пределы радиуса круга.
Если вы будете следовать ответу @AnnaKarenina, вы можете получить расстояние в метрах, конвертировав каждое CLLocationCoordinate2D
в CLLocation
,
Вот как бы вы получили радиус в милях:
CLLocation * centerLeftLocation = [[CLLocation alloc]
initWithLatitude:centerCoord.latitude
longitude:topLeftCoord.longitude];
CLLocation * centerLocation = [[CLLocation alloc]
initWithLatitude:centerCoord.latitude
longitude:centerCoord.longitude];
CLLocationDistance distanceInMeters = [centerLeftLocation distanceFromLocation:centerLocation];
float distanceInMiles = distanceInMeters / 1609.344f;
[centerLeftLocation release];
[centerLocation release];