/*
* Licensed Materials - Property of Rogue Wave Software, Inc.
* © Copyright Rogue Wave Software, Inc. 2014, 2017
* © Copyright IBM Corp. 2009, 2014
* © Copyright ILOG 1996, 2009
* All Rights Reserved.
*
* Note to U.S. Government Users Restricted Rights:
* The Software and Documentation were developed at private expense and
* are "Commercial Items" as that term is defined at 48 CFR 2.101,
* consisting of "Commercial Computer Software" and
* "Commercial Computer Software Documentation", as such terms are
* used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4,
* as applicable.
*/
import ilog.views.IlvGrapher;
import ilog.views.IlvManager;
import ilog.views.IlvManagerView;
import ilog.views.IlvTransformer;
import ilog.views.maps.IlvAreasOfInterestProperty;
import ilog.views.maps.IlvCoordinateSystemProperty;
import ilog.views.maps.IlvMapLayerTreeProperty;
import ilog.views.maps.IlvMapScaleLimiter;
import ilog.views.maps.beans.IlvJAutomaticScaleBar;
import ilog.views.maps.beans.IlvJMapsManagerViewControlBar;
import ilog.views.maps.beans.IlvJMouseCoordinateViewer;
import ilog.views.maps.beans.IlvLayerTreePanel;
import ilog.views.maps.beans.IlvMapLayer;
import ilog.views.maps.beans.IlvMapLayerTreeModel;
import ilog.views.maps.datasource.IlvMapDataSource;
import ilog.views.maps.datasource.IlvMapDataSourceModel;
import ilog.views.maps.datasource.IlvMapDataSourceProperty;
import ilog.views.maps.format.dted.IlvRasterDTEDReader;
import ilog.views.maps.graphic.style.IlvMapStyleBeanInfo;
import ilog.views.maps.raster.datasource.IlvRasterDataSourceFactory;
import ilog.views.maps.srs.coordsys.IlvGeographicCoordinateSystem;
import ilog.views.swing.IlvJScrollManagerView;
import ilog.views.tiling.IlvFreeTile;
import ilog.views.tiling.IlvTileController;
import ilog.views.tiling.IlvTiledLayer;
import ilog.views.util.IlvProductUtil;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.net.URL;
import java.util.Iterator;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.JSplitPane;
import javax.swing.filechooser.FileFilter;
/**
* Demo that shows the loading of DTED files using JVIews Maps API.
*/
SuppressWarnings("serial")
public class DtedDemo extends JRootPane {
static
{
// This sample uses JViews Maps features. When deploying an
// application that includes this code, you need to be in possession
// of a Rogue Wave JViews Maps Deployment license.
IlvProductUtil.DeploymentLicenseRequired(
IlvProductUtil.JViews_Maps_Deployment);
}
IlvManagerView view;// map view
IlvJScrollManagerView viewScroll;// scroll around the map view
IlvJMapsManagerViewControlBar viewToolbar; // zoom & selection toolbar
IlvLayerTreePanel layerTreePanel = new IlvLayerTreePanel(); // layer visibility and props. control
IlvJMouseCoordinateViewer locator;// coordinate information
JFileChooser fileChooser; // file chooser to open DTED files
JCheckBox lodCheckBox;
/**
* Creates a new <code>DtedDemo</code>.
*/
public DtedDemo() {
super();
// Make sure the swing construction is called in Swing event thread.
ilog.views.util.swing.IlvSwingUtil.invokeAndWait(new Runnable() { Override
public void run() {
// Set raster bean info in advanced mode -> shows color model ....
IlvMapStyleBeanInfo.setAdvancedMode(true);
// create the main components
view = new IlvManagerView();
view.setManager(new IlvGrapher());
viewScroll = new IlvJScrollManagerView(view);
viewToolbar = new IlvJMapsManagerViewControlBar();
// Setup the components
viewToolbar.setView(view);
locator = new IlvJMouseCoordinateViewer();
locator.setView(view);
view.setKeepingAspectRatio(true);
view.setBackground(new Color(80, 180, 240));
view.setAntialiasing(false);
view.setSize(new Dimension(450, 450));
viewScroll.setPreferredSize(new Dimension(view.getWidth() + 22, view.getHeight() + 22));
layerTreePanel.setView(view);
viewToolbar.addSeparator();
try {
fileChooser = new JFileChooser(new File(".")); //$NON-NLS-1$
lodCheckBox = new JCheckBox("Load on demand", true); //$NON-NLS-1$ // should be I18N
fileChooser.setAccessory(lodCheckBox);
JButton openDTEDFilesButton = new JButton("Open DTED"); //$NON-NLS-1$ // should be I18N
openDTEDFilesButton.addActionListener(new ActionListener() {
Override
public void actionPerformed(ActionEvent e) {
openFiles();
}
});
viewToolbar.add(openDTEDFilesButton);
JButton clearManagerButton = new JButton("Clear map"); //$NON-NLS-1$ // should be I18N
clearManagerButton.addActionListener(new ActionListener() {
Override
public void actionPerformed(ActionEvent e) {
clearManager();
// JV-2862 - reset transformer.
view.setTransformer(new IlvTransformer());
view.repaint();
}
});
viewToolbar.add(clearManagerButton);
} catch (SecurityException e) {
}
// coordinate panel (coordinates display + scale bar)
JPanel coordPanel = new JPanel(new BorderLayout());
IlvJAutomaticScaleBar scaleBar = new IlvJAutomaticScaleBar();
scaleBar.setView(view);
coordPanel.add(scaleBar, BorderLayout.EAST);
coordPanel.add(locator, BorderLayout.CENTER);
// geo reference the view
view.getManager().setNamedProperty(new IlvCoordinateSystemProperty(IlvGeographicCoordinateSystem.WGS84));
// limit the zoom to correct scales.
IlvMapScaleLimiter limiter = new IlvMapScaleLimiter(1f / 1000f, (float) (1 / 1E9));
limiter.setView(view);
// build map
URL dtedFile = DtedDemo.class.getResource("data/n48.dt0"); //$NON-NLS-1$
// loadFiles(new String[] { dtedFile.getPath()}, false);
loadFiles(new URL[] { dtedFile }, false);
// select the layer.
layerTreePanel.getLayerTree().setSelectionRow(0);
// setup file chooser
// configure the main window
getContentPane().add(viewToolbar, BorderLayout.NORTH);
JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, layerTreePanel, viewScroll);
getContentPane().add(split, BorderLayout.CENTER);
getContentPane().add(coordPanel, BorderLayout.SOUTH);
}});// event thread runnable
}
/**
* Pops-up a file choosing dialog to select DTED files
*/
public void openFiles() {
// open file chooser dialog
fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
fileChooser.setMultiSelectionEnabled(true);
fileChooser.setFileFilter(new DTEDFileFilter());
int choice = fileChooser.showOpenDialog(this);
if (choice != JFileChooser.APPROVE_OPTION) {
// file choice was cancelled
return;
}
// get selected files (files AND Directories)
File[] selectedFiles = fileChooser.getSelectedFiles();
// recurse to list all DTED files within subdirectories
Vector<String> fileList = new Vector<String>();
for (int i = 0; i < selectedFiles.length; i++) {
listDTEDFiles(selectedFiles[i], fileList);
}
final String[] filenames = fileList.toArray(new String[0]);
// eventually load these files
final boolean loadOnDemand = lodCheckBox.isSelected();
loadFiles(filenames, loadOnDemand);
}
/**
* Recursive method to list dted files in subdirectories
*/
private void listDTEDFiles(File f, Vector<String> fileList) {
if (f.isDirectory()) {
File[] sub = f.listFiles();
for (int i = 0; i < sub.length; i++) {
listDTEDFiles(sub[i], fileList);
}
} else if (fileChooser == null || fileChooser.getFileFilter().accept(f)) {
fileList.add(f.getPath());
}
}
/**
* Creates a DTED datasource from the specified filenames.
*/
private void loadFiles(String[] filenames, boolean loadOnDemand) {
if (filenames.length == 0) {
// no files to load
return;
}
try {
// create a raster reader for the dted file (necessary to create a datasource below)
IlvRasterDTEDReader DTEDReader = new IlvRasterDTEDReader();
// add dted files to the DTED reader
for (int i = 0; i < filenames.length; i++) {
DTEDReader.addMap(filenames[i]);
}
String layerContent;
if (filenames.length == 1) {
layerContent = new File(filenames[0]).getName();
} else {
layerContent = new File(filenames[0]).getName() + "~" + new File(filenames[filenames.length - 1]).getName(); //$NON-NLS-1$
}
doLoadFiles(DTEDReader, loadOnDemand, layerContent);
} catch (Exception e1) {
e1.printStackTrace();
}
}
/**
* Creates a DTED datasource from the specified filenames.
*/
private void loadFiles(URL[] urls, boolean loadOnDemand) {
if (urls.length == 0) {
// no files to load
return;
}
try {
// create a raster reader for the dted file (necessary to create a datasource below)
IlvRasterDTEDReader DTEDReader = new IlvRasterDTEDReader();
// add dted files to the DTED reader
for (int i = 0; i < urls.length; i++) {
DTEDReader.addMap(urls[i]);
}
String layerContent;
if (urls.length == 1) {
layerContent = urls[0].toExternalForm();
} else {
layerContent = urls[0].toExternalForm() + "~" + urls[urls.length - 1].toExternalForm(); //$NON-NLS-1$
}
doLoadFiles(DTEDReader, loadOnDemand, layerContent);
} catch (Exception e1) {
e1.printStackTrace();
}
}
void doLoadFiles(IlvRasterDTEDReader DTEDReader, boolean loadOnDemand, String layerContent)
throws InterruptedException {
// create a datasource for the dted reader.
IlvMapDataSource DTEDDataSource = IlvRasterDataSourceFactory.buildTiledImageDataSource(view.getManager(),
DTEDReader, loadOnDemand, loadOnDemand, null);
// insert it in the manager's data source tree
final IlvMapDataSourceModel dataSourceModel = IlvMapDataSourceProperty.GetMapDataSourceModel(view.getManager());
dataSourceModel.insert(DTEDDataSource);
// start reading (recusively start all data sources of this model)
Thread loader = new Thread() {
Override
public void run() {
dataSourceModel.start();
}
};
loader.start();
loader.join();
// get the DTED maplayer used to display that data source
IlvMapLayer DTEDLayer = DTEDDataSource.getInsertionLayer();
DTEDLayer.setName("DTED layer (" + layerContent + ")"); //$NON-NLS-1$//$NON-NLS-2$ // should be I18N
// insert it on the manager's map layer tree
IlvMapLayerTreeModel ltm = IlvMapLayerTreeProperty.GetMapLayerTreeModel(view.getManager());
ltm.addChild(null, DTEDLayer);
// in load on demand, ensure that only the first tile is visible
if (loadOnDemand) {
final IlvTiledLayer tiledLayer = (IlvTiledLayer) DTEDLayer.getManagerLayer();
final IlvTileController tileController = tiledLayer.getTileController();
Iterator<?> tiles = tileController.getTiles().iterator();
if (tiles.hasNext()) {
IlvFreeTile firstTile = (IlvFreeTile) tiles.next();
tiledLayer.fitTransformerToTile(view, firstTile);
}
}
if (!loadOnDemand) {
// not in load on demand, we can zoom on the whole data.
view.fitTransformerToContent();
view.repaint();
}
}
/**
* Main method
* @param args ignored parameter.
*/
public static void main(String[] args) {
// Sun recommends that to put the entire GUI initialization into the
// AWT thread
javax.swing.SwingUtilities.invokeLater(new Runnable() {
Override
public void run() {
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DtedDemo demo = new DtedDemo();
frame.getContentPane().add(demo);
frame.setTitle("DTED demo");//$NON-NLS-1$ // should be I18N
frame.pack();
frame.setVisible(true);
}
});
}
/**
* Removes all layers from a manager and clear the associated model
*/
private void clearManager() {
IlvManager manager = view.getManager();
IlvMapLayerTreeModel model = IlvMapLayerTreeProperty.GetMapLayerTreeModel(manager);
model.clearAllObjects();
while (manager.getLayersCount() > 0) {
manager.removeLayer(0, false);
}
manager.removeNamedProperty(IlvMapLayerTreeProperty.NAME);
manager.removeNamedProperty(IlvMapDataSourceProperty.NAME);
manager.removeNamedProperty(IlvAreasOfInterestProperty.NAME);
}
/**
* Simple DTED filefilter
* @author eaullas
*
*/
private static class DTEDFileFilter extends FileFilter {
/**
* Implementation of accept method of class FileFilter. Accept only DTED files
* @see javax.swing.filechooser.FileFilter#accept(java.io.File)
*/
Override
public boolean accept(File f) {
String filename = f.getName();
boolean accept = f.isDirectory() || filename.endsWith(".dt0") //$NON-NLS-1$
|| filename.endsWith(".dt1") //$NON-NLS-1$
|| filename.endsWith(".dt2") //$NON-NLS-1$
|| filename.endsWith(".dt3"); //$NON-NLS-1$
return accept;
}
/**
* Return the description of files accepted by this filter
* @see javax.swing.filechooser.FileFilter#getDescription()
*/
Override
public String getDescription() {
return "DTED file (*.dt0,*.dt1,*.dt2,*.dt3)"; //$NON-NLS-1$// should be I18N
}
}
}