2016-08-03 202 views
1

我有一张以色列地图。将经度和纬度坐标转换为地图像素X和Y坐标的图像Java

我需要创建一个函数来获取两个双参数(经度和纬度),并且该函数应该在地图图像的该区域绘制一个小圆圈。

我对地图以下信息:

  • 地图的以像素为单位
  • 地图的以像素为单位的高度
  • 宽度在-至少一个纬度/经度位置坐标上每度之间的像素地图
  • 距离

我需要我去像素X,Y BA坐标转换sed在那个图像上。

有下列地图图像:

enter image description here

例如(没有一个准确的例子,它仅仅是一个例子,所以你明白我的意思),左上角坐标为33.5, 34并且它的X,Y在地图上是0,0。

如何将这些坐标转换为X,Y坐标?

我试过this answer但它并没有真正的工作,它显示我在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 

截图:

https://gyazo.com/5a19dece37ebace496c6b8d68eb9ec3c

+0

其平面地图?所有的经纬线都是平行的(忽略地球曲率)? – Drgabble

+0

@Drgabble是它的完全平坦的 – Artemkller545

+0

你可以发布你的代码吗?如果存在现有的解决方案,则表明您的代码中存在拼写错误 – Drgabble

回答

2

你需要另外添加像素偏移和地图的长度在经度/纬度。然后你可以做一个转换。

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] 
0

您的代码不会考虑到你的地图是不是整个世界地图。你需要调整它,使它有一个偏移量(因为地图的左上角不是0,0可以这么说),所以它不认为地图的宽度是360',高度是180'。

对于初学者x = (longitude+180)*(mapWidth/360)应该更像x = (longitude+<distance west of prime meridian of left side of map>)*(mapWidth/<width of map in degrees>)

+0

嘿,谢谢你的回应,是的,我thoguht所以东西闻到鱼腥味,这些答案应该工作,这不是因为它不是整个地图。它需要基于该偏移量的地图进行计算。但问题是,我如何添加这些偏移量,以及什么?另外你的意思是“格雷尼奇以西”? – Artemkller545

+0

距离应该在什么值?如果距离是5144km? – Artemkller545

相关问题