Преобразование координат долготы / широты в декартовы координаты в MKMapView
У меня есть три точки A, B и P, которые все определены их координатами долготы / широты.
Сейчас я пытаюсь реализовать алгоритм (см. Также http://lukagabric.com/distance-from-point-to-line-segment/), чтобы вычислить кратчайшее расстояние между точкой P и линия AB:
CLLocationCoordinate2D a;
CLLocationCoordinate2D b;
CLLocationCoordinate2D p;
a.latitude = 3;
a.longitude = 3;
b.latitude = 3.01;
b.longitude = 3.01;
p.latitude = 11;
p.longitude = 11;
CGPoint A = [mapView convertCoordinate:a toPointToView:mapView];
CGPoint B = [mapView convertCoordinate:b toPointToView:mapView];
CGPoint P = [mapView convertCoordinate:p toPointToView:mapView];
if ((P.x - A.x) * (B.x - A.x) + (P.y - A.y) * (B.y - A.y) < 0) {
return sqrt(pow((P.x - A.x), 2) + pow((P.y - A.y), 2));
}
else if((P.x - B.x) * (A.x - B.x) + (P.y - B.y) * (A.y - B.y) < 0) {
return sqrt(pow(P.x - B.x, 2) + pow(P.y - B.y, 2));
}
else {return ABS((P.x * (A.y - B.y) + P.y * (B.x - A.x) + (A.x * B.y - B.x * A.y)) / sqrt(pow(B.x - A.x, 2) + pow(B.y - A.y, 2)));
}
Алгоритм должен быть в порядке. Но, вероятно, мое преобразование из долготы / широты в декартовы координаты неверно. Мой код использует встроенную функцию target-c:
(CGPoint)convertCoordinate:(CLLocationCoordinate2D)coordinate
toPointToView:(NSView *)view
Такой подход кажется неправильным, потому что результат (48) сильно отличается от ожидаемого расстояния (около 1252000 метров). Кто-нибудь знает, где мое преобразование из долготы / широты в декартовы координаты неверно? Вероятно, преобразованные декартовы координаты должны быть расширены.