Java Openstreetmap查看器:坐标转换错误

Java Openstreetmap查看器:坐标转换错误,java,openstreetmap,jcomponent,coordinate-transformation,cartesian-coordinates,Java,Openstreetmap,Jcomponent,Coordinate Transformation,Cartesian Coordinates,我正在努力解决一个问题:我想通过Java应用程序访问openstreetmap。我编写了一个JComponent,可以显示从openstreetmap下载的互动程序。问题是,在计算下载图片y位置的公式中(请参阅源代码中的FIXME),这是一个错误,我无法找到它。代码的某些部分是从中复制的。疯狂的是,x位置是正确的。goTo()方法用于确定地图的哪个位置应位于JComponent-视图的中心 package ui; import java.awt.Graphics; import java.aw

我正在努力解决一个问题:我想通过Java应用程序访问openstreetmap。我编写了一个
JComponent
,可以显示从openstreetmap下载的互动程序。问题是,在计算下载图片y位置的公式中(请参阅源代码中的FIXME),这是一个错误,我无法找到它。代码的某些部分是从中复制的。疯狂的是,
x位置
是正确的。
goTo()
方法用于确定地图的哪个位置应位于
JComponent
-视图的中心

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());
    }
}
packageui;
导入java.awt.Graphics;
导入java.awt.Image;
导入javax.swing.JComponent;
公共类OSMViewer扩展JComponent{
私有静态最终长serialVersionUID=1L;
受保护的ImageHandler ImageHandler=null;
受保护的整数zoomlevel=0;
受保护的双中心度=0.0;
受保护的双中心倾角=0.0;
最终双精度=85.0511;
最终双DEGX=180.0;
公共OSMViewer(ImageHandler ImageHandler){
this.imagehandler=imagehandler;
//待办事项
后藤(13,30.0,30.0);
}
公共无效转到(最终整型缩放、最终双纵、最终双横){
zoomlevel=缩放;
中心度=lon;
中心度纬度=纬度;
重新油漆();
}
//度
公共整数getTileNumberX(最终整数缩放,最终双精度){

int xtile=(int)Math.floor((lon+180)/360*(1很高兴听到你能解决你的问题:)

还请注意,OSM在捐赠的资源上运行,并且对人们访问渲染地图磁贴的方式有限制:请注意,您的应用程序尊重它,以避免给社区服务器带来压力。

很高兴听到您能够解决问题:)

还请注意,OSM在捐赠的资源上运行,并且对用户访问渲染地图磁贴的方式有限制:请注意,您的应用程序尊重它,以避免对社区服务器造成压力。

在getPxX内部,您使用int常量2和256,在getPxY内部,您使用的是int-double 2.0、256.0。尝试在getPxY内部使用int。您可能会看到。也许它对您有帮助。在getPxX中,您使用int常量2和256,在getPxY中,使用双精度2.0和256.0。尝试在getPxY中使用int。您可能会看到。也许它对您有帮助。