[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ü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