纬度/经度转换为图像x / y坐标(米勒圆柱投影)

时间:2012-02-16 20:17:12

标签: latitude-longitude map-projections

正如标题中已经说过的,我需要一些帮助,将lat / long转换为Miller Cylindrical投影中的x / y坐标。我目前正在编写一个应用程序(使用Java),它将城市列表作为输入,然后从Yahoo Placefinder获取每个城市的纬度/经度。我在代码中使用了these个公式。我获得的Here is an example。 (图片仅供参考,不是我使用的图片)。正如您所看到的X位置只有几个像素(2-3)关闭,这可能是我在此地图中计算本初子午线偏移(CENTRAL_MERIDIAN_OFFSET)的问题。但主要问题是Y坐标不正确。

这是我的代码(更新 - 赤道偏移的34px补偿):

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

显然,Y坐标计算有问题。我不确定5.6是否真的应该是正确的值但是Millers投影的垂直范围在我读过的一个参考文献中被认为是-2.3 .. + 2.3所以我用它。

1 个答案:

答案 0 :(得分:2)

Millers projection was said to be -2.3..+2.3这是近似值。根据图像的大小,您可能需要更精确的值,例如2.303412543

对于莫斯科的纬度为55.7522222,它将给出y = 1.089472895,并根据我使用的图像的高度,从顶部y' = 1499/2 - (1499/ (2 * 2.303412543)) * 1.089472895 = 395像素,这是正确的(我不关心x)

检查一下,我在地图上放了一个红点。 http://img7.imageshack.us/img7/9892/mapue.jpg

所以,可能你的图像中间没有赤道。它可以通过添加到公式的移位来数学固定,但你必须找到赤道的位置。