Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Latitude/longtitude conversion to image x/y coordinates (Miller Cylindrical projection)

As already said in the title, I need some help with converting lat/long to x/y coords in Miller Cylindrical projection. I`m currently writing an app (in Java) which gets city list as an input and then gets lat/long for each city from Yahoo Placefinder. I used these formulas in my code. Here is an example of what I get. (image is for the reference only, not the one I use). As you can see the X positions are only a few pixels (2-3) off, this can be a problem with my calculations of prime meridian shift (CENTRAL_MERIDIAN_OFFSET) in this map. But the main problem is incorrect Y coordinates.

Here is my code (updated - 34px compensation for equator offset):

public final double W = 6343;
public final double H = 4767 - 34;

protected Point toMillerXY(double lon, double lat)
{
    double x, y;

    lon = Utils.degToRad(lon);
    lat = Utils.degToRad(lat);

    x = lon - CENTRAL_MERIDIAN_OFFSET;
    y = 1.25 * Math.log( Math.tan( 0.25 * Math.PI + 0.4 * lat ) );

    x = ( W / 2 ) + ( W / (2 * Math.PI) ) * x;
    y = ( H / 2 ) - ( H / ( 2 * 2.303412543 ) ) * y;

    y += 34;

    return new Point(x, y);
}

Output:  
Fetching data with: http://where.yahooapis.com/geocode?location=Buenos+Aires,Argentina
Latitude: -34.608521, longitude: -58.373539
---
Fetching data with: http://where.yahooapis.com/geocode?location=Tokyo,Japan
Latitude: 35.670479, longitude: 139.740921
---
Fetching data with: http://where.yahooapis.com/geocode?location=Cape+Town,CAR
Latitude: -33.919060, longitude: 18.421961
---
Fetching data with: http://where.yahooapis.com/geocode?location=Rome,Italy
Latitude: 41.903110, longitude: 12.495760
---
Total cities: 4
Result for Buenos Aires: 1964.598428, 3046.740995
Result for Tokyo: 5455.265150, 1732.669551
Result for Cape Town: 3317.692474, 3032.814395
Result for Rome: 3213.276105, 1602.176163

Obviously, something is wrong with Y coord calculation. I`m not sure whether 5.6 should really be the right value but the vertical range of Millers projection was said to be -2.3..+2.3 in one of the references I read so I used it.

like image 985
Varnius Avatar asked Nov 04 '22 05:11

Varnius


1 Answers

Millers projection was said to be -2.3..+2.3 it is an approximation. Based on the size of an image you might need more precise value, for example 2.303412543

For latitude of Moscow as 55.7522222 it will give y = 1.089472895 and, based on the height of the image I used, y' = 1499/2 - (1499/ (2 * 2.303412543)) * 1.089472895 = 395 pixels from the top, which is correct (I did not care about x).

Check it, I placed a red dot on the map. http://img7.imageshack.us/img7/9892/mapue.jpg

So, probably your image does not have equator in the middle of it. It can be fixed mathematically by addition of the shift to the formula, but you have to find position of the equator.

like image 196
Cheery Avatar answered Dec 04 '22 05:12

Cheery