0

我一直在寻找经度和纬度的转换,发现了我目前正在使用的这个算法,但不确定这是否是正确的算法。另外,我如何使用工具提示在地图图片上绘制特定坐标。我尝试覆盖 JPanel 中的 paintComponent 方法,但我需要将标签图片作为标签,以便我可以正确使用 JTooltip。以下是我目前使用的算法。请让我知道它是否正确以及如何将另一张图片放在主图片的顶部。与使用 JLabel 一样,我使用 setBounds 方法来设置位置,但在给出要放置的点列表的情况下,dosent 可以正常工作。

公共点getXY(双经,双纬){

    List<Integer> list = new ArrayList<Integer>();
    double mapWidth = 2000; 
    double mapHeight = 1000;
    // get x value
    double x = (longitude + 180) * (mapWidth / 360);
    int x1 = (int) Math.round(x);
    list.add(x1);
    // convert from degrees to radians
    double latRad = latitude * Math.PI / 180;

    // get y value
    double mercN = Math.log(Math.tan((Math.PI / 4) + (latRad / 2)));
    double y = (mapHeight / 2) - (mapWidth * mercN / (2 * Math.PI));
    int y1 = (int) Math.round(y);
    list.add(y1);
    return new Point(x1, y1);
} 
4

2 回答 2

0

我想如果你有方程,实现是直截了当的。但是,对于这样的操作,最好使用 Geotools,这是一个提供类似 GIS 功能的开源 Java 库。这是一个教程,展示如何在不同的坐标参考系统之间进行转换:geotools CRS 教程
这是一个教程,向您展示如何处理图像和 CRS 坐标:
Geotools 仿射变换

于 2016-03-07T18:08:51.490 回答
0

从纬度/经度到 XY 的任何转换都称为“投影”,并且有很多不同的转换。没有“正确”的投影,因为从球体或椭球体(地球稍微变平而不是完美的球体)到平面的任何映射都会涉及一些失真。

你没有说你在这里使用什么投影。你应该,即使它只是一个基本的,以便将来阅读代码的任何人都知道你从哪里得到你的方程,并可以检查它们的正确性。此外,如果不知道在这种情况下“正确”的含义,我们无法告诉您是否正确。

你试过一些测试数据吗?如果您大致知道您期望的结果,例如,如果您有一张使用相同投影的纸质地图,那么您可以通过输入特定地标的经纬度并检查 XY 结果是否与地图位置匹配来验证您的算法. 如果您需要的话,也有一些网站可以为特定预测提供准确的转换。

正确的投影很大程度上取决于您想要做什么。听起来您只想要一个可识别的小地理区域(例如美国州或欧洲国家/地区)的渲染。如果是这样,那么几乎任何投影都可以。

如果你想要一些准确的东西,那么你可以在地图上测量距离或角度,或者在一英里内进行长距离导航,那么生活会很快变得复杂,如果你可以使用预先存在的库,那么它是一个非常好的主意。但我认为这不是你需要的。

于 2016-03-07T18:24:48.400 回答