Сопоставьте координаты GPS с изображением и нарисуйте на нем несколько точек GPS - PullRequest
3 голосов
/ 26 марта 2011

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

Есть изображение и соответствующие GPS-координаты его верхней левой и нижней правой вершин.Например:

topLeft.longitude = 8.235128;
topLeft.latitude = 49.632383;
bottomRight.longitude = 8.240547;
bottomRight.latitude = 49.629808;

Теперь есть точка, которая лежит на этой карте:

p.longitude = 8.238567;
p.latitude = 49.630664;

Я рисую свое изображение в полноэкранном режиме (1024 * 748).

Теперь я хочу вычислить точную позицию пикселя (x, y) моей точки.

Для этого я пытаюсь использовать подход с большим круговым расстоянием отсюда: Ссылка .

CGFloat DegreesToRadians(CGFloat degrees)
{
return degrees * M_PI / 180;
};

- (float) calculateDistanceP1:(CLLocationCoordinate2D)p1 andP2:(CLLocationCoordinate2D)p2 {
double circumference = 40000.0; // Erdumfang in km am Äquator
double distance = 0.0;

double latitude1Rad = DegreesToRadians(p1.latitude);
double longitude1Rad = DegreesToRadians(p1.longitude);
double latititude2Rad = DegreesToRadians(p2.latitude);
double longitude2Rad = DegreesToRadians(p2.longitude);

double logitudeDiff = fabs(longitude1Rad - longitude2Rad);

if (logitudeDiff > M_PI)
{
    logitudeDiff = 2.0 * M_PI - logitudeDiff;
}

double angleCalculation =
acos(sin(latititude2Rad) * sin(latitude1Rad) + cos(latititude2Rad) * cos(latitude1Rad) * cos(logitudeDiff));

distance = circumference * angleCalculation / (2.0 * M_PI);
NSLog(@"%f",distance);

return distance;
}

Вот мой код для получения позиции Пикселя:

- (CGPoint) calculatePoint:(CLLocationCoordinate2D)point {
float x_coord;
float y_coord;

CLLocationCoordinate2D x1;
CLLocationCoordinate2D x2;

x1.longitude = p.longitude;
x1.latitude = topLeft.latitude;
x2.longitude = p.longitude;
x2.latitude = bottomRight.latitude;

CLLocationCoordinate2D y1;
CLLocationCoordinate2D y2;

y1.longitude = topLeft.longitude;
y1.latitude = p.latitude;
y2.longitude = bottomRight.longitude;
y2.latitude = p.latitude;

float distanceX = [self calculateDistanceP1:x1 andP2:x2];
float distanceY = [self calculateDistanceP1:y1 andP2:y2];

float distancePX = [self calculateDistanceP1:x1 andP2:p];
float distancePY = [self calculateDistanceP1:y1 andP2:p];

x_coord = fabs(distancePX * (1024 / distanceX))-1;
y_coord = fabs(distancePY * (748 / distanceY))-1;

return CGPointMake(x_coord,y_coord);

}

x1 и x2 - это точки на долготе p с широтой topLeft иНижний правый.y1 и y2 - это точки на широте p с долготой topLeft и bottomRight.

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

Теперь я вычисляю расстояние между x1 и p (мое расстояние между x_0 и x_p), после чего вычисляю расстояние между y1 и p (расстояние между y_0 и y_p)

Последнее, но не менее важное: позиция пикселя вычисляется и возвращается.

В результате моя точка находится на красной позиции, а НЕ на синей:

Screenshot

Возможно, вы найдете какие-либо ошибки или у вас есть предложения по повышению точности.

Ответы [ 2 ]

0 голосов
/ 18 мая 2011

Может быть, я не понял вашего вопроса, но разве вы не должны использовать Преобразование координат карты методы MKMapView?

0 голосов
/ 18 мая 2011

См. это изображение

Я использовал ваши координаты и просто сделал следующее:

x_coord = 1024 * (p.longitude - topLeft.longitude)/(bottomRight.longitude - topLeft.longitude);
y_coord =  748 - (748 * (p.latitude - bottomRight.latitude)/(topLeft.latitude - bottomRight.latitude));

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

...