【问题标题】:Exact position by mouse click in WorldWind在 WorldWind 中通过鼠标单击精确定位
【发布时间】:2016-05-07 10:27:34
【问题描述】:

我在点击地球时无法获取位置(纬度/经度)。

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

不幸的是,这会返回包含点击点的顶部可拾取对象的位置,因此如果那里不存在可拾取对象,该方法只会返回 null

当您使用任何示例时,您可以在进入状态栏时看到它:即使鼠标在地球上,也会时不时出现 Off Globe 标签(而不是纬度/经度)正是因为这个原因!

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

【问题讨论】:

标签: java worldwind


【解决方案1】:

我不确定你指的是哪个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());
}

【讨论】:

  • 这就是 javadocs 说的。但是,如果您查看 getCurrentPosition 的实现(在 WorldWindowImpl 内部),您会发现它实际上使用 PickedObjectList。
  • 我可以在地球上一个我没有添加任何对象的区域点击并获得位置,你能给出你点击的地方的屏幕截图并且没有获得位置吗?
  • 地图也是可拾取的(地形物体),因此即使没有物体,它也会给你一个位置。问题是,它让你回到了地图有一个角落的地方。我现在没有申请,稍后我可以发布更多内容
  • 我可以更新鼠标移动的位置,每次移动光标时我都会看到它发生变化 - 它似乎没有使用角。
  • 我添加了一个不依赖getCurrentPosition()的替代方法
猜你喜欢
  • 2016-01-17
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多