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

5
如标题所述,我需要帮助将经纬度转换为米勒圆柱投影中的x/y坐标。我正在编写一个应用程序(使用Java),它将城市列表作为输入,并从Yahoo Placefinder获取每个城市的经纬度。我在代码中使用了这些公式。这是一个示例。 (图像仅供参考,不是我使用的那个)。正如您所看到的,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,所以我使用了这个值。

这是我得到的一个例子。它在哪里? - Cheery
忘记添加图片,已修复。 - Varnius
http://gis.stackexchange.com 可能是这个问题的更好的提问地点 - 它的受众更加专注于这种类型的问题 - tomfumb
谢谢提供的信息,我也可以在那里发布这个。 - Varnius
@Varnius 你有使用过准确的图片吗?你所展示的那张是不正确的,因为赤道并没有穿过它的中心。 - Cheery
1个回答

2

米勒投影被认为是-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

因此,您的图像可能不会在中央具有赤道。可以通过向公式添加偏移量来数学修正,但您必须找到赤道位置。


我正在使用这个SVG地图(http://upload.wikimedia.org/wikipedia/commons/5/5d/World_map_%28Miller_cylindrical_projection%2C_blank%29.svg)。实际上,赤道似乎有点偏移,我之前没有注意到。我会检查一下,如果是这样的话,我会接受你的答案。 - Varnius
@Varnius,它几乎在正确的位置。无论如何,请检查您正在处理的图像的高度。公式是正确的,根据您示例中位置的移动,我会假设计算中使用了错误的图像高度。 - Cheery
@Varnius,你能提供一些示例坐标吗?我可以从谷歌上获取,但我想看看你使用的是什么。 - Cheery
1
@Varnius 好的,请看这里 http://img855.imageshack.us/img855/1873/52686459.jpg,地图覆盖率为86.49度,结果更好一些。对于该纬度,您应该使用`2.11896`而不是`2.3`。正如您所看到的开普敦仍然有偏移,因此实际纬度的最大值甚至更小(在该地图上平行线不是等距的),可以稍微增加`2.11896`的值来进行调整。 - Cheery
1
嘿,我需要在非常缩放的情况下保持良好的精度,所以我想我会使用我找到的这个不错的工具来生成一些内容,并跳过那个不正确的SVG。但还是谢谢! - Varnius
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接