[Schmitzm-commits] r860 - in trunk/src/schmitzm/geotools: . gui

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Fri May 21 17:16:08 CEST 2010


Author: alfonx
Date: 2010-05-21 17:16:06 +0200 (Fri, 21 May 2010)
New Revision: 860

Modified:
   trunk/src/schmitzm/geotools/GTUtil.java
   trunk/src/schmitzm/geotools/gui/GeoMapPane.java
   trunk/src/schmitzm/geotools/gui/ScalePane.java
   trunk/src/schmitzm/geotools/gui/ScalePanel.java
   trunk/src/schmitzm/geotools/gui/XMapPane.java
Log:
Switching the scalebar US/METRIC works

Modified: trunk/src/schmitzm/geotools/GTUtil.java
===================================================================
--- trunk/src/schmitzm/geotools/GTUtil.java	2010-05-21 14:45:15 UTC (rev 859)
+++ trunk/src/schmitzm/geotools/GTUtil.java	2010-05-21 15:16:06 UTC (rev 860)
@@ -85,6 +85,9 @@
 
 	/** Konstante fuer das CRS "WGS84" (erzeugt als "EPSG:4326") */
 	public static CoordinateReferenceSystem WGS84 = null;
+	
+	/** Konstante fuer das CRS "EPSG:3785". Ein welt umspannendens CRS in Metern. http://spatialreference.org/ref/epsg/3785/ */
+	public static CoordinateReferenceSystem WORLD_METER = null;
 
 	private static HashMap<Object, Object> defaultRendererHints;
 
@@ -94,8 +97,16 @@
 			WGS84 = CRS.decode("EPSG:4326", true); // lat/lon (WGS84)
 		} catch (Exception err) {
 			LOGGER
-					.warn("Exception while creating default WGS84 from code 'EPSG:4326'");
+					.warn("Exception while creating default WGS84 from code 'EPSG:4326'",err);
 		}
+
+		try {
+			WORLD_METER = CRS.decode("EPSG:3785", true); 
+		} catch (Exception err) {
+			LOGGER
+					.warn("Exception while creating CRS from code 'EPSG:3785'",err);
+		}
+		
 	}
 
 	/**

Modified: trunk/src/schmitzm/geotools/gui/GeoMapPane.java
===================================================================
--- trunk/src/schmitzm/geotools/gui/GeoMapPane.java	2010-05-21 14:45:15 UTC (rev 859)
+++ trunk/src/schmitzm/geotools/gui/GeoMapPane.java	2010-05-21 15:16:06 UTC (rev 860)
@@ -35,18 +35,29 @@
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Insets;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Point2D;
 import java.util.HashMap;
 
 import javax.measure.quantity.Quantity;
 import javax.measure.unit.Unit;
 
+import org.geotools.geometry.jts.JTS;
+import org.geotools.geometry.jts.ReferencedEnvelope;
 import org.geotools.map.MapContext;
+import org.geotools.referencing.CRS;
 import org.geotools.renderer.lite.StreamingRenderer;
 import org.geotools.renderer.shape.ShapefileRenderer;
 import org.geotools.resources.CRSUtilities;
+import org.opengis.referencing.FactoryException;
+import org.opengis.referencing.NoSuchAuthorityCodeException;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.opengis.referencing.cs.CoordinateSystem;
+import org.opengis.referencing.operation.MathTransform;
 
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.Envelope;
+
 import cern.clhep.Units;
 
 import schmitzm.geotools.GTUtil;
@@ -59,7 +70,8 @@
 /**
  * Das {@code GeoMapPane} erweitert das {@link SelectableXMapPane} um einen
  * Massstab-Balken, sowie ein horizontales und vertikales Koordinaten-Raster
- * (Grid), in dem die Geo-Referenz des angezeigten Karten-Bereichs angezeigt wird. 
+ * (Grid), in dem die Geo-Referenz des angezeigten Karten-Bereichs angezeigt
+ * wird.
  * 
  * @see ScalePane
  * @see GridPanel
@@ -102,11 +114,13 @@
 
 	/** Karten-Bereich des {@code GeoMapPane}. */
 	protected SelectableXMapPane mapPane = null;
-	
-	/** Panel, das den Kartenbereich ({@link #mapPane}) enthaelt.
-	 *  Hierueber lassen sich bestimmte Eigenschaften (z.B. Border) steuern,
-	 *  die aufgrund des optimierten Renderings fuer das {@link XMapPane}
-	 *  nicht direkt gesetzt werden koennen. */
+
+	/**
+	 * Panel, das den Kartenbereich ({@link #mapPane}) enthaelt. Hierueber
+	 * lassen sich bestimmte Eigenschaften (z.B. Border) steuern, die aufgrund
+	 * des optimierten Renderings fuer das {@link XMapPane} nicht direkt gesetzt
+	 * werden koennen.
+	 */
 	protected JPanel mapPanePanel = null;
 	
 	/** Massstab-Balken */
@@ -127,7 +141,7 @@
 	 * use of this {@link GeoMapPane} is undefined.
 	 */
 	private boolean disposed = false;
-	
+
 	/**
 	 * Erzeugt ein neues {@code GeoMapPane}.
 	 */
@@ -153,14 +167,15 @@
 	 * @param renderer
 	 *            Allows you to choose between the {@link StreamingRenderer}
 	 *            which is cool for creating PDF, SVG.. And the much faster
-	 *            {@link ShapefileRenderer}. Defaults to {@link GTUtil#createGTRenderer(MapContext)}
+	 *            {@link ShapefileRenderer}. Defaults to
+	 *            {@link GTUtil#createGTRenderer(MapContext)}
 	 */
-	public GeoMapPane(SelectableXMapPane mapPane, GridPanel vGrid, GridPanel hGrid,
-			ScalePane scalePane) {
+	public GeoMapPane(SelectableXMapPane mapPane, GridPanel vGrid,
+			GridPanel hGrid, ScalePane scalePane) {
 
-	    // Massstab-Balken
+		// Massstab-Balken
 		this.scalePane = scalePane;
-		
+
 		setOpaque(true);
 
 		if (vGrid != null && !vGrid.isVertical())
@@ -177,7 +192,6 @@
 				GridPanel.VERTICAL, this.mapPane));
 		this.setHorGrid((hGrid != null) ? hGrid : new GridPanel(
 				GridPanel.HORIZONTAL, this.mapPane));
-		
 
 		// Standard-Werte fuer GUI-Anordnung setzen
 		layoutConstraints.put(DLC_MAP, new GridBagConstraints(1, 0, 1, 1, 1.0,
@@ -207,7 +221,7 @@
 		this.setLayout(new GridBagLayout());
 
 		// Karten-Darestellung initialisieren
-//        this.mapPane.setBorder(BorderFactory.createLoweredBevelBorder());
+		// this.mapPane.setBorder(BorderFactory.createLoweredBevelBorder());
 		SwingUtil.setPreferredWidth(this.mapPane, 200);
 
 		// MapListener that listens to Scale and MapArea changes
@@ -215,18 +229,45 @@
 			public void performMapPaneEvent(XMapPaneEvent e) {
 				if (e instanceof ScaleChangedEvent) {
 					ScaleChangedEvent sce = (ScaleChangedEvent) e;
+
+					// If ScalePane expects the units in METERS always. In case
+					// the CRS is not in meters, we convert it to EPSG:3785,
+					// which is meter worldwide.
 					
-					Unit<? extends Quantity> METRE = Unit.valueOf("m");
-					Unit<? extends Quantity> DEEGREE = Unit.valueOf("°");
-					CoordinateSystem cs = getMapPane().getMapContext().getCoordinateReferenceSystem().getCoordinateSystem();
-					if (!(CRSUtilities.getUnit(cs).equals(METRE))){
-						System.out.println("map cs is not m");
-						if (CRSUtilities.getUnit(cs).equals(DEEGREE)){
-							System.out.println("map cs is in °");
+					CoordinateReferenceSystem mapCrs = getMapPane()
+							.getMapContext().getCoordinateReferenceSystem();
+					CoordinateSystem cs = mapCrs.getCoordinateSystem();
+					if (!(CRSUtilities.getUnit(cs).toString().equals("m"))) {
+//						System.out.println("map cs is not m");
+
+						try {
+							// mapArea in "crs" of Map
+							ReferencedEnvelope mapArea = getMapPane()
+									.getMapArea();
+
+//							System.out.println("mapArea ° = " + mapArea);
+
+							ReferencedEnvelope transformedMeters = mapArea
+									.transform(GTUtil.WORLD_METER, true);
+
+//							System.out.println("mapArea m = "
+//									+ transformedMeters);
+
+							double spanMeters = transformedMeters.getSpan(0);
+
+							getScalePane().setScale(spanMeters / getWidth());
+							
+//							getScalePane().setVisible(true); // TODO to often?!
+
+						} catch (Exception transEx) {
+//							getScalePane().setVisible(false); 
 						}
+					} else {
+//						System.out.println("map cs is m");
+//						getScalePane().setVisible(true); // TODO to often?!
+						getScalePane().setScale(sce.getNewScale());
 					}
-					
-					getScalePane().setScale(sce.getNewScale());
+
 				}
 				if (e instanceof MapAreaChangedEvent) {
 					getVertGrid().repaint();
@@ -234,17 +275,18 @@
 				}
 			}
 		});
-		
+
 		// MapPane nochmal in ein Panel einfuegen, ueber das z.B.
 		// die Border gesteuert werden kann (aufgrund des optimierten
 		// Renderings des XMapPane koennen einige Eigenschaften nicht
 		// direkt auf dem XMapPane gesetzt werden!)
-        mapPanePanel = new JPanel( new BorderLayout() );
-// Hier nur die "Moeglichkeit" schaffen, Border aber noch nicht setzen!
-// Default: keine Border, aber Grid-Balken; wird z.B. in LayeredMapPane geaendert
-//        mapPanePanel.setBorder( BorderFactory.createLoweredBevelBorder() );
-        setGridBarVisible(false);
-        mapPanePanel.add(mapPane,BorderLayout.CENTER);
+		mapPanePanel = new JPanel(new BorderLayout());
+		// Hier nur die "Moeglichkeit" schaffen, Border aber noch nicht setzen!
+		// Default: keine Border, aber Grid-Balken; wird z.B. in LayeredMapPane
+		// geaendert
+		// mapPanePanel.setBorder( BorderFactory.createLoweredBevelBorder() );
+		setGridBarVisible(false);
+		mapPanePanel.add(mapPane, BorderLayout.CENTER);
 
 		// Komponenten in Layout anordnen
 		this.add(getVertGrid(), layoutConstraints.get(DLC_VGRID));
@@ -255,7 +297,7 @@
 		// aktualisiert wird und die Aenderungen (Area, Scale) im
 		// Update des Massstab-Balken und der der Koordinaten-Leiste
 		// bereits zur Verfuegung stehen!
-        this.add(mapPanePanel, layoutConstraints.get(DLC_MAP));
+		this.add(mapPanePanel, layoutConstraints.get(DLC_MAP));
 	}
 
 	/**
@@ -267,22 +309,23 @@
 		mapPane.refresh();
 	}
 
-  	/**
-  	 * Prueft, ob neben den Koordinaten-Abschnitten die Leiste dargestellt wird.
-  	 */
+	/**
+	 * Prueft, ob neben den Koordinaten-Abschnitten die Leiste dargestellt wird.
+	 */
 	public boolean isGridBarVisible() {
-	  return horGrid != null && horGrid.isGridBarVisible();
+		return horGrid != null && horGrid.isGridBarVisible();
 	}
-	  
-  	/**
-  	 * Bestimmt, ob neben den Koordinaten-Abschnitten die Leiste dargestellt wird.
-  	 */
+
+	/**
+	 * Bestimmt, ob neben den Koordinaten-Abschnitten die Leiste dargestellt
+	 * wird.
+	 */
 	public void setGridBarVisible(boolean visible) {
-	  if (horGrid != null)
-	    horGrid.setGridBarVisible(visible);
-      if (vertGrid != null)
-        vertGrid.setGridBarVisible(visible);
-  	}
+		if (horGrid != null)
+			horGrid.setGridBarVisible(visible);
+		if (vertGrid != null)
+			vertGrid.setGridBarVisible(visible);
+	}
 
 	/**
 	 * Nach dem {@code super}-Aufruf, wird der Massstab neu gesetzt (und somit
@@ -298,22 +341,23 @@
 	}
 
 	/**
-	 * Liefert das {@link SelectableXMapPane}, in dem die Karten dargestellt werden.
+	 * Liefert das {@link SelectableXMapPane}, in dem die Karten dargestellt
+	 * werden.
 	 */
 	public final SelectableXMapPane getMapPane() {
 		return mapPane;
 	}
 
-    /**
-     * Liefert das {@link JPanel}, in dem der Kartenbereich gekapselt ist.
-     * Hierbei handelt es sich nicht direkt um das {@link XMapPane}, sondern
-     * um ein neues Panel, was wiederum das {@link XMapPane} enthaelt!
-     */
-    public final JPanel getMapPanePanel() {
-        return mapPanePanel;
-    }
+	/**
+	 * Liefert das {@link JPanel}, in dem der Kartenbereich gekapselt ist.
+	 * Hierbei handelt es sich nicht direkt um das {@link XMapPane}, sondern um
+	 * ein neues Panel, was wiederum das {@link XMapPane} enthaelt!
+	 */
+	public final JPanel getMapPanePanel() {
+		return mapPanePanel;
+	}
 
-    /**
+	/**
 	 * Liefert den {@link MapContext} der die einzelnen Karten-Layer verwaltet.
 	 */
 	public final MapContext getMapContext() {
@@ -349,18 +393,18 @@
 	 *         Kr&uuml;ger</a>
 	 */
 	public void dispose() {
-		
+
 		if (isDisposed())
 			return;
-		scalePane=null;
-		horGrid=null;
-		vertGrid=null;
+		scalePane = null;
+		horGrid = null;
+		vertGrid = null;
 		// Mach MapPane.dispose schon= getMapContext().clearLayerList();
 		mapPane.dispose();
 		removeAll();
 		disposed = true;
 	}
-	
+
 	/**
 	 * Nuetzlich wenn die Componente gedruckt (z.B. wenn ein Screenshot gemacht
 	 * wird) wird. Dann werden wird der Hintergrund auf WEISS gesetzt.
@@ -407,5 +451,4 @@
 		return scalePane;
 	}
 
-
 }

Modified: trunk/src/schmitzm/geotools/gui/ScalePane.java
===================================================================
--- trunk/src/schmitzm/geotools/gui/ScalePane.java	2010-05-21 14:45:15 UTC (rev 859)
+++ trunk/src/schmitzm/geotools/gui/ScalePane.java	2010-05-21 15:16:06 UTC (rev 860)
@@ -133,6 +133,7 @@
 	 * @exception Ill
 	 */
 	public void setScale(long pixels) {
+		
 		getScalePanel().setScale(pixels);
 
 		// TODO i8n

Modified: trunk/src/schmitzm/geotools/gui/ScalePanel.java
===================================================================
--- trunk/src/schmitzm/geotools/gui/ScalePanel.java	2010-05-21 14:45:15 UTC (rev 859)
+++ trunk/src/schmitzm/geotools/gui/ScalePanel.java	2010-05-21 15:16:06 UTC (rev 860)
@@ -30,6 +30,7 @@
 package schmitzm.geotools.gui;
 
 import java.awt.Color;
+import java.awt.Font;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.awt.RenderingHints;
@@ -170,8 +171,9 @@
    * @exception Ill
    */
   public void setScale(final long pixels) {
-    if ( pixels <= 0 )
-      throw new IllegalArgumentException("Count of pixels must be greater zero!");
+    if ( pixels == 0 ){
+    	throw new IllegalArgumentException("Count of pixels must be greater zero!");
+    }
     setScale(1.0/pixels);
   }
 
@@ -225,12 +227,16 @@
     g2.setColor(Color.BLACK);
     g2.drawRect(0, 0, tileScaleWidth*tileScaleCount, tileScaleHeight);
     // Laengen-Angabe
-    g2.setFont( new JLabel().getFont() );
     
+	g2.setFont( font1 );
+    
     final String scaleString = convertScaleToLabelUnit(scaleW_unit,dispUnit,units);
     g2.drawString(scaleString,scaleW_pixel+3,tileScaleHeight);
   }
   
+  /** Font used for painting the "100km" or "1000ft" label **/
+  final static Font font1 = new JLabel().getFont().deriveFont(Font.PLAIN).deriveFont(new JLabel().getFont().getSize2D() - 1f);
+  
   /**
    * Returns a formated string containing the given distance value (meters or miles)
    * in a "nice" and displayable format.

Modified: trunk/src/schmitzm/geotools/gui/XMapPane.java
===================================================================
--- trunk/src/schmitzm/geotools/gui/XMapPane.java	2010-05-21 14:45:15 UTC (rev 859)
+++ trunk/src/schmitzm/geotools/gui/XMapPane.java	2010-05-21 15:16:06 UTC (rev 860)
@@ -573,28 +573,9 @@
 	 * thread.
 	 */
 	final private Timer startRenderThreadsTimer;
-	//
-	// /**
-	// * The default state is ZOOM_IN, hence by default the
-	// * {@link #xMapPaneMouseListener} is also enabled.
-	// **/
-	// private int state = ZOOM_IN;
-	//
-	// /**
-	// * Manuell gesetzter statischer Cursor, unabhaengig von der aktuellen
-	// * MapPane-Funktion
-	// */
-	// protected Cursor staticCursor = null;
 
 	private AffineTransform worldToScreen;
 
-	// /**
-	// * This {@link MouseListener} is managing all zoom related tasks
-	// */
-	// private final ZoomXMapPaneMouseListener zoomMapPaneMouseListener = new
-	// ZoomXMapPaneMouseListener(
-	// this);
-
 	/**
 	 * This {@link MouseListener} is managing all zoom related tasks
 	 */
@@ -1412,22 +1393,6 @@
 		return new AffineTransform(screenToWorld);
 	}
 
-	// public int getState() {
-	// return state;
-	// }
-	//
-	// /**
-	// * Liefert den statisch eingestellten Cursor, der unabhaengig von der
-	// * eingestellten MapPane-Aktion (Zoom, Auswahl, ...) verwendet wird.
-	// *
-	// * @return {@code null}, wenn kein statischer Cursor verwendet, sondern
-	// der
-	// * Cursor automatisch je nach MapPane-Aktion eingestellt wird.
-	// */
-	// public Cursor getStaticCursor() {
-	// return this.staticCursor;
-	// }
-
 	public AffineTransform getWorldToScreenTransform() {
 		if (worldToScreen == null) {
 			resetTransforms();



More information about the Schmitzm-commits mailing list