3

I have some problems figuring out where my error is. I got the following:

Have an image and corresponding GPS coordinates of its top-left and bottom-right vertices. E.g:

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

Now a have an Point that lies in that map:

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

I draw my image in landscape fullscreen (1024*748).

Now I want to calculate the exact Pixel position (x,y) of my point.

For doing that I am trying to use the great circle distance approach from here: Link.

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;
}

Here is my code for getting the Pixel position:

- (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 and x2 are the points on the longitude of p and with latitude of topLeft and bottomRight. y1 and y2 are the points on the latitude of p and with longitude of topLeft and bottomRight.

So I got the distance between left and right on longitude of p and distance between top and bottom on latitude of p. (Needed for calculate the pixel position)

Now I calculate the distance between x1 and p (my distance between x_0 and x_p) after that I calculate the distance between y1 and p (distance between y_0 and y_p)

Last but not least the Pixel position is calculated and returned.

The Result is, that my point is on the red and NOT on the blue position:

Screenshot

Maybe you find any mistakes or have any suggestions for improving the accuracy.

Justin Boo
  • 10,132
  • 8
  • 50
  • 71
user678145
  • 109
  • 1
  • 6
  • I have the same problem, can you give me a good formula ? http://stackoverflow.com/questions/12403591/calculate-x-and-y-position-on-a-png-map-from-gps-coordinate – Safouane Azzabi Sep 13 '12 at 10:09

2 Answers2

0

See this image

I used your co-ordinates, and simply did the following:

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

The red dot markes this point. For such small distances you don't really need to use great circles, and your rounding errors will be making things much more inaccurate

Keir Finlow-Bates
  • 993
  • 2
  • 14
  • 27
0

Maybe I didn't understand your question, but shouldn't you be using the Converting Map Coordinates methods of MKMapView?

Jano
  • 62,815
  • 21
  • 164
  • 192