/*
* 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 java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import ilog.views.IlvGraphic;
import ilog.views.IlvManager;
import ilog.views.IlvManagerView;
import ilog.views.IlvPoint;
import ilog.views.IlvTransformer;
import ilog.views.event.ManagerSelectionChangedEvent;
import ilog.views.event.ManagerSelectionListener;
import ilog.views.graphic.IlvMarker;
import ilog.views.interactor.IlvSelectInteractor;
import ilog.views.maps.IlvAngularUnit;
import ilog.views.maps.IlvCoordinate;
import ilog.views.maps.projection.IlvEllipsoid;
import ilog.views.maps.projection.IlvHorizontalShiftDatum;
import ilog.views.maps.projection.IlvLambertAzimuthalEqualAreaProjection;
import ilog.views.maps.projection.IlvProjection;
import ilog.views.maps.projection.IlvProjectionUtil;
import ilog.views.maps.srs.coordsys.IlvGeographicCoordinateSystem;
import ilog.views.maps.srs.coordsys.IlvMeridian;
import ilog.views.maps.srs.coordsys.IlvProjectedCoordinateSystem;
import ilog.views.maps.srs.coordtrans.IlvCoordinateTransformation;
import ilog.views.maps.srs.coordtrans.IlvCoordinateTransformationException;
import ilog.views.swing.IlvJScrollManagerView;
import ilog.views.util.IlvProductUtil;
/**
* A sample application creating a map and displaying cities at their right
* location.
*/
class Sample2 extends JFrame {
private IlvManager manager;
private IlvManagerView mgrview;
// The transformation from geographic CS to projected CS
private IlvCoordinateTransformation geo2projCT;
// The inverse transformation
private IlvCoordinateTransformation proj2geoCT;
private JTextField llField;
private JTextField cityField;
/**
* Constructor
*/
public Sample2(String filename) {
super("Integrating SRS and graphics");
createUI();
// loading a map of the USA
try {
manager.read(filename);
} catch (Exception e) {
e.printStackTrace();
System.exit(0);
}
createTransformations();
addCities();
setViewInteractor();
}
/**
* Creates the UI for this application
*/
private void createUI() {
// Creation of the manager and the view
manager = new IlvManager();
mgrview = new IlvManagerView(manager);
mgrview.setKeepingAspectRatio(true);
IlvJScrollManagerView panel = new IlvJScrollManagerView(mgrview);
getContentPane().setLayout(new BorderLayout());
getContentPane().add("Center", panel);
// Creation of the text fields to display info
JPanel southPanel = new JPanel();
southPanel.setLayout(new GridLayout(1, 0));
llField = new JTextField();
llField.setEditable(false);
southPanel.add(llField);
cityField = new JTextField();
cityField.setEditable(false);
southPanel.add(cityField);
getContentPane().add("South", southPanel);
// A window listener
addWindowListener(new WindowAdapter() {
Override
public void windowClosing(WindowEvent evt) {
System.exit(0);
}
Override
public void windowOpened(WindowEvent evt) {
mgrview.fitTransformerToContent();
}
});
}
/**
* This function creates the projection to be used with the file usa.ivl
*/
private void createTransformations() {
// Create the projection
IlvProjection projection1 = new IlvLambertAzimuthalEqualAreaProjection();
projection1.setEllipsoid(IlvEllipsoid.SPHERE);
try {
double centralMeridian = IlvAngularUnit.RADIAN.fromDMS("100DW");
double centralParallel = IlvAngularUnit.RADIAN.fromDMS("40DN");
projection1.setCentralMeridian(centralMeridian);
projection1.setCentralParallel(centralParallel);
} catch (IllegalArgumentException e) {
System.out.println("wrong string passed to " + "IlvAngularUnit.RADIAN.fromDMS");
System.out.println("unable to create the projection for the file" + "usa.ivl");
System.exit(0);
}
// Create the projected coordinate system
IlvProjectedCoordinateSystem projectedCS = new IlvProjectedCoordinateSystem("Lambert Azimutal Equal Area",
projection1);
// Create the geographic coordinate system
IlvGeographicCoordinateSystem geoCS = new IlvGeographicCoordinateSystem(IlvHorizontalShiftDatum.SPHERE_WGS84,
IlvMeridian.GREENWICH);
// A coordinate transform
geo2projCT = IlvCoordinateTransformation.CreateTransformation(geoCS, projectedCS);
// The inverse transform
proj2geoCT = geo2projCT.getInverse();
}
/**
* This function adds some cities on top of the map of the USA.
*/
private void addCities() {
addCity("Washington", "39D11'N", "76D51W");
addCity("New York", "40D59'N", "73D39'W");
addCity("Miami", "25D58'N", "80D02'W");
addCity("San Francisco", "37D44'N", "122D20'W");
addCity("Seattle", "47D51'N", "122D01'W");
addCity("Denvers", "39D50'N", "104D53'W");
}
/**
* Add a city to the map.
*
* @param cityName
* The name of the city
* @param lat
* A string representing the city latitude, in DMS format.
* @param lon
* A string representing the city longitude, in DMS format.
*/
private void addCity(String cityName, String lat, String lon) {
try {
double latitude = IlvAngularUnit.DEGREE.fromDMS(lat);
double longitude = IlvAngularUnit.DEGREE.fromDMS(lon);
IlvCoordinate coordinate = new IlvCoordinate(longitude, latitude);
geo2projCT.transform(coordinate, coordinate);
IlvPoint p = new IlvPoint(coordinate.x, coordinate.y);
IlvProjectionUtil.invertY(p);
IlvMarker marker = new IlvMarker(p, IlvMarker.IlvMarkerFilledDiamond);
marker.setSize(4);
marker.setForeground(Color.red);
manager.addObject(marker, 1, false);
marker.setName(cityName);
} catch (IlvCoordinateTransformationException e) {
e.printStackTrace();
}
}
private void setViewInteractor() {
IlvSelectInteractor interactor = new IlvSelectInteractor();
interactor.setDragAllowed(false);
interactor.setEditionAllowed(false);
interactor.setMoveAllowed(false);
interactor.setMultipleSelectionMode(false);
manager.setSelectable(0, false);
mgrview.pushInteractor(interactor);
// display the position of the mouse
interactor.addMouseMotionListener(new MouseMotionAdapter() {
Override
public void mouseMoved(MouseEvent e) {
// get the point in manager coordinates
IlvTransformer t = mgrview.getTransformer();
IlvPoint p = new IlvPoint(e.getX(), e.getY());
t.inverse(p);
IlvProjectionUtil.invertY(p);
// Display the mouse position
try {
IlvCoordinate c = new IlvCoordinate(p.x, p.y);
proj2geoCT.transform(c, c);
llField.setText(IlvAngularUnit.DEGREE.toDMS(c.x, false) + " " + IlvAngularUnit.DEGREE.toDMS(c.x, true));
} catch (IlvCoordinateTransformationException ex) {
System.out.println("Unable to inverse this point " + ex.getMessage());
}
}
});
// display the name of the city when a city is selected
manager.addManagerSelectionListener(new ManagerSelectionListener() {
Override
public void selectionChanged(ManagerSelectionChangedEvent e) {
IlvGraphic g = e.getGraphic();
if (g == null)
return;
String name = g.getName();
if (name != null)
cityField.setText(name);
}
});
}
static public void main(final String args[]) {
// 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);
// Sun recommends that to put the entire GUI initialization into the
// AWT thread
javax.swing.SwingUtilities.invokeLater(new Runnable() {
Override
public void run() {
Sample2 s = new Sample2(args[0]);
s.setSize(400, 300);
s.setVisible(true);
}
});
}
}