【问题标题】:Latitude/longtitude conversion to image x/y coordinates (Miller Cylindrical projection)纬度/经度转换为图像 x/y 坐标(米勒圆柱投影)
【发布时间】:2012-02-16 20:17:11
【问题描述】:

正如标题中所说,我需要一些帮助来将米勒圆柱投影中的纬度/经度转换为 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 是否真的应该是正确的值,但在我阅读的一篇参考文献中,米勒投影的垂直范围据说是 -2.3..+2.3,所以我使用了它。

【问题讨论】:

  • Here is an example of what I get它在哪里?
  • 忘记添加图片,已修复。
  • gis.stackexchange.com 可能是这个问题的一个更好的地方 - 它的观众更关注这类问题
  • 感谢您的信息,我不妨把这个贴在那里。
  • @Varnius 你有你使用的确切图像吗?你提供的那个是不正确的,因为赤道没有穿过它的中心。

标签: latitude-longitude map-projections


【解决方案1】:

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

所以,可能您的图像中间没有赤道。它可以通过在公式中添加偏移来进行数学修正,但您必须找到赤道的位置。

【讨论】:

  • 我使用的是this SVG 地图。真的,赤道似乎有点偏离,我没有t notice that before. Ill 检查一下,如果确实如此,请接受你的回答。
  • @Varnius Equator 几乎在正确的位置。无论如何,请检查您正在使用的图像的高度。公式是正确的,通过在您的示例中移动位置,我会假设在计算中使用了错误的图像高度。
  • 我在前面的例子中标记城市时可能犯了一些错误。无论如何,我只是拿了一个非常大的 6343x4767 版本的 svg 并更新了我的代码以补偿这张图片中的 34px 偏移量。我现在得到的是南半球的好位置和北半球的坏位置。我标记了两个半球in this image 的一些城市的结果(也添加了上面代码的输出)。我m pretty sure that I missed something but just dont 知道什么。 :~
  • @Varnius 好的,看这里img855.imageshack.us/img855/1873/52686459.jpg 具有 86.49 度的地图覆盖范围,它或多或少会提供更好的结果。对于该纬度,您应该使用2.11896 而不是2.3。如您所见,开普敦仍在移动,因此纬度的实际最大值甚至更小(该地图上的平行线不是等距的),请稍微增加2.11896的值。
  • 嘿,即使放大很多,我也需要很高的精度,所以我想我会用我发现的这个nice utility 生成一些东西,然后跳过那个不正确的svg。不过还是谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多