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 миль.

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


person pprochazka72    schedule 26.11.2011    source источник


Ответы (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];
person Community    schedule 26.11.2011
comment
ОК, попробую по-другому спросить ... как мне получить координаты границы этого круга: img39.imageshack.us/img39/6346/screenshot20111127at113.png оверлей ??? - person pprochazka72; 28.11.2011

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