Hey all,

I'm trying out the pre-release of 2.2.0. When I try to load the tools
(Actions) I get an error. 

The error message was slightly more descriptive when running from an SVN
build, giving:
        
        Exception in thread "main" java.lang.ExceptionInInitializerError
                at
        org.geotools.gui.swing.ZoomInAction.<init>(ZoomInAction.java:40)
                at
        org.geotools.demo.introduction.QuickStart.initGUI(QuickStart.java:443)
                at
        org.geotools.demo.introduction.QuickStart.main(QuickStart.java:613)
        Caused by: java.util.MissingResourceException: Can't find bundle
        for base name org.geotools.gui.swing.messages, locale en_US
                at
        
java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:836)
                at
        java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:805)
                at java.util.ResourceBundle.getBundle(ResourceBundle.java:549)
                at org.geotools.gui.swing.Messages.<clinit>(Messages.java:9)
                ... 3 more

The caused by: line suggests there ought to be something in 
  org.geotools.gui.swing.messages
but everything is up one directory level. 

Any suggestions/ideas?

I attach the current version of my intro demo code.

--adrian
/*
 *    GeoTools - OpenSource mapping toolkit
 *    http://geotools.org
 *    (C) 2006, GeoTools Project Managment Committee (PMC)
 *    (C) 2006, Adrian Custer, assigned to the PMC.
 *
 *    This file is hereby placed into the Public Domain. This means anyone is
 *    free to do whatever they wish with this file. Use it well and enjoy!
 */

package org.geotools.demo.introduction;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JToolBar;

import org.geotools.TestData;
import org.geotools.data.FeatureSource;
import org.geotools.data.memory.MemoryDataStore;
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.feature.AttributeType;
import org.geotools.feature.AttributeTypeFactory;
import org.geotools.feature.Feature;
import org.geotools.feature.FeatureTypes;
import org.geotools.feature.GeometryAttributeType;
import org.geotools.feature.IllegalAttributeException;
import org.geotools.feature.SchemaException;
import org.geotools.gui.swing.JMapPane;
import org.geotools.gui.swing.PanAction;
import org.geotools.gui.swing.ResetAction;
import org.geotools.gui.swing.SelectAction;
import org.geotools.gui.swing.ZoomInAction;
import org.geotools.gui.swing.ZoomOutAction;
import org.geotools.map.DefaultMapContext;
import org.geotools.map.MapContext;
import org.geotools.referencing.CRS;
import org.geotools.renderer.GTRenderer;
import org.geotools.renderer.lite.StreamingRenderer;
import org.geotools.styling.Graphic;
import org.geotools.styling.Mark;
import org.geotools.styling.SLDParser;
import org.geotools.styling.Style;
import org.geotools.styling.StyleBuilder;
import org.geotools.styling.StyleFactory;
import org.geotools.styling.StyleFactoryFinder;
import org.geotools.styling.Symbolizer;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;

import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Point;

/**
 * The QuickStart class, through its main() method, is a quick introductory
 * tutorial to each of the major modules of the Geotools library. 
 * 
 * WARNING: This is a work in progress and is incomplete.
 * 
 * WARNING: The code is presented as a long sequential series of steps to 
 *          ensure easy legibility instead of seeking programming elegance. The
 *          code, apart from main(), will run in the order of the methods in the
 *          file; it can therefore be read from top to bottom.
 * 
 * This tutorial shows the following elements: 
 * 
 *     (1) FeatureSource creation:
 *           This creates, through several approaches, the handles which are
 *           used later for the manipulation of data.
 *           
 *         1.1 - a feature source from scratch
 *         1.2 - a feature source from a shapefile
 *         1.3 - a feature source from a WMS/WFS (an image)
 *         
 *     (.) Catalog creation:
 *           This creates a resource through which to handle all the features 
 *           used by a complex application.
 *     
 *     (.) Coordinate Transform creation:
 *           This creates a coordinate operation and uses that to transform the 
 *           data in a feature source to a different Coordinate Referencing 
 *           System.
 *     
 *     (.) Query creation:
 *           This creates a Filter/Expression to query a feature for its 
 *           contents and thereby to subset a feature.
 *     
 *     ...
 *     
 *     (5) Style creation:
 *           This creates the graphical elements which are used to display 
 *           the data.
 *     
 *     (6) Display:
 *           This creates a GUI MapViewerto display the data.
 *           
 *     (7) Image output:
 *           This renders an image to an image buffer and then dumps the image
 *           buffer to a file.
 *           
 *     ...
 *     
 * 
 * 
 * HISTORY: 
 *   This class regroups work from many different tutorials.
 *     Section 1.1 - "Feature from scratch" was inspired by earlier tutorials.
 *     Section 1.2 - "Feature from shapefile" was in Ian's MapViewer class.
 *    
 *     Section 5   - The style demo came from an email by Tom Howe on user-list.
 *     Section 6   - The GUI was inspired by Ian Turton's MapViewer demo.
 *     Section 7   - MakeImage with email advice from David Adler, Aaron B. Parks.
 * 
 * @author  Adrian Custer
 * @version 0.01
 * @since   2.2RC5
 *
 */
