[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