Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Worldwind SurfaceImage深度/批量分拣_Java_Worldwind - Fatal编程技术网

Java Worldwind SurfaceImage深度/批量分拣

Java Worldwind SurfaceImage深度/批量分拣,java,worldwind,Java,Worldwind,我正在使用WorldWind,试图在同一层中“拾取”多个曲面图像,但不理解为什么它不起作用 我的印象是这样称呼: this.getWwd().getSceneController().setDeepPickEnabled(true); 将使我能够在同一层中拾取多个可渲染对象。这似乎适用于除SurfaceImage以外的所有其他情况。我还注意到,如果我强制加载SurfaceImage到不同的层中,它将按预期工作 这是我用来测试的代码: public class SurfaceImageViewe

我正在使用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);
    }
}
这两个GeoTiff层叠在一起,我一直在使用它们来测试这一点。当我左键单击两个geotiff时,我希望SelectListener上的println打印出“3”。(我已将GeoTiff上传到可用的zip中)

<> P>旧金山将看到这些区域,见屏幕截图:

更新:

我们发现,批量挑选的示例是围绕AbstractSurfaceObject实例的,但在本例中不适用。对于SurfaceImage实例的处理,setAlwaysOnTop的属性应配置为false,以使选择事件处理光标下的所有元素


通过阅读DeepPick的示例,实际上需要做两件事

  • setDeepPickEnabled(真)//这已经完成了
  • 禁用对所需元素的批拾取
  • 为了启用深度拣选,必须禁用所需元素的任何批量拣选,并且 必须启用SceneControl的深度拾取属性。参见
    {@link gov.nasa.worldwind.SceneController#setdeeppickabled(布尔值)

    我花了一点时间才理解第二个,但它似乎与AbstractSurfaceObject类有关


    • 我假设你在图层上绘制的东西是AbstractSurfaceObject的子类
    我相信在这种情况下,我会将SurfaceImageLayer子类化,并重写addRenderable方法。我会检查renderable是否是AbstractSurfaceObject的实例,并在将其转发到超类之前禁用对其进行批处理

    这段代码可能不是最好的长期解决方案,但它可以提供快速结果,以确定这是否是根本问题

    import gov.nasa.worldwind.layers.SurfaceImageLayer;
    import gov.nasa.worldwind.render.AbstractSurfaceObject;
    import gov.nasa.worldwind.render.Renderable;
    /**
    *SurfaceImageLayer的非常粗略的扩展,它禁用对所有AbstractSurfaceObject的批拾取。
    *@作者http://stackoverflow.com/users/5407189/jeremiah
    *@自2016年11月26日起
    *
    */
    公共类MySurfaceImageLayer扩展了SurfaceImageLayer{
    @凌驾
    公共void addRenderable(Renderable Renderable){
    if(AbstractSurfaceObject的可渲染实例){
    ((AbstractSurfaceObject)renderable).setEnableBatchPicking(false);
    }
    super.addRenderable(renderable);
    }
    @凌驾
    
    公共可渲染性(IterableThanks感谢您的关注——不幸的是,表面图像导入程序似乎使用了gov.nasa.worldwind.render.SurfaceImage作为其可渲染对象,而表面图像并未扩展到gov.nasa.worldwind.render.AbstractSurfaceObject。表面图像在批量/深度拾取时似乎被视为特例或其他内容,但我看不出问题出在哪里。感谢您返回AbstractSurfaceObject结果!如果您调试RenderableLayer中的PickSupport引用,它会在光标下找到所有SurfaceImages吗?您可能会在输出中看到“TopPickedObject”,但PickSupport保留所有有效对象的映射要为层选择的对象。如果它知道surfaceImage实例,那么您可能可以调整该类向SceneControl报告的方式。有趣的想法。我将深入研究PickSupport,看看是否可以找到它丢失引用的位置。我想我已经找到了它——当设置为Alwayso时,它会在surfaceImage中沿着不同的代码路径运行nTop是真的。我试过了,事情开始按预期进行!很高兴听到这个消息!祝贺你。
    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);
           }
        }
    }