public class QuickStart {
	
	/* The handles for the ShapeFile and Styled Layer Descriptor (SLD) files. */
	/*   This is a little confusing due to the use of 3 possible sources of   */
	/*   data, either from the introduction, the mappane or the testdata jars */
	/*   Use by uncommenting, for *one single* CASE:, the three lines below   */
	// TODO: Ensure these can be discovered at runtime

	static final int DATA_FROM_MAPPANE = 1;
	static final int DATA_FROM_SAMPLEDATA = 2;
	static final int DATA_FROM_INTRODUCTION = 3;
	
	/* CASE: Data from JMapPane, get via Class.getResource() */
	static final int dataSource = DATA_FROM_MAPPANE;
	static final String shpName = "/data/countries.shp";//in mappane
	static final String sldName = "/data/countries.sld";//in mappane
	
	/* CASE: Data from TestData, get using TestData.method() for url, file, ... */
//	static final int dataSource = DATA_FROM_TESTDATA;
//	static final String shpName = "/org/geotools/test-data/shapes/statepop.shp";
//	static final String sldName = "/org/geotools/test-data/shapes/statepop.sld";//WARNING: does not exist
	
	/* CASE: Data from File, get using direct reference */
//	static final int dataSource = DATA_FROM_INTRODUCTION;
//	static final String shpName = "data/world/countries.shp";
//	static final String sldName = "data/world/countries.sld";
	
	static File shpFile;
    static URL shpURL;
    static File sldFile;
    static URL sldURL;
	
	
	// The name of the website.
	static final URL webUrl = null;  
	
	// The filename for the output image.
	static final String imageFileEnd = "image.png";
	
	
	
	
	// FeatureSource variables
	static FeatureSource memFS, shpFS, webFS;
	
	// StyledLayerDescriptor variables
	static Style memStyl;
	static Style shpStyl;
	static Style webStyl;

	//GUI frame, pane and extras
    static JFrame frame;
    static JMapPane jmp;
    static JToolBar jtb;
    static JLabel text;
    
    //Display elements
    static MapContext context;
    static GTRenderer renderer;
    static com.vividsolutions.jts.geom.Envelope worldbounds;
    
    
    	
