/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2007-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.renderer3d.example;
import com.vividsolutions.jts.geom.Envelope;
import org.geotools.data.FeatureSource;
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.gui.swing.*;
import org.geotools.map.DefaultMapContext;
import org.geotools.map.MapContext;
import org.geotools.referencing.CRS;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.geotools.renderer.GTRenderer;
import org.geotools.renderer.lite.StreamingRenderer;
import org.geotools.styling.SLDParser;
import org.geotools.styling.StyleFactory;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
/**
* Copied and edited from geotools examples.
*/
public class Show2DMapSpike
implements ActionListener
{
//======================================================================
// Non-Private Fields
JFrame frame;
JMapPane myMapPane;
JToolBar jtb;
JLabel text;
final JFileChooser jfc = new JFileChooser();
//======================================================================
// Public Methods
//----------------------------------------------------------------------
// Main Method
/**
* @param args
*/
public static void main( String[] args ) throws Exception
{
final Show2DMapSpike mapViewer = new Show2DMapSpike();
//MapContext context = loadMapContextFromCommandLine( args, mapViewer );
final ExampleDataGenerator exampleDataGenerator = new ExampleDataGenerator();
final MapContext context = exampleDataGenerator.createExampleMap();
mapViewer.setMapContext( context );
}
private static MapContext loadMapContextFromCommandLine( final String[] args, final Show2DMapSpike mapViewer )
throws Exception
{
MapContext context = null;
if ( args.length == 0 || !args[ 0 ].toLowerCase().endsWith( ".shp" ) )
{
System.out.println( "java org.geotools.gui.swing.MapViewer shapefile.shp" );
System.out.println( "Notes:" );
System.out.println( " Any provided shapefile.prj file or shapefile.sld will be used" );
System.exit( 0 );
}
else
{
String pathname = args[ 0 ];
URL shape = aquireURL( pathname );
if ( shape == null )
{
System.err.println( "Could not find shapefile: " + pathname );
System.exit( 1 );
}
String filepart = pathname.substring( 0, pathname.lastIndexOf( "." ) );
URL sldFile = aquireURL( filepart + ".sld" );
if ( sldFile == null )
{
System.err.println( "Could not find sld file: " + filepart + ".sld" );
System.exit( 1 );
}
context = mapViewer.load( shape, sldFile );
}
return context;
}
//----------------------------------------------------------------------
// Constructors
public Show2DMapSpike()
{
frame = new JFrame( "My Map Viewer" );
frame.setBounds( 20, 20, 450, 200 );
frame.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE );
Container content = frame.getContentPane();
myMapPane = new JMapPane();
//myMapPane.addZoomChangeListener(this);
content.setLayout( new BorderLayout() );
jtb = new JToolBar();
JButton load = new JButton( "Load file" );
load.addActionListener( this );
jtb.add( load );
Action zoomIn = new ZoomInAction( myMapPane );
Action zoomOut = new ZoomOutAction( myMapPane );
Action pan = new PanAction( myMapPane );
Action select = new SelectAction( myMapPane );
Action reset = new ResetAction( myMapPane );
jtb.add( zoomIn );
jtb.add( zoomOut );
jtb.add( pan );
jtb.addSeparator();
jtb.add( reset );
jtb.addSeparator();
jtb.add( select );
final JButton button = new JButton();
button.setText( "CRS" );
button.setToolTipText( "Change map prjection" );
button.addActionListener( new ActionListener()
{
public void actionPerformed( ActionEvent e )
{
String code = JOptionPane.showInputDialog( button, "Coordinate Reference System:", "EPSG:4326" );
if ( code == null )
{
return;
}
try
{
CoordinateReferenceSystem crs = CRS.decode( code );
setCRS( crs );
}
catch ( Exception fe )
{
fe.printStackTrace();
JOptionPane.showMessageDialog( button,
fe.getMessage(),
fe.getClass().toString(),
JOptionPane.ERROR_MESSAGE );
return;
}
}
} );
jtb.add( button );
content.add( jtb, BorderLayout.NORTH );
//JComponent sp = myMapPane.createScrollPane();
myMapPane.setSize( 400, 200 );
content.add( myMapPane, BorderLayout.CENTER );
content.doLayout();
frame.setVisible( true );
}
//----------------------------------------------------------------------
// Static Methods
public static URL aquireURL( String target )
{
if ( new File( target ).exists() )
{
try
{
return new File( target ).toURI().toURL();
}
catch ( MalformedURLException e )
{
}
}
try
{
return new URL( target );
}
catch ( MalformedURLException e )
{
return null;
}
}
//----------------------------------------------------------------------
// ActionListener Implementation
public void actionPerformed( ActionEvent e )
{
int returnVal = jfc.showOpenDialog( frame );
if ( returnVal == JFileChooser.APPROVE_OPTION )
{
String pathname = jfc.getSelectedFile().getAbsolutePath();
URL shape = aquireURL( pathname );
if ( shape == null )
{
JOptionPane.showMessageDialog( frame,
"could not find file \"" + pathname + "\"",
"Could not find file",
JOptionPane.ERROR_MESSAGE );
System.err.println( "Could not find shapefile: " + pathname );
return;
}
String filepart = pathname.substring( 0, pathname.lastIndexOf( "." ) );
URL sld = aquireURL( filepart + ".sld" );
if ( sld == null )
{
JOptionPane.showMessageDialog( frame,
"could not find SLD file \"" + filepart + ".sld\"",
"Could not find SLD file",
JOptionPane.ERROR_MESSAGE );
System.err.println( "Could not find sld file: " + filepart + ".sld" );
return;
}
try
{
setMapContext( load( shape, sld ) );
}
catch ( Exception e1 )
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
private void setMapContext( final MapContext context )
{
// myMapPane.setHighlightLayer( context.getLayer( 0 ) );
myMapPane.setMapArea( new Envelope( 0, 0, 100, 100 ) );
myMapPane.setRenderer( createRenderer() );
myMapPane.setContext( context );
// myMapPane.getRenderer().addLayer(new RenderedMapScale());
frame.repaint();
frame.doLayout();
}
//----------------------------------------------------------------------
// Other Public Methods
/**
* Method used to set the current map projection.
*
* @param crs A new CRS for the mappnae.
*/
public void setCRS( CoordinateReferenceSystem crs )
{
myMapPane.getContext().setAreaOfInterest( myMapPane.getContext().getAreaOfInterest(), crs );
myMapPane.setReset( true );
myMapPane.repaint();
}
public MapContext load( URL shape, URL sld ) throws Exception
{
ShapefileDataStore ds = new ShapefileDataStore( shape );
FeatureSource fs = ds.getFeatureSource();
com.vividsolutions.jts.geom.Envelope env = fs.getBounds();
myMapPane.setMapArea( env );
StyleFactory factory = CommonFactoryFinder.getStyleFactory( null );
SLDParser stylereader = new SLDParser( factory, sld );
org.geotools.styling.Style[] style = stylereader.readXML();
CoordinateReferenceSystem crs = fs.getSchema().getDefaultGeometry().getCoordinateSystem();
if ( crs == null )
{
crs = DefaultGeographicCRS.WGS84;
}
MapContext context = new DefaultMapContext( crs );
context.addLayer( fs, style[ 0 ] );
context.getLayerBounds();
return context;
}
private MapContext createContextFromShapefile( final URL shape, final URL sld )
throws IOException
{
ShapefileDataStore ds = new ShapefileDataStore( shape );
FeatureSource fs = ds.getFeatureSource();
com.vividsolutions.jts.geom.Envelope env = fs.getBounds();
myMapPane.setMapArea( env );
StyleFactory factory = CommonFactoryFinder.getStyleFactory( null );
SLDParser stylereader = new SLDParser( factory, sld );
org.geotools.styling.Style[] style = stylereader.readXML();
CoordinateReferenceSystem crs = fs.getSchema().getDefaultGeometry().getCoordinateSystem();
if ( crs == null )
{
crs = DefaultGeographicCRS.WGS84;
}
MapContext context = new DefaultMapContext( crs );
context.addLayer( fs, style[ 0 ] );
context.getLayerBounds();
return context;
}
private GTRenderer createRenderer()
{
GTRenderer renderer;
if ( false )
{
renderer = new StreamingRenderer();
HashMap hints = new HashMap();
hints.put( "memoryPreloadingEnabled", Boolean.TRUE );
renderer.setRendererHints( hints );
}
else
{
renderer = new StreamingRenderer();
HashMap hints = new HashMap();
hints.put( "memoryPreloadingEnabled", Boolean.FALSE );
renderer.setRendererHints( hints );
}
return renderer;
}
}