Java 将经纬度坐标转换为地图像素X和Y坐标的图像
我有一张以色列地图 我需要创建一个获得两个双参数(经度和纬度)的函数,该函数应该在地图图像的该区域上画一个小圆圈 我有以下关于地图的信息:Java 将经纬度坐标转换为地图像素X和Y坐标的图像,java,math,maps,coordinates,Java,Math,Maps,Coordinates,我有一张以色列地图 我需要创建一个获得两个双参数(经度和纬度)的函数,该函数应该在地图图像的该区域上画一个小圆圈 我有以下关于地图的信息: 贴图的宽度(以像素为单位) 地图的高度(以像素为单位) 地图上纬度/经度位置至少有一个坐标 每个度数之间的距离(以像素为单位) 我需要将得到的坐标转换为基于该图像的像素X,Y 有以下地图图像: 例如(不是一个准确的例子,它只是一个例子,让你明白我的意思),左上角的坐标是33.5,34,它的X,Y在地图上是0,0 如何将这些坐标转换为X,Y坐标 我试过了
- 贴图的宽度(以像素为单位)
- 地图的高度(以像素为单位)
- 地图上纬度/经度位置至少有一个坐标
- 每个度数之间的距离(以像素为单位)
31.5,34.5
而不是33,34
更新:下面是另一个问题的虚拟快速代码示例
public class MapRenderer extends JFrame {
public static void main(String... args) throws IOException {
new MapRenderer();
}
public MapRenderer() throws IOException {
setSize(new Dimension(614, 1141));
add(new TestPane());
setVisible(true);
}
}
class TestPane extends JPanel {
private BufferedImage image;
public TestPane() throws IOException {
File file = new File("israel_map.jpg");
BufferedImage image = ImageIO.read(file);
this.image = image;
}
@Override
public void paintComponent(Graphics g) {
double lon = 34;
double lat = 33;
int mapW = 614;
int mapH = 1141;
double x = (lon + 180) * (mapW / 360);
double latRad = lat * Math.PI / 180;
double mercN = Math.log( Math.tan( (Math.PI / 4) + (latRad / 2)) );
double y = (mapH / 2) - (mapW * mercN / (2 * Math.PI));
System.out.println("[lon: " + lon + " lat: " + lat + "]: X: " + x + " Y: " + y);
g.drawImage(image, 0, 0, null);
g.setColor(Color.RED);
g.drawOval((int) x, (int) y, 5, 5);
}
}
输出:
[lon: 34.0 lat: 33.0]: X: 214.0 Y: 510.3190109117399
截图:
您的代码没有考虑到您的地图不是整个世界地图。您需要对其进行调整,使其具有偏移量(因为地图的左上角不是0,0),并使其不会认为地图的宽度为360',高度为180'
对于初学者来说,
x=(经度+180)*(地图宽度/360)
应该更像x=(经度+)*(地图宽度/)
除了像素之外,还需要添加地图的经度/纬度偏移量和长度。然后你可以做一个转换
static final int mapWidth = 614, mapHeight = 1141;
// offsets
static final double mapLongitudeStart = 33.5, mapLatitudeStart = 33.5;
// length of map in long/lat
static final double mapLongitude = 36.5-mapLongitudeStart,
// invert because it decreases as you go down
mapLatitude = mapLatitudeStart-29.5;
private static Point getPositionOnScreen(double longitude, double latitude){
// use offsets
longitude -= mapLongitudeStart;
// do inverse because the latitude increases as we go up but the y decreases as we go up.
// if we didn't do the inverse then all the y values would be negative.
latitude = mapLatitudeStart-latitude;
// set x & y using conversion
int x = (int) (mapWidth*(longitude/mapLongitude));
int y = (int) (mapHeight*(latitude/mapLatitude));
return new Point(x, y);
}
public static void main(String[] args) {
System.out.println(getPositionOnScreen(33.5, 33.5).toString());
System.out.println(getPositionOnScreen(35, 32).toString());
System.out.println(getPositionOnScreen(36.5, 29.5).toString());
}
这将打印出以下内容:
java.awt.Point[x=0,y=0]
java.awt.Point[x=307,y=427]
java.awt.Point[x=614,y=1141]
这是一张平面图吗?所有的经纬线都是平行的(地球的曲率被忽略)?@Drgabble是的,它是完全平坦的。你能发布你的代码吗?如果有一个现有的答案是有效的,它表明你的代码中有一个拼写错误Google:point slope form。嘿,谢谢你的回复,是的,我想这些答案应该有用,这不是因为它不是整个地图。它需要根据这张带有偏移的地图进行计算。但问题是,如何添加这些偏移量,以及什么?。你说的“格里尼希以西”是什么意思?距离应该是多少?如果距离为5144km?这些值是什么:36.5和29.5,您使用它们来计算
地图经度
和地图纬度
?