    /*
     * Create London from scratch! Well, only a FeatureSource for the city.
     * 
     * Create:
     *   (1) The Geometry
     *   (2) The CoordinateReferenceSystem
     *   (3) The Feature starting with AttributeTypes to make the FeatureType
     *   (4) The MemoryDataStore to get a FeatureSource
     */
    public static void createFeatureSourceFromScratch(){
    	
    	/* 
    	 * Make a Geometry using the JTS library
    	 * 
    	 *   see the Geometry Tutorial for more detail
    	 */
    	
        // Create a com.vividsolutions.jts.geom.Coordinate for a point
    	// Wikipedia gives London as:  51° 30.4167′ N 0° 7.65′ W 
    	// Gt 2.2 coordinate order is Long/Lat throughout; in 2.3 the CRS rules
        Coordinate ptc = new Coordinate(0.1275d,51.507d);
        // Create a com.vividsolutions.jts.geom.GeometryFactory
		GeometryFactory geomFac = new GeometryFactory();
		// Use the factory to make the jts geometries
        Point ptG = geomFac.createPoint(ptc);
        
        
        /* 
         * Get a CoordinateReferenceSystem
         * 
         *   see the Geopositioning Tutorial for more detail
         */
        
        // Grab a premade CRS
        CoordinateReferenceSystem ptCRS = 
        	            org.geotools.referencing.crs.DefaultGeographicCRS.WGS84;
        
        
        /* 
         * Create the Feature
         * 
         *   see the Feature Tutorial for more detail
         *   
         *   (1) Create the AttributeTypes
         *   (2) Create the FeatureType
         *   (3) Create the Feature
         */
        
        //Create the AttributeTypes, starting with the GeometryAttributeType
    	Class cls = ptG.getClass();
    	
    	GeometryAttributeType ptGA = 
    		(GeometryAttributeType) AttributeTypeFactory.newAttributeType(
				                          "the_geom", cls, true, 1, null,ptCRS);
        AttributeType cityAT = 
            AttributeTypeFactory.newAttributeType(
            		                  "CITYNAME", String.class, true, 48, null);
        AttributeType popAT = 
            AttributeTypeFactory.newAttributeType(
            		                  "CITYPOP", Integer.class, true, 48, null);
        
        // Create the FeatureType
        AttributeType[] ptATs = new AttributeType[3];
		ptATs[0] = ptGA;
		ptATs[1] = cityAT;
		ptATs[2] = popAT;
		org.geotools.feature.FeatureType ptFT = null;
		try{
			ptFT = FeatureTypes.newFeatureType(ptATs, "Metropolis");
		} catch (SchemaException sex){
			System.out.println("SchemaException on FeatureType creation: "+sex);
		}
        
        // Create the Feature
		Object [] ptElems = { ptG, "London", new Integer(7500000)};
		org.geotools.feature.Feature ptF = null;
		try {
			ptF = ptFT.create(ptElems);
		} catch (IllegalAttributeException iaex){
			System.out.println("IllegalAttributeException on Feature creation: " + iaex);
		}
    	
		
		
		/*
		 * Create the DataStore and get its FeatureSource
		 * 
		 *   see the DataStore Tutorial for more details
		 */ 
		
    	Feature [] ptFetArray = new Feature [] {ptF};
    	MemoryDataStore memds = new MemoryDataStore();
    	memds.addFeatures(ptFetArray);
    	try {
    		memFS = memds.getFeatureSource("Metropolis");
    	} catch (IOException ioex) {
    		System.out.println("IOException on memoryDataStore creation: "+ ioex);
    	}
    }

    
    
    /*
     * Use a Shapefile!
     * 
     * Create a FeatureSource from a Shapefile format file. 
     */
    public static void createFeatureSourceFromShapefile(){
    	
    	/* Switch on the source uncommented in the intial declarations */
    	switch (dataSource){
    		case DATA_FROM_MAPPANE:
    			shpURL = JMapPane.class.getResource(shpName);
    			break;
    		
    		case DATA_FROM_SAMPLEDATA:
	        	try{
	        		shpURL = TestData.url(shpName);
	        	} catch (FileNotFoundException fnfex){
	        		System.out.println("FileNotFoundException on use of TestData.url()"+fnfex);
	        	}
	        	break;
    		
    		
    		case DATA_FROM_INTRODUCTION:
    			shpFile = new File(shpName);
				try {
					shpURL = shpFile.toURL();
				} catch (MalformedURLException muex){
					System.out.println("MalformedUrlException for shapefile name: "+ muex);
				}
				break;
    		
    	}
        
        try {
        	ShapefileDataStore ds = new ShapefileDataStore(shpURL);
        	
  		    try {
  			  shpFS = ds.getFeatureSource();
  		    }
  		    catch (IOException ioex){
  			  System.out.println("IOException on shapefile read: "+ioex);
  		    }
  		  
  	     } catch (MalformedURLException muex){
   		    System.out.println("MalformedUrlException for shpDataStore: "+ muex);
  	     }
    }
    
    
    
    // TODO:
    /*
     * Create a FeatureSource from a web resource.
     */
    public static void createFeatureSourceFromWeb(){
    	
    }

    
    
    
    
    /*
     * Create the styles that will be used for the creation of the MapLayers.
     */
    public static void createStyles(){

        // Make a simple point style, uses a StyleBuilder
    	StyleBuilder builder = new StyleBuilder();
    	Mark mark    = builder.createMark("circle", Color.RED);
    	Graphic g    = builder.createGraphic(null,mark,null);
    	Symbolizer s = builder.createPointSymbolizer(g);
    	memStyl      = builder.createStyle(s);
        

        // Make the sldURL from the sldName
    	/* Switch on the source uncommented in the intial declarations */
    	switch (dataSource){
			case DATA_FROM_MAPPANE:
				sldURL = JMapPane.class.getResource(sldName);
				break;
			
			case DATA_FROM_SAMPLEDATA:
	        	try{
	        		sldURL = TestData.url(sldName);
	        	} catch (FileNotFoundException fnfex){
	        		System.out.println("FileNotFoundException on use of TestData.url()"+fnfex);
	        	}
	        	break;
			
			
			case DATA_FROM_INTRODUCTION:
				sldFile = new File(sldName);
				try {
					sldURL = sldFile.toURL();
				} catch (MalformedURLException muex){
					System.out.println("MalformedUrlException for shapefile name: "+ muex);
				}
				break;
		}
    	
    	
        // Create the shapefile Style, uses StyleFactory and an SLD URL.
        StyleFactory sf = StyleFactoryFinder.createStyleFactory();
        SLDParser stylereader = null;
        try {
        	stylereader = new SLDParser(sf,sldURL);
        } catch (IOException ioex){
        	System.out.println("IOException on SLDfile read: " + ioex);
        }
        org.geotools.styling.Style[] shpStylArr = stylereader.readXML();
        shpStyl = shpStylArr[0];
    }

    
    
    /*
     * Create a GUI map displayer.
     * 
     * This is all Swing stuff for the JMapPane.
     * 
     */
    public static void initGUI(){
        frame=new JFrame("My Map Viewer");
//        frame.setBounds(20,20,500,310);
        frame.setBounds(20,20,1080,600);
        frame.setBackground(Color.cyan);
        
        Container content = frame.getContentPane();
        content.setBackground(Color.magenta);
        content.setLayout(new BorderLayout());
//        content.setLayout(new GridLayout(1,2 ));
        
//        jmpp = new JMapPane();
        jmp = new JMapPane();
        jmp.setBackground(Color.white);
//        jmp.setSize(20,100);
        //jmp.addZoomChangeListener(this);
        content.setLayout(new BorderLayout());
        jtb = new JToolBar();
        Action zoomIn = new ZoomInAction(jmp);
        Action zoomOut = new ZoomOutAction(jmp);
        Action pan = new PanAction(jmp);
        Action select = new SelectAction(jmp);
        Action reset = new ResetAction(jmp);
        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" ); 
            	try{
             	   CoordinateReferenceSystem crs = CRS.decode( code );
             	   jmp.getContext().setAreaOfInterest(jmp.getContext().getAreaOfInterest(),crs);
             	   jmp.setReset(true);
             	   jmp.repaint();    	
                   
                }
                catch(FactoryException fe){
             	   JOptionPane.showMessageDialog( button, fe.getMessage(), fe.getClass().toString(), JOptionPane.ERROR_MESSAGE );
             	   return;
                }
            }
        });
        jtb.add(button);

        content.add(jtb,BorderLayout.NORTH);
        content.add(jmp,BorderLayout.CENTER);
//        content.add(jmp);
         
        content.doLayout();
        frame.setVisible(true);
        
    }
    
    
    /*
     * Display features onto the screen.
     * 
     * This is a very crude example, showing only how do display a map. The 
     * core class, JMapPane, also has a toolbar which is not shown here. See
     * the demo/gui for more details.
     */
    public static void loadGUI()throws Exception{
    	
    	//Setup the context and renderer within the jmappane
        context = new DefaultMapContext(); //WGS84 by default
        renderer = new StreamingRenderer();
        jmp.setRenderer(renderer);
        jmp.setContext(context);
        
        //Add the data directly to the context (which makes the MapLayers)
        context.addLayer(memFS,memStyl);
        context.addLayer(shpFS,shpStyl);
//        context.addLayer(webFS,webStyl);
        
        //Set boundary to all that's visible
        jmp.setMapArea(context.getLayerBounds());
        //Reset boundary to whole world until I get a worldsize shapefile
        worldbounds = new com.vividsolutions.jts.geom.Envelope(-180.0,180.0,-90.0,90.0);
        jmp.setMapArea(worldbounds);
        
        jmp.setHighlightLayer(context.getLayer(0));

//        jmp.setSize(200,600);
        frame.repaint();
        frame.doLayout();
//        Thread.sleep(5000);
//        jmp.setSize(200,600);
//        frame.repaint();
//        frame.doLayout();
        
    }
    /*
     * Make graphical image files, one from scratch and the other from the 
     * jmappane contents.
     *   TODO: add to catalog---great for pre/post transform comparisons
     *   TODO: clean this up, isolate resolution and size
     *   
     */
    public static void makeImages(){
    	
    	/*
    	 * 1. Create an image from scratch
    	 */
    	//Size of the final image, will be too big for the input
    	int w = 1800;
    	int h = 800;
    	BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    	Graphics2D g = image.createGraphics();
    	g.setColor(Color.white);
    	g.fillRect(0, 0, w, h);
    	
    	//TODO: HACK HACK HACK  need a real pixel to world transform
    	AffineTransform trsf = new AffineTransform(new double[]{1.0,1.0,1.0,1.0});

    	//    	DefaultMathTransformFactory dmtf = new DefaultMathTransformFactory();
//    	try{
//    		trsf = dmtf.createAffineTransform(new Matrix2(1,1,1,1));
//    	} catch (Exception e){
//    		;
//    	}
//		transform =
//			renderer.worldToScreenTransform(
//					                        g,
//					                        new Rectangle(0, 0, w, h),
//					                        worldbounds);
		
    	renderer.paint(g, new Rectangle(0, 0, w, h), trsf);
        try{
            ImageIO.write(image, "png", new File("workspace/gtdemo-new-"+imageFileEnd));
        } catch (IOException ioex) {
            System.err.println("IO Exception on image file write: "+ ioex);
        }
        g.dispose();
    	
    	/*
    	 * 2. Create an image from the jmappane contents
    	 */
    	//spit the image out to a file
        int ww = jmp.getWidth()+40;
        int hh = jmp.getHeight()+40;
        BufferedImage imageOut = new BufferedImage(ww, hh, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = imageOut.createGraphics();
    	g2.setColor(Color.gray);
    	g2.fillRect(0, 0, ww, hh);
        jmp.paint(g2);
        try{
            ImageIO.write(imageOut, "png", new File("workspace/gtdemo-jmp-"+imageFileEnd));
        } catch (IOException ioex) {
            System.err.println("IO Exception on image file write: "+ ioex);
        }
        g2.dispose();

    }
    
    /**
     * This is main() the only real function in this QuickStart tutorial. 
     * The class works sequentially through every step
     * @param args
     */
    public static void main(String[] args) throws Exception {
    	
    	System.out.println("QuickStart: Tutorial Start...");
    	
        System.out.println("\tStart: Create FeatureSource from scratch.");
        createFeatureSourceFromScratch();
        System.out.println("\t  End: Created FeatureSource from scratch.");
        
        System.out.println("\tStart: Create FeatureSource from shapefile.");
        createFeatureSourceFromShapefile();
        System.out.println("\t  End: Created FeatureSource from shapefile.");
        
        System.out.println("\tStart: Create FeatureSource from web server.");
        createFeatureSourceFromWeb();
        System.out.println("\t  End: Created FeatureSource from web server.");
        
        System.out.println("\tStart: Create the Styled Layer Descriptors.");
        createStyles();
        System.out.println("\t  End: Created the Styled Layer Descriptors.");
        
        System.out.println("\tStart: Initialize the GUI.");
        initGUI();
        System.out.println("\t  End: Initialized the GUI.");
        System.out.println("\tStart: Load the map.");
        loadGUI();
        System.out.println("\t  End: Loaded the map.");
        
        System.out.println("\tStart: Make an image.");
        makeImages();
        System.out.println("\t  End: Made the image.");
        
        
        
        System.out.println("QuickStart: Tutorial End.");
    }

}
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Geotools-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geotools-devel

Reply via email to