1

我在努力解決一個問題:我想通過我的Java應用程序訪問openstreetmap。我寫了一個JComponent,它能夠顯示從openstreetmap下載的圖塊。問題是,在計算下載圖片的y位置的公式(請參閱源代碼中的FIXME)中,這是一個錯誤,我無法找到它。代碼的某些部分從http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames複製而來。瘋狂的是x-position是正確的。方法goTo()用於確定地圖的哪個位置應該位於JComponent的中心 - 查看!Openstreetmap Viewer:座標轉換錯誤

package ui; 

import java.awt.Graphics; 
import java.awt.Image; 

import javax.swing.JComponent; 

public class OSMViewer extends JComponent { 

    private static final long serialVersionUID = 1L; 
    protected ImageHandler imagehandler = null; 
    protected int zoomlevel = 0; 
    protected double center_deg_lon = 0.0; 
    protected double center_deg_lat = 0.0; 
    final double DEGY = 85.0511; 
    final double DEGX = 180.0; 

    public OSMViewer(ImageHandler imagehandler) { 
     this.imagehandler = imagehandler; 
     // TODO 
     goTo(13, 30.0, 30.0); 
    } 

    public void goTo(final int zoom, final double lon, final double lat) { 
     zoomlevel = zoom; 
     center_deg_lon = lon; 
     center_deg_lat = lat; 
     repaint(); 
    } 

    // deg 
    public int getTileNumberX(final int zoom, final double lon) { 
     int xtile = (int) Math.floor((lon + 180)/360 * (1 << zoom)); 
     return xtile; 
    } 

    // deg 
    public int getTileNumberY(final int zoom, final double lat) { 
     int ytile = (int) Math 
       .floor((1 - Math.log(Math.tan(Math.toRadians(lat)) + 1 
         /Math.cos(Math.toRadians(lat))) 
         /Math.PI) 
         /2 * (1 << zoom)); 
     return ytile; 
    } 

    // deg 
    public double getLonDegPx(final int zoom) { 
     double deg_px = 2 * DEGX/(Math.pow(2, zoom) * 256); 
     return deg_px; 
    } 

    // deg 
    public double getLatDegPx(final int zoom) { 
     double deg_px = 2 * DEGY/(Math.pow(2, zoom) * 256); 
     return deg_px; 
    } 

    // deg 
    public int getPxX(final int zoom, final double lon) { 
     return (int) (((lon + DEGX)/(2 * DEGX)) * Math.pow(2, zoom) * 256); 
    } 

    // deg 
    public int getPxY(final int zoom, final double lat) { 
     return (int) (((DEGY - lat)/(2.0 * DEGY)) * Math.pow(2.0, zoom) * 256.0); 
    } 

    public void paintComponent(Graphics g) { 
     int x = getTileNumberX(zoomlevel, center_deg_lon); 
     int y = getTileNumberY(zoomlevel, center_deg_lat); 
     String str = ("" + zoomlevel + "/" + x + "/" + y); 
     System.out.println(str); 
     int xpos = (x * 256) - getPxX(zoomlevel, center_deg_lon) 
       + (getWidth()/2); 
     // FIXME 
     int ypos = (y * 256) - getPxY(zoomlevel, center_deg_lat) 
       + (getHeight()/2); 
     Image image = imagehandler.getImage(str); 
     if (image != null) { 
      g.drawImage(image, xpos, ypos, this); 
     } 
     g.drawLine(0, getHeight()/2, getWidth(), getHeight()/2); 
     g.drawLine(getWidth()/2, 0, getWidth()/2, getHeight()); 
    } 
} 
+1

在getPxX裏面你使用的是int常量2和256,而getPxY裏面是2.0,256.0。嘗試在getPxY中使用int。 –

+0

我剛剛嘗試,但thx – user2991452

+1

你可能會看到[JMapViewer](http://wiki.openstreetmap.org/wiki/JMapViewer)[源代碼](http://svn.openstreetmap.org/applications/viewer/jmapviewer/src /org/openstreetmap/gui/jmapviewer/OsmMercator.java)。也許它可以幫助你。 –

回答