- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 WorldWind 并尝试在同一层中“挑选”多个表面图像,但不明白为什么它不起作用。
我的印象是这样称呼:
this.getWwd().getSceneController().setDeepPickEnabled(true);
将使我能够在同一层中选择多个可渲染对象。这似乎适用于 SurfaceImage 之外的所有其他情况。我还注意到,如果我将加载的 SurfaceImage 强制放入不同的层,它会按预期工作。
这是我用来测试的代码:
public class SurfaceImageViewer extends ApplicationTemplate
{
public static class AppFrame extends ApplicationTemplate.AppFrame
{
private JFileChooser fileChooser = new JFileChooser();
private JSlider opacitySlider;
private SurfaceImageLayer layer;
private JLabel statusLabel = new JLabel("status: ready");
public AppFrame()
{
super(true, true, false);
this.getWwd().getSceneController().setDeepPickEnabled(true);
try
{
this.layer = new SurfaceImageLayer();
this.layer.setOpacity(1);
this.layer.setPickEnabled(true);
this.layer.setName("Surface Images");
insertBeforeCompass(this.getWwd(), layer);
this.getControlPanel().add(makeControlPanel(), BorderLayout.SOUTH);
}
catch (Exception e)
{
e.printStackTrace();
}
this.getWwd().addSelectListener(new SelectListener() {
@Override
public void selected(SelectEvent event) {
PickedObjectList pol = AppFrame.this.getWwd().getObjectsAtCurrentPosition();
if(event.isLeftClick()){
System.out.println("POL SIZE "+pol.size());
}
}
});
}
Action openElevationsAction = new AbstractAction("Open Elevation File...")
{
public void actionPerformed(ActionEvent e)
{
int status = fileChooser.showOpenDialog(AppFrame.this);
if (status != JFileChooser.APPROVE_OPTION)
return;
final File imageFile = fileChooser.getSelectedFile();
if (imageFile == null)
return;
Thread t = new Thread(new Runnable()
{
public void run()
{
try
{
CompoundElevationModel cem
= (CompoundElevationModel) getWwd().getModel().getGlobe().getElevationModel();
LocalElevationModel em = new LocalElevationModel();
em.addElevations(imageFile.getPath());
cem.addElevationModel(em);
}
catch (IOException e1)
{
e1.printStackTrace();
}
}
});
t.setPriority(Thread.MIN_PRIORITY);
t.start();
}
};
Action openImageAction = new AbstractAction("Open Image File...")
{
public void actionPerformed(ActionEvent actionEvent)
{
int status = fileChooser.showOpenDialog(AppFrame.this);
if (status != JFileChooser.APPROVE_OPTION)
return;
final File imageFile = fileChooser.getSelectedFile();
if (imageFile == null)
return;
Thread t = new Thread(new Runnable()
{
public void run()
{
try
{
statusLabel.setText("status: Loading image");
// TODO: proper threading
layer.addImage(imageFile.getAbsolutePath());
getWwd().redraw();
statusLabel.setText("status: ready");
}
catch (IOException e)
{
e.printStackTrace();
}
}
});
t.setPriority(Thread.MIN_PRIORITY);
t.start();
}
};
private JPanel makeControlPanel()
{
JPanel controlPanel = new JPanel(new GridLayout(0, 1, 5, 5));
JButton openImageButton = new JButton(openImageAction);
controlPanel.add(openImageButton);
this.opacitySlider = new JSlider();
this.opacitySlider.setMaximum(100);
this.opacitySlider.setValue((int) (layer.getOpacity() * 100));
this.opacitySlider.setEnabled(true);
this.opacitySlider.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
int value = opacitySlider.getValue();
layer.setOpacity(value / 100d);
getWwd().redraw();
}
});
JPanel opacityPanel = new JPanel(new BorderLayout(5, 5));
opacityPanel.setBorder(new EmptyBorder(0, 10, 0, 0));
opacityPanel.add(new JLabel("Opacity"), BorderLayout.WEST);
opacityPanel.add(this.opacitySlider, BorderLayout.CENTER);
controlPanel.add(opacityPanel);
JButton openElevationsButton = new JButton(openElevationsAction);
controlPanel.add(openElevationsButton);
controlPanel.add(statusLabel);
controlPanel.setBorder(new EmptyBorder(15, 15, 15, 15));
return controlPanel;
}
}
public static void main(String[] args)
{
ApplicationTemplate.start("World Wind Surface Images", SurfaceImageViewer.AppFrame.class);
}
}
这些是 2 个相互层叠的 geotiff,我一直用它们来测试这一点。当我左键单击两个 geotiff 时,我希望 SelectListener 上的 println 打印出“3”。 (我已将 geotiff 上传到可用的 zip here )
您将看到这些的区域位于旧金山,请参见屏幕截图:
最佳答案
更新:
我们发现批量拣选的示例是面向 AbstractSurfaceObject 实例的,这在本例中并不适用。对于 SurfaceImage 实例的处理,setAlwaysOnTop 的属性应配置为 false,这似乎让选择事件处理光标下的所有元素。
<小时/>通读 DeepPicking 的示例,实际上有两件事需要完成。
In order to enable deep picking, any batch picking for the desired elements must be disabled and theSceneController's deep picking property must be enabled. See
{@link gov.nasa.worldwind.SceneController#setDeepPickEnabled(boolean)
我花了一点时间才理解第二个,但它似乎与 AbstractSurfaceObject 类相关。
<小时/>我相信在这种情况下,我会继承 SurfaceImageLayer ,并重写 addRenderable 方法。我会检查可渲染对象是否是 AbstractSurfaceObject 的实例,并在将其转发到父类(super class)之前禁用对其进行批量选取。
This code may not be the best long-term solution, but it may provide quick results to determine if this is the underlying issue.
import gov.nasa.worldwind.layers.SurfaceImageLayer;
import gov.nasa.worldwind.render.AbstractSurfaceObject;
import gov.nasa.worldwind.render.Renderable;
/**
* Very Rough extension of SurfaceImageLayer which disables batch picking on all AbstractSurfaceobjects.
* @author http://stackoverflow.com/users/5407189/jeremiah
* @since Nov 26, 2016
*
*/
public class MySurfaceImageLayer extends SurfaceImageLayer {
@Override
public void addRenderable(Renderable renderable) {
if (renderable instanceof AbstractSurfaceObject) {
((AbstractSurfaceObject)renderable).setEnableBatchPicking(false);
}
super.addRenderable(renderable);
}
@Override
public void addRenderables(Iterable<? extends Renderable> renderables) {
for (Renderable r : renderables) {
addRenderable(r);
}
}
}
<小时/>
如果您想要直接选择图像,则似乎不支持开箱即用。您需要执行一些操作才能从 SurfaceImageLayer 获取 SurfaceImage 引用,以便对 doPick 上的 RenderableLayer 可见。这可能会带来一系列需要注意的新问题。
我希望这至少有一些帮助。
祝你好运。
关于java - Worldwind SurfaceImage 深度/批量拣选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40751700/
我在 WorldWindowGLJPanel 的图层列表中添加了两个图层。其中一个是包含形状的 RenderableLayer,另一个是包含光栅图像的 BasicTiledImageLayer。 (一
有没有办法将图像放入 WorldWind 中的海拔高度?我可以使用Surface Image将图像放置在地球上 - 但我希望将其放置在地形上方的给定高度处,但我在 API 中没有找到它。 最佳答案 您
我在 WorldWind 的 Sphere 中看到了看似矛盾的行为-线相交逻辑。我创建了一个 Sphere 和 Line,它们相交但随后交集返回 null(扫描代码以获取评论://*** 这就是它变得
在 NASA WorldWind Java 中,我使用 PointPlacemark 来表示图像,因为无论缩放级别如何,它都保持相同的大小。问题是我想在 Point Placemark 上设置航向,即
我正在经历这个tutorial 每当我的鼠标悬停在用这个 code 创建的立方体上时(下面是我的版本),大气层和星星消失了。 正常情况下是这样的: 这是我将鼠标悬停在立方体上时的样子(看看大气层):
我想将 WorldWindowGLJPanel 放入 Pane 中,并且希望使其可调整大小,但我不能,即使我调用 resize 或 setSize 方法。 这是我正在做的事情: wwd = new W
我想创建一个应用程序,允许用户输入经度和纬度,然后将其显示在 map 上。我遇到过WorldWind但我以前从未听说过。 要创建这样的应用程序,我最好使用 WorldWind 或 OpenStreet
我想在地球上画一 strip 有高程表示的线,如下所示: 我知道我可以用折线来表示一条线,但是如何填充线下方的空间? 最佳答案 您可以使用路径来画线。 setOutlineMaterial 将绘制一个
我正在尝试在 NASA Worldwind for Java 中实现我自己的杂波过滤器,它导致了一个奇怪的问题 - 杂波过滤器还没有做太多事情,但当我通过时,我将使用它来移动东西。 “闪烁”问题。每当
当我点击地球时,我在获取位置(纬度/经度)时遇到了问题。 SO(和其他网站)上的任何地方都建议使用 getCurrentPosition 方法。 不幸的是,这会返回包含单击点的顶部可拾取对象的位置,因
Worldwind 的 Point PlaceMark 可渲染具有通过调用 setLineEnabled 从地标向下到地形放置一条线的功能。如此屏幕截图所示: 我想要做的是添加这样的一行,它也适用于可
我正在尝试找出一种方法,以编程方式获取用户在 WorldWind AnalyticSurface 上单击的点的视觉颜色(而不是拾取颜色)。 查看AnalyticSurface和 PickedObjec
我知道在 WorldWind Java 中,您可以通过以下方式找到海拔高度和特定位置: public Double getPositionElevationMeters(Double lat, Dou
本文整理了Java中gov.nasa.worldwind.util.WWMath类的一些代码示例,展示了WWMath类的具体用法。这些代码示例主要来源于Github/Stackoverflow/Mav
我正在从事与 nasa worldwind 相关的项目。 任何人都可以向我解释一下,我可以删除世界地图吗? 位于屏幕左上方。 最佳答案 如果您使用的是自定义 layers.xml 文件,您可以注释掉以
所以,我意识到这可能不是正确的网站,但我认为在 WorldWind 论坛上提问是不礼貌的。如果应该在其他地方,请告诉我。 无论如何... 我有一个 Java 应用程序,当前使用 WorldWind 来
我是 Web WorldWind 的新手,如果这是一个简单的问题,请原谅我,但我还没有在文档或其他地方找到解决方案。我有以下内容: Your browser does n
大家好!我在 WorldWind 库(它是 NASA 库)方面遇到了一些问题。我在 JetBrains Idea 14 中使用 Java 8 编写应用程序。在 Idea 中,我可以成功编译并运行我的应
我正在使用 WorldWind 并尝试在同一层中“挑选”多个表面图像,但不明白为什么它不起作用。 我的印象是这样称呼: this.getWwd().getSceneController().setDe
我有一个 WorldWindow,上面有各种 RenderableLayer。我想在运行时添加一个 CompassLayer。 try { String compassPath = "imag
我是一名优秀的程序员,十分优秀!