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