Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于将纵坐标和格坐标转换为x和y坐标的Meractor投影_Java_Mercator - Fatal编程技术网

Java 用于将纵坐标和格坐标转换为x和y坐标的Meractor投影

Java 用于将纵坐标和格坐标转换为x和y坐标的Meractor投影,java,mercator,Java,Mercator,我一直在寻找经度和格度的转换,发现了我目前正在使用的算法,不确定这是否是正确的算法。另外,如何使用工具提示在地图图片上绘制特定坐标。我尝试在JPanel中重写paintComponent方法,但我需要将标记图片作为标签,以便正确使用JTooltip。下面是我目前正在使用的算法。请让我知道它是否正确,以及如何在主图片顶部放置另一张图片。与使用JLabel一样,我使用了setBounds方法来设置位置,但如果给定了要放置的点列表,则不会正常工作 公共点getXY(双经度、双纬度){ List Lis

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

公共点getXY(双经度、双纬度){

List List=new ArrayList();
双地图宽度=2000;
双地图高度=1000;
//获取x值
双x=(经度+180)*(地图宽度/360);
int x1=(int)数学四舍五入(x);
添加(x1);
//从度转换为弧度
双纬度=纬度*Math.PI/180;
//得到y值
double mercN=Math.log(Math.tan((Math.PI/4)+(latRad/2));
双y=(mapHeight/2)-(mapWidth*mercN/(2*Math.PI));
int y1=(int)数学圆(y);
列表。添加(y1);
返回新点(x1,y1);
} 

我想如果你有这些方程,那么实现是直接的。然而,对于这样的操作,最好使用Geotools,这是一个开源java库,它提供了类似的GIS功能。下面是一个教程,演示如何在不同的坐标参照系之间进行变换:
以下是一个教程,向您展示如何处理图像和CRS坐标:

从lat/long到XY的任何转换都被称为“投影”,有很多不同的转换。没有“右”投影,因为从球体或椭球体(地球是稍微平坦的,而不是完美的球体)到平面的任何映射都会涉及一些失真

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

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

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

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

    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);
}