【问题标题】:Converting image X,Y coordinates to longitude and latitude?将图像 X,Y 坐标转换为经度和纬度?
【发布时间】:2016-09-14 00:04:51
【问题描述】:

我已设置特定静态地图图像的最小经度和纬度值。那张地图图片是某个国家/地区的截图。

/**
 * Maximum longitude value of the map
 */
private float mapLongitudeMax;

/**
 * Minimum longitude value of the map
 */
private float mapLongitudeMin;

/**
 * Maximum latitude value of the map
 */
private float mapLatitudeMax;

/**
 * Minimum latitude value of the map
 */
private float mapLatitudeMin;

我有一个名为mapImageBufferedImage

我有一个方法是我和朋友一起写的,它接收longitudelatitude,并在地图上给你一个X 和一个Y 的大致位置,这样你就可以在地图上画一些东西。

现在,如果我想在地图上移动鼠标,我希望它显示我的鼠标位置的longitude/latitude,这意味着我需要创建一个方法,将鼠标位置的 X 和 Y 转换为 longitudelatitude,这应该与我的其他方法相反。

这是我将地球坐标转换为图像XY的方法:

protected Location getCoordinatesByGlobe(float latitude, float longitude) {

    /**
     * Work out minimum and maximums, clamp inside map bounds
     */
    latitude = Math.max(mapLatitudeMin, Math.min(mapLatitudeMax, latitude));
    longitude = Math.max(mapLongitudeMin, Math.min(mapLongitudeMax, longitude));

    /**
     * We need the distance from 0 or minimum long/lat
     */
    float adjLon = longitude - mapLongitudeMin;
    float adjLat = latitude - mapLatitudeMin;

    float mapLongWidth = mapLongitudeMax - mapLongitudeMin;
    float mapLatHeight = mapLatitudeMax - mapLatitudeMin;

    float mapWidth = mapImage.getWidth();
    float mapHeight = mapImage.getHeight();

    float longPixelRatio = mapWidth / mapLongWidth;
    float latPixelRatio = mapHeight / mapLatHeight;

    int x = Math.round(adjLon * longPixelRatio) - 3;// these are offsets for the target icon that shows.. eedit laterrr @oz
    int y = Math.round(adjLat * latPixelRatio) + 3; //

    // turn it up
    y = (int) (mapHeight - y);

    return new Location(x, y);
}

现在我试着想,我脑海中的第一个想法就是反过来做同样的事情......所以我开始这样做,但遇到了一些问题,比如我无法获得 adjLon 的值或adjLat 没有longitudelatitude,所以这不能简单地通过反转它来完成。我是坐标系统的新手,所以对我来说有点困惑,但我开始赶上它。

有什么建议吗?

编辑(不可能?)

根据this answer,你不能真正得到真正的结果,因为地球不是平的,如果不实施真正的数学算法使其工作,它就无法真正转换为经纬度的平面地图变化。

我的代码中有几个原因导致答案不能准确:

  1. 由于上述原因
  2. 因为我的 X、Y 值是整数而不是浮点数。

所以我现在的问题是,如果我的方法真的不可能吗?

【问题讨论】:

  • 您的应用程序是做什么用的?如果您尝试将其用于估计,则可以进行一些舍入等。
  • 您可以通过使用对您的应用程序具有足够准确性的模型来获得对您的应用程序来说“足够好”的结果。一般来说,这将取决于您将鼠标悬停在图像上的像素:度数比。有很多很多不同的方法可以“展开”球体。我提到的一个是最受欢迎的之一,但还有其他的。这应该让你开始:en.wikipedia.org/wiki/List_of_map_projections

标签: java maps


【解决方案1】:

遗憾的是,对此没有一个简单的答案。虽然您可以自己编写投影例程,但最简单的方法可能是获取一个 GIS 库,但由于我最终使用 C# 而不是 Java,所以我不知道有什么可用的。

您需要的最大信息就是您的地图图像使用的投影方式。 The Mercator Projection 很受欢迎,但它不是唯一的。您还需要确保您选择的投影适用于您想要的纬度和经度范围。如果你开始超过 +-70 N,墨卡托投影就会中断,所以如果你在两极做很多位置,这可能不适合你。

【讨论】:

    【解决方案2】:

    根据我在您的代码中阅读的内容,您的图像位于经度/纬度坐标中,您将其绘制在画布上以显示在屏幕上。然后你在这张图片上添加你的听众是正确的吗?

    如果这是正确的,则响应很简单,因为您可以通过 Canvas 上的 MouseListener 方法检索图像中的 X/Y 位置,并根据鼠标在画布内的位置对其进行转换(方法 getX/getY from mouseEvent)和画布的当前尺寸,然后在经度/纬度范围内转换此位置。

    longitude = minLongitude + (MouseEvent.getX/Canvas.Width)*maxLongitude
    lalitude = minLaltitude + (MouseEvent.getY/Canvas.Height)*maxLatitude
    

    如果不是,那么您必须知道 @ginkner 所说的投影技术用于从 long/lat 传递到 X/Y 并进行逆变换,知道您会丢失一些信息。

    【讨论】:

      【解决方案3】:

      地理坐标和几何坐标是有区别的,它很像 3D 地球表面和画布。网络墨卡托投影或其他流行的投影坐标系用于抽象地球表面的可视化。因此,不同位置的像素偏移会导致不同的距离。

      如果您正在寻找一些基本的 GIS Java 库来处理此类问题,Java 中的 Geotools 可能是一种选择。 GeoTools

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-07
        • 1970-01-01
        • 2016-12-09
        • 2020-03-29
        • 1970-01-01
        • 2013-09-04
        相关资源
        最近更新 更多