Понимание поведения MKCoordinateFromMapPoint - PullRequest
2 голосов
/ 21 февраля 2012

В приложении на основе местоположения мы используем MKMapPoints для хранения местоположений, например, текущего местоположения пользователя.

Когда мы пытаемся использовать это местоположение в MKMapView, чтобы установить регион, который первоначально отображается (увеличенный для пользователя), мы конвертируем его в CLLocationCoordinate2D

Для этого есть метод согласования: namenly: MKCoordinateForMapPoint, но во время тестирования это дает странные результаты.

  MKMapPoint mapPoint = MKMapPointMake(51.96, 6.3); // My area ;)
  CLLocationCoordinate2D automagicCoordinate = MKCoordinateForMapPoint(mapPoint);
  CLLocationCoordinate2D manualCoordinate = CLLocationCoordinate2DMake(mapPoint.x, mapPoint.y);

Я бы ожидал, что как autogicCoordinate, так и manualCoordinate будут совершенно одинаковыми. но когда я проверяю это в отладчике, я получаю следующий результат:

automagicCoordinate.latitude = (CLLocationDegrees) 85.05
automagicCoordinate.longitude = (CLLocationDegrees) -179.99

manualCoordinate.latitude = (CLLocationDegrees) 51.96
manualCoordinate.longitude = (CLLocationDegrees) 6.3

Почему координата, созданная методом, неверна?

1 Ответ

7 голосов
/ 21 февраля 2012

MKMapPoint - это не широта и долгота.Если бы это было так, вам не понадобилась бы функция для «преобразования» ее в координаты.

Как объясняется в Руководстве по программированию для определения местоположения в разделе Общие сведения о геометрии карты :

Точка карты - это значения x и y на проекции карты Меркатора.Точки карты используются для многих связанных с картой вычислений вместо координат карты, потому что они упрощают математику, вовлеченную в вычисления.

Документация для MKMapPoint более ясна:

Если вы спроецируете изогнутую поверхность земного шара на плоскую поверхность, вы получите двумерную версию карты, где линии долготы кажутся параллельными....

Фактические единицы в точке карты привязаны к базовым единицам, используемым для рисования содержимого MKMapView, но вам никогда не придется беспокоиться об этих единицах напрямую....

При сохранении данных, связанных с картой, в файл всегда следует сохранять значения координат (широта и долгота), а не точки карты.

Точка карты 51.96, 6.3соответствует координате в верхнем левом углу проекции карты.Если вы хотите работать с координатами (широта, долгота), используйте CLLocationCoordinate2D, чтобы избежать путаницы.

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

...