2016-08-03 245 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

相關問題