Я использую WorldWind и пытаюсь «выбрать» несколько изображений на одном уровне и не понимаю, почему он не работает.Worldwind SurfaceImage Deep/Batch Picking
Я был под впечатлением, что, называя это:
this.getWwd().getSceneController().setDeepPickEnabled(true);
позволит мне выбрать несколько renderables в том же слое. Это похоже на работу во всех других случаях, кроме 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 GeoTiffs, которые наслаиваются друг на друга, что я использую, чтобы проверить это. Я бы ожидал, что мой println на SelectListener распечатает «3», когда я нажму левой кнопкой мыши на обоих геотифах. (Я загрузил GeoTiffs в почтовый индекс доступной here)
область, где вы будете видеть их в Сан-Франциско, см скриншот:
Спасибо, что посмотрели - к сожалению, похоже, что импортер SurfaceImage использует gov.nasa.worldwind.render.SurfaceImage, поскольку его Renderable и SurfaceImage не распространяют gov.nasa.worldwind.render.AbstractSurfaceObject. Кажется, что SurfaceImage рассматривается как особый случай или что-то, когда дело доходит до пакетного/глубокого выбора, но я не вижу, где проблема заключается в том, чтобы взломать его. – systemoutprintln
Спасибо, что вернулись на результаты AbstractSurfaceObject! Если вы отлаживаете ссылку PickSupport внутри RenderableLayer, найдет ли она все SurfaceImages под курсором? Вы можете видеть «TopPickedObject» в выводе, но PickSupport содержит карту всех допустимых объектов для выбора для слоя. Если он знает о экземплярах surfaceImage, то, возможно, вы можете настроить, как этот класс возвращается к SceneController. – Jeremiah
Интересная мысль. Я буду копаться в PickSupport, чтобы узнать, могу ли я найти, где он теряет ссылку. – systemoutprintln