MKCoordinateRegion расстояние между центром и границами - PullRequest
4 голосов
/ 26 ноября 2011

(пересмотренный вопрос на основе комментария:)

ОК. Попробую спросить другим способом ... Как получить координаты границы наложения этого круга:

enter image description here


(Оригинальный вопрос:)

У меня странная проблема с приложением для 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 миль.

Снимок экрана:

enter image description here

Почему такая разница?Когда я пытался сделать то же самое, но с разных координат центра (Токио, Нью-Йорк), результат был правильным 10 миль.

Спасибо за ответ

Ответы [ 2 ]

3 голосов
/ 26 ноября 2011

(пересмотренный ответ на основе комментария:)

Если вы хотите получить координаты ограничивающего прямоугольника для этого наложения круга, используйте свойство 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];
0 голосов
/ 17 января 2012

На скриншоте веб-формы вы получаете другое расстояние, потому что измеряемая вами линия (от центра до 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]; 
...