[Schmitzm-commits] r19 - in trunk: dist src/schmitzm/data src/schmitzm/geotools/grid
scm-commit@wald.intevation.org
scm-commit at wald.intevation.org
Mon Mar 2 19:35:19 CET 2009
Author: mojays
Date: 2009-03-02 19:35:18 +0100 (Mon, 02 Mar 2009)
New Revision: 19
Modified:
trunk/dist/schmitzm-src.zip
trunk/dist/schmitzm.jar
trunk/src/schmitzm/data/AbstractReadableGrid.java
trunk/src/schmitzm/geotools/grid/GridUtil.java
Log:
converter methods "Raster2Real" and "Real2Raster" moved to GridUtil
Modified: trunk/dist/schmitzm-src.zip
===================================================================
(Binary files differ)
Modified: trunk/dist/schmitzm.jar
===================================================================
(Binary files differ)
Modified: trunk/src/schmitzm/data/AbstractReadableGrid.java
===================================================================
--- trunk/src/schmitzm/data/AbstractReadableGrid.java 2009-03-02 14:54:11 UTC (rev 18)
+++ trunk/src/schmitzm/data/AbstractReadableGrid.java 2009-03-02 18:35:18 UTC (rev 19)
@@ -13,6 +13,8 @@
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.geotools.referencing.crs.DefaultGeographicCRS;
+
+import schmitzm.geotools.grid.GridUtil;
import appl.data.LoadingException;
/**
@@ -310,18 +312,8 @@
}
/**
- * Konvertiert eine reale Koordinate in eine Zellennummer. Liegt der
- * Koordinatenwert genau auf der Grenze zwischen zwei Rasterzellen, wird
- * die naechst "groessere" Zellegewaehlt.
- * Ausnahme bildet der Rand des Rasters. Hier wird die kleinere Zelle
- * (also die letzte) herangezogen.<br>
- * Diese Methode kann fuer alle Dimensionen (X oder Y oder ...) verwendet
- * werden. Es muessen lediglich die entsprechenden Raster-Informationen fuer
- * die jeweilige Dimension angegeben werden.<br>
- * <b>Bemerkung:</b>
- * Da diese Methode unabhaengig von der Dimension (X,Y-Richtung) arbeitet,
- * nimmt sie an, dass Raster-Ursprung und lat/lon-Referenz in der selben
- * Ecke des Grids liegen.
+ * Konvertiert eine reale Koordinate in eine Zellennummer.
+ * Siehe {@link GridUtil#convertRealToRaster(double, double, double, int, int)}.
* @param coord Georeferenz-Koordinate, die umgerechnet werden soll
* @param realMin Minimale Welt-Koordinate (in der gewuenschten Richtung/Dimension) des
* Grids in dem sich die Zelle befindet
@@ -331,38 +323,14 @@
* Grids in dem sich die Zelle befindet
* @param rasterLength Laenge in Zellen (in der gewuenschten Richtung/Dimension) des
* Grids in dem sich die Zelle befindet
- * @exception UnsupportedOperationException falls als {@code rasterLength} 0
- * uebergeben wird
*/
public static int convertRealToRaster(final double coord, final double realMin, final double realLength, final int rasterMin, final int rasterLength) {
- if ( rasterLength <= 0 )
- throw new UnsupportedOperationException("Length of raster must be > 0!");
- final double cellSize = realLength / rasterLength;
-
- // Wenn Koordinate genau den Rasterrand trifft, wird die letzte
- // Zelle zurueckgegeben...
- if ( coord == realMin + realLength )
- return rasterMin + rasterLength - 1;
- // ... sonst die naechste Zelle
- // Bemerkung: Einfaches Abschneiden (int) reicht nicht, es muss die
- // naechstkleinere Zahl ermittelt werden, denn sonst gibt
- // es die Zelle 0 zweimal, z.B.
- // (coord-realMin)/cellSize = 0.8 --> Zelle 0 (korrekt)
- // (coord-realMin)/cellSize = -0.8 --> Zelle 0 (falsch)
- // Im zweiten Fall muss auf -1 "gerundet" werden!
- return ((int)Math.floor( (coord-realMin) / cellSize ) ) + rasterMin;
+ return GridUtil.convertRealToRaster(coord, realMin, realLength, rasterMin, rasterLength);
}
/**
- * Konvertiert eine Zellennummer in eine reale Koordinate. Dabei wird die
- * Koordinate der Zellenmitte zurueckgegeben.<br>
- * Diese Methode kann fuer alle Dimensionen (X oder Y oder ...) verwendet
- * werden. Es muessen lediglich die entsprechenden Raster-Informationen fuer
- * die jeweilige Dimension angegeben werden.
- * <b>Bemerkung:</b>
- * Da diese Methode unabhaengig von der Dimension (X,Y-Richtung) arbeitet,
- * nimmt sie an, dass Raster-Ursprung und lat/lon-Referenz in der selben
- * Ecke des Grids liegen.
+ * Konvertiert eine Zellennummer in eine reale Koordinate.
+ * Siehe {@link GridUtil#convertRasterToReal(int, int, double, double)}.
* @param cell Rasterzellen-Koordinate, die umgerechnet werden soll
* @param rasterMin Minimale Raster-Koordinate (in der gewuenschten Richtung/Dimension) des
* Grids in dem sich die Zelle befindet
@@ -372,8 +340,9 @@
* Grids in dem sich die Zelle befindet
*/
public static double convertRasterToReal(final int cell, final int rasterMin, final double realMin, final double cellSize) {
- return realMin + (cell-rasterMin)*cellSize + 0.5*cellSize;
+ return GridUtil.convertRasterToReal(cell, rasterMin, realMin, cellSize);
}
+
/**
* Vergleicht zwei Raster auf gleiche Struktur (Hoehe, Breite, Zell-Hoehe,
* Zell-Breite, Sample-Type).
Modified: trunk/src/schmitzm/geotools/grid/GridUtil.java
===================================================================
--- trunk/src/schmitzm/geotools/grid/GridUtil.java 2009-03-02 14:54:11 UTC (rev 18)
+++ trunk/src/schmitzm/geotools/grid/GridUtil.java 2009-03-02 18:35:18 UTC (rev 19)
@@ -52,7 +52,6 @@
import schmitzm.data.WritableGrid;
import schmitzm.data.WritableGridArray;
-import schmitzm.data.AbstractWritableGrid;
import schmitzm.geotools.GTUtil;
import schmitzm.geotools.styling.StylingUtil;
import schmitzm.lang.LangUtil;
@@ -513,10 +512,10 @@
double cellHeight = realHeight / rasterHeight;
// Envelope in Raster-Koordinaten (bzgl. unterer linker Ecke!)
- int subsetLX = AbstractWritableGrid.convertRealToRaster(bboxEnv.getLowerCorner().getOrdinate(0),realMinX,realWidth,rasterMinX,rasterWidth);
- int subsetLY = AbstractWritableGrid.convertRealToRaster(bboxEnv.getLowerCorner().getOrdinate(1),realMinY,realHeight,rasterMinY,rasterHeight);
- int subsetUX = AbstractWritableGrid.convertRealToRaster(bboxEnv.getUpperCorner().getOrdinate(0),realMinX,realWidth,rasterMinX,rasterWidth);
- int subsetUY = AbstractWritableGrid.convertRealToRaster(bboxEnv.getUpperCorner().getOrdinate(1),realMinY,realHeight,rasterMinY,rasterHeight);
+ int subsetLX = convertRealToRaster(bboxEnv.getLowerCorner().getOrdinate(0),realMinX,realWidth,rasterMinX,rasterWidth);
+ int subsetLY = convertRealToRaster(bboxEnv.getLowerCorner().getOrdinate(1),realMinY,realHeight,rasterMinY,rasterHeight);
+ int subsetUX = convertRealToRaster(bboxEnv.getUpperCorner().getOrdinate(0),realMinX,realWidth,rasterMinX,rasterWidth);
+ int subsetUY = convertRealToRaster(bboxEnv.getUpperCorner().getOrdinate(1),realMinY,realHeight,rasterMinY,rasterHeight);
int subsetW = Math.abs(subsetLX-subsetUX)+1;
int subsetH = Math.abs(subsetLY-subsetUY)+1;
// obere linke Ecke des Subsets in Raster-Koordinaten
@@ -531,8 +530,8 @@
// Envelope fuer Subset erzeugen (bzgl. untere liner Ecke!)
Envelope subsetEnv = new Envelope2D(
source.getCoordinateReferenceSystem(),
- AbstractWritableGrid.convertRasterToReal(subsetLX,rasterMinX,realMinX,cellWidth)-cellWidth/2,
- AbstractWritableGrid.convertRasterToReal(subsetLY,rasterMinY,realMinY,cellHeight)-cellHeight/2,
+ convertRasterToReal(subsetLX,rasterMinX,realMinX,cellWidth)-cellWidth/2,
+ convertRasterToReal(subsetLY,rasterMinY,realMinY,cellHeight)-cellHeight/2,
subsetW * cellWidth,
subsetH * cellHeight
);
@@ -567,7 +566,7 @@
public static WritableRaster createWritableRaster(Raster r) {
return createWritableRaster(r,0,0);
}
-
+
/**
* Konvertiert ein Raster-Objekt in eine {@link GridCoverage2D}.
* Es werden folgende Objekt-Typen unterstuetzt:
@@ -615,48 +614,104 @@
/**
- * Wandelt eine Geo-Referenz in Raster-Koordinaten um.
- * @param gc Raster auf dem die Koordinaten definiert sind
- * @param geoX horizontale Geo-Referenz (Longitude)
- * @param geoY vertikale Geo-Referenz (Latitude)
- * @return 2-dimensionalen Array mit dem X-Index in Element 0 und dem Y-Index
- * in Element 1
+ * Converts a real world coordinate to the row/column number of a raster.
+ * If the coordinate value is exactly located on the border between two
+ * cells, the next greater raster cell is returned (except the raster border:
+ * the lower (=last) cell is returned).<br>
+ * This method can be applied on all dimensions (X or Y or ...), if the
+ * accordingly input parameter for the dimension are given.<br>
+ * <b>Note:</b>
+ * Because this method is independed from the dimension, it assumes that the
+ * "beginning" of the raster coordinates is located in the same corner like
+ * the lat/lon-refernce!!
+ * @param coord geographic reference (world coordinate), which is converted
+ * @param realMin minimal world coordinate of the raster
+ * @param realLength length of the raster in "world coordinates"
+ * @param rasterMin index of the first raster cell (normally 0)
+ * @param rasterLength size of the raster (in cells)
+ * @exception UnsupportedOperationException falls als {@code rasterLength} 0
+ * uebergeben wird
*/
+ public static int convertRealToRaster(final double coord, final double realMin, final double realLength, final int rasterMin, final int rasterLength) {
+ if ( rasterLength <= 0 )
+ throw new UnsupportedOperationException("Length of raster must be > 0!");
+ final double cellSize = realLength / rasterLength;
+
+ // Wenn Koordinate genau den Rasterrand trifft, wird die letzte
+ // Zelle zurueckgegeben...
+ if ( coord == realMin + realLength )
+ return rasterMin + rasterLength - 1;
+ // ... sonst die naechste Zelle
+ // Bemerkung: Einfaches Abschneiden (int) reicht nicht, es muss die
+ // naechstkleinere Zahl ermittelt werden, denn sonst gibt
+ // es die Zelle 0 zweimal, z.B.
+ // (coord-realMin)/cellSize = 0.8 --> Zelle 0 (korrekt)
+ // (coord-realMin)/cellSize = -0.8 --> Zelle 0 (falsch)
+ // Im zweiten Fall muss auf -1 "gerundet" werden!
+ return ((int)Math.floor( (coord-realMin) / cellSize ) ) + rasterMin;
+ }
+
+ /**
+ * Converts a raster cell index to "real" world coordinates. The coordinate
+ * of the cell center is returned.<br>
+ * This method can be applied on all dimensions (X or Y or ...), if the
+ * accordingly input parameter for the dimension are given.<br>
+ * <b>Note:</b>
+ * Because this method is independed from the dimension, it assumes that the
+ * "beginning" of the raster coordinates is located in the same corner like
+ * the lat/lon-refernce!!
+ * @param cell raster index, which is converted
+ * @param rasterMin minimal index of the raster
+ * @param realMin minimal world coordinate of the raster
+ * @param cellSize size of one cell in "world coordinates"
+ */
+ public static double convertRasterToReal(final int cell, final int rasterMin, final double realMin, final double cellSize) {
+ return realMin + (cell-rasterMin)*cellSize + 0.5*cellSize;
+ }
+
+ /**
+ * Converts a geo reference to raster coordinates.
+ * @param gc source raster
+ * @param geoX Longitude to be converted
+ * @param geoY Latitude to be converted
+ * @return 2-dimensional array with the X-index in element 0 and the Y-index in
+ * element 1
+ */
public static int[] convertRealToRaster(GridCoverage2D gc, double geoX, double geoY) {
return convertRealToRaster(gc, new double[] { geoX, geoY } );
}
/**
- * Wandelt eine Geo-Referenz in Raster-Koordinaten um.
- * @param env Geo-Referenz des Rasters
- * @param image Gesamt-Auspraegung des Rasters
- * @param geoX horizontale Geo-Referenz (Longitude)
- * @param geoY vertikale Geo-Referenz (Latitude)
- * @return 2-dimensionalen Array mit dem X-Index in Element 0 und dem Y-Index
- * in Element 1
+ * Converts a geo reference to raster coordinates.
+ * @param env geo reference of the raster
+ * @param image image of the raster
+ * @param geoX Longitude to be converted
+ * @param geoY Latitude to be converted
+ * @return 2-dimensional array with the X-index in element 0 and the Y-index in
+ * element 1
*/
public static int[] convertRealToRaster(Envelope2D env, RenderedImage image, double geoX, double geoY) {
return convertRealToRaster(env, image, new double[] { geoX, geoY } );
}
/**
- * Wandelt eine Geo-Referenz in Raster-Koordinaten um.
- * @param gc Raster auf dem die Koordinaten definiert sind
- * @param geoCoord Geo-Referenz (Longitude,Latitude)
- * @return 2-dimensionalen Array mit dem X-Index in Element 0 und dem Y-Index
- * in Element 1
+ * Converts a geo reference to raster coordinates.
+ * @param gc source raster
+ * @param geoCoord geo reference (Longitude,Latitude) to be converted
+ * @return 2-dimensional array with the X-index in element 0 and the Y-index in
+ * element 1
*/
public static int[] convertRealToRaster(GridCoverage2D gc, double[] geoCoord) {
return convertRealToRaster(gc.getEnvelope2D(), gc.getRenderedImage(), geoCoord);
}
/**
- * Wandelt eine Geo-Referenz in Raster-Koordinaten um.
- * @param env Geo-Referenz des Rasters
- * @param image Gesamt-Auspraegung des Rasters
- * @param geoCoord Geo-Referenz (Longitude,Latitude)
- * @return 2-dimensionalen Array mit dem X-Index in Element 0 und dem Y-Index
- * in Element 1
+ * Converts a geo reference to raster coordinates.
+ * @param env geo reference of the raster
+ * @param image image of the raster
+ * @param geoCoord geo reference (Longitude,Latitude) to be converted
+ * @return 2-dimensional array with the X-index in element 0 and the Y-index in
+ * element 1
*/
public static int[] convertRealToRaster(Envelope2D env, RenderedImage image, double[] geoCoord) {
final double realMinX = env.getX();
@@ -668,8 +723,8 @@
final int rasterWidth = image.getWidth();
final int rasterHeight = image.getHeight();
- int cellX = AbstractWritableGrid.convertRealToRaster(geoCoord[0],realMinX,realWidth,rasterMinX,rasterWidth);
- int cellY = AbstractWritableGrid.convertRealToRaster(geoCoord[1],realMinY,realHeight,rasterMinY,rasterHeight);
+ int cellX = convertRealToRaster(geoCoord[0],realMinX,realWidth,rasterMinX,rasterWidth);
+ int cellY = convertRealToRaster(geoCoord[1],realMinY,realHeight,rasterMinY,rasterHeight);
// Ursprung der Raster-Koord. ist OBEN LINKS
cellY = rasterMinY+rasterHeight - cellY - 1;
@@ -678,13 +733,11 @@
/**
- * Liefert die Zellen eines Rasters (in Raster-Koordinaten), die von einem
- * {@link LineString} geschnitten werden.
- * @param gc ein Raster
- * @param ls Linienzug, auf den getestet wird
- * @param result Menge, in die die gefunden Zellen eingefuegt werden
- * (kann {@code null} sein)
- * @return leere Menge, falls der Linienzug ausserhalb des Rasters liegt
+ * Determines the raster cells, which are intersected by a {@link LineString}.
+ * @param gc the raster
+ * @param ls {@link LineString} to check
+ * @param result Set the intersected cells are inserted in (can be {@code null})
+ * @return an empty set if the LineString is located outside the raster
*/
public static Set<Point> getOverlappingCells(GridCoverage2D gc, LineString ls, Set<Point> result) {
if ( result == null )
@@ -707,8 +760,7 @@
Coordinate[] cellBounds = new Coordinate[] { new Coordinate(), new Coordinate(), new Coordinate(), new Coordinate() };
GeometryFactory geomFac = new GeometryFactory();
- // Rasterzellen ermitteln, in denen die Eckpunkte des LineStrings (BB)
- // liegen
+ // determine the cells of the LineStrings start/end point
com.vividsolutions.jts.geom.Envelope lsBB = ls.getEnvelopeInternal();
double bbMinX = Math.max(realMinX, lsBB.getMinX());
double bbMinY = Math.max(realMinY, lsBB.getMinY());
@@ -722,8 +774,8 @@
bbMinY = realMinY + (rasterHeight-(lsMaxCell[1]+1)) * cellHeight;
bbMaxY = realMinY + (rasterHeight-lsMinCell[1]) * cellHeight;
- // Alle Raster-Zellen in BB des LineString pruefen, ob sie sich mit dem dem
- // LineString schneiden
+ // Check all raster cells inside the BB of the LineString, whether they
+ // intersect the LineString
for (double y = bbMinY; y<=bbMaxY; y+=cellHeight)
for (double x = bbMinX; x<=bbMaxX; x+=cellWidth) {
cellBounds[0].x = x;
@@ -744,13 +796,11 @@
}
/**
- * Markiert die Zellen eines Rasters (in Raster-Koordinaten), die von einer
- * {@link Geometry} geschnitten werden.
- * @param gc ein Raster
- * @param g Geometry, auf den getestet wird
- * @param markValue Wert mit dem die Schnitt-Zellen im Ausgabe-Raster markiert werden
- * @param result Raster, in dem die Schnitt-Zellen markiert werden (kann
- * {@code null} sein)
+ * Marks all raster cells, which are intersected by a {@link Geometry}.
+ * @param gc the raster
+ * @param g Geometry, which is checked for intersection
+ * @param markValue value the intersected cells are marked with
+ * @param result Raster, the intersected cells are marked in (can be {@code null})
*/
public static WritableRaster getOverlappingCells(GridCoverage2D gc, Geometry g, Number markValue, WritableRaster result) {
if ( result == null ) {
@@ -780,8 +830,8 @@
double cellHeight = realHeight / rasterHeight;
- // Rasterzellen ermitteln, die in der BoundingBox der Geometrie liegen
- // -> nur diese kommen in Frage!
+ // Determine the raster cells inside the Geometry-BB
+ // -> only these are possibly intersected
com.vividsolutions.jts.geom.Envelope lsBB = g.getEnvelopeInternal();
double bbMinX = Math.max(realMinX, lsBB.getMinX());
double bbMinY = Math.max(realMinY, lsBB.getMinY());
@@ -795,8 +845,8 @@
bbMinY = realMinY + (rasterHeight-(lsMaxCell[1]+1)) * cellHeight;
bbMaxY = realMinY + (rasterHeight-lsMinCell[1]) * cellHeight;
- // Alle Raster-Zellen in BB pruefen, ob sie sich
- // tatsaechlich mit der Geometrie schneiden
+ // Check all raster cells inside the BB of the Geometry, whether they
+ // really intersect the Geometry
Coordinate[] cellBounds = new Coordinate[] { new Coordinate(), new Coordinate(), new Coordinate(), new Coordinate() };
GeometryFactory geomFac = new GeometryFactory();
for (double y = bbMinY; y<=bbMaxY; y+=cellHeight)
@@ -832,11 +882,11 @@
/**
- * Markiert die Zellen eines Rasters (in Raster-Koordinaten), die von einer
- * {@link Geometry} geschnitten werden.
- * @param gc ein Raster
- * @param g Geometry, auf den getestet wird
- * @param markValue Wert mit dem die Schnitt-Zellen im Ausgabe-Raster markiert werden
+ * Marks all raster cells, which are intersected by a {@link Geometry}.
+ * @param gc the raster
+ * @param g Geometry, checked for intersection
+ * @param markValue value the intersected cells are marked with
+ * @return <b>a NEW instance of {@link GridCoverage2D}!!</b>
*/
public static GridCoverage2D getOverlappingCells(GridCoverage2D gc, Geometry g, Number markValue) {
WritableRaster result = getOverlappingCells(gc,g,markValue,null);
More information about the Schmitzm-commits
mailing list