我一直在寻找经度和纬度的转换,并找到了我目前正在使用的这个算法,但不确定这是否是正确的算法。另外,我如何使用工具提示在地图图片上绘制特定坐标。我尝试在 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);
}
我想如果你有方程,实现是直截了当的。但是,对于这样的操作,最好使用 Geotools,这是一个提供此类 GIS 功能的开源 Java 库。以下教程显示了如何在不同的坐标参考系之间进行变换: 地理工具 CRS 教程
这是一个教程,向您展示如何处理图像和CRS坐标:
地理工具仿射变换
任何从经度/经度到XY的转换都称为"投影",并且有很多不同的投影。没有"正确"的投影,因为从球体或椭球体(地球略微扁平而不是完美的球体)到平面的任何映射都会涉及一些失真。
你没有说你在这里使用的是什么投影。你应该这样做,即使它只是一个基本的,以便将来阅读代码的任何人都知道你从哪里得到你的方程式,并可以检查它们的正确性。此外,我们无法告诉您在这种情况下"正确"的含义是否正确
。您是否尝试过一些测试数据?如果您大致知道预期的结果,例如,如果您有使用相同投影的纸质地图,那么您可以通过为特定地标输入经度并检查 XY 结果是否与地图位置匹配来验证您的算法。如果您需要,还有一些网站可以为特定投影提供准确的转换。
正确的投影很大程度上取决于你想做什么。听起来您只是想要一个小地理区域(例如美国州或欧洲国家)的可识别渲染。如果是这样,那么几乎任何投影都可以。
如果你想要一些准确的东西,这样你就可以在地图上测量距离或角度,或者在一英里内进行长距离导航,那么生活很快就会变得复杂,如果你可以使用预先存在的库,那么这是一个非常好的主意。但我不认为这是你在这里需要的。