在WorldWind中通过鼠标单击确切位置

时间:2016-01-29 15:58:12

标签: java worldwind

当我点击地球时,我在获取位置(lat / lon)方面遇到了问题。

SO(和其他网站)上的任何地方都建议使用 getCurrentPosition 方法。

不幸的是,这会返回顶部可拾取对象的位置,该位置可以理解点击的点,因此如果不存在可选对象,则该方法只返回 null

当你使用任何一个例子进入状态栏时你可以看到它:即使鼠标在地球上,也会偶尔出现 Off Globe 标签(而不是lat / lon)出于这个原因!

有没有其他方法可以在不依赖可选对象的情况下获得该位置? 我正在考虑通过屏幕上的位置计算并使用几何图形,但这将非常困难,我不知道从哪里开始......

1 个答案:

答案 0 :(得分:2)

我不确定您引用的是哪个getCurrentPosition(),但WorldWindow#getCurrentPosition()应该按照您的意愿行事。 javadocs说:

  

返回当前光标位置的当前纬度,经度和海拔高度,如果光标不在地球上,则返回null。

如果您的光标不与地球相交(即您点击背景中的星星),则不会有与该点击相关联的位置。这不依赖于可选择的对象,只是在点击时与光标相交的地球上。

以下示例适用于我:

public class PositionListener implements MouseListener {
    private final WorldWindow ww;

    public PositionListener(WorldWindow ww) {
        this.ww = ww;
    }
    @Override
    public void mouseClicked(MouseEvent event) {
        try {
            System.out.println(ww.getCurrentPosition().toString());
        } catch (NullPointerException e) {
            // click was not on the globe
        }
    }
    //...
}

如果getCurrentPosition()不适合您,则可以选择其他方式:

@Override
public void mouseClicked(MouseEvent event) {
    Point p = event.getPoint();
    Vec4 screenCoords = new Vec4(p.x,p.y);
    Vec4 cartesian = ww.getView().unProject(screenCoords);
    Globe g=ww.getView().getGlobe();
    Position pos=g.computePositionFromPoint(cartesian);
    System.out.println(pos.toString());
}