diff geo-backend/src/main/java/de/intevation/gnv/geobackend/sde/datasources/ArcSDEStatement.java @ 544:33f93898cbbf

Added RasterObject for caching the Rastertiles to get a better performance geo-backend/trunk@508 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Tim Englich <tim.englich@intevation.de>
date Tue, 05 Jan 2010 14:09:53 +0000
parents fac02bf1c685
children 210716612c30
line wrap: on
line diff
--- a/geo-backend/src/main/java/de/intevation/gnv/geobackend/sde/datasources/ArcSDEStatement.java	Mon Jan 04 15:22:09 2010 +0000
+++ b/geo-backend/src/main/java/de/intevation/gnv/geobackend/sde/datasources/ArcSDEStatement.java	Tue Jan 05 14:09:53 2010 +0000
@@ -8,8 +8,6 @@
 import java.sql.SQLException;
 import java.sql.SQLWarning;
 import java.sql.Statement;
-import java.util.HashMap;
-import java.util.Vector;
 
 import org.apache.log4j.Logger;
 
@@ -20,19 +18,19 @@
 import com.esri.sde.sdk.client.SeExtent;
 import com.esri.sde.sdk.client.SeFilter;
 import com.esri.sde.sdk.client.SeLayer;
-import com.esri.sde.sdk.client.SeObjectId;
 import com.esri.sde.sdk.client.SeQuery;
 import com.esri.sde.sdk.client.SeQueryInfo;
 import com.esri.sde.sdk.client.SeRaster;
 import com.esri.sde.sdk.client.SeRasterAttr;
 import com.esri.sde.sdk.client.SeRasterBand;
-import com.esri.sde.sdk.client.SeRasterColumn;
 import com.esri.sde.sdk.client.SeRasterConstraint;
 import com.esri.sde.sdk.client.SeRasterTile;
 import com.esri.sde.sdk.client.SeRow;
 import com.esri.sde.sdk.client.SeShape;
 import com.esri.sde.sdk.client.SeShapeFilter;
 import com.esri.sde.sdk.client.SeSqlConstruct;
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.Envelope;
 import com.vividsolutions.jts.geom.Geometry;
 import com.vividsolutions.jts.geom.Point;
 import com.vividsolutions.jts.geom.Polygon;
@@ -50,10 +48,6 @@
      */
     private static Logger log = Logger.getLogger(ArcSDEStatement.class);
     
-    private static HashMap<String, double[]> tiles = new HashMap<String, double[]>();
-    
-    private static SeRasterBand rasterBand = null;
-    
 	private ArcSDEConnection connection = null;
 	
 	/**
@@ -514,14 +508,14 @@
         }else{
             try {
                
-                if (rasterBand == null){
-                    pSeQuery.execute();
-                    row = pSeQuery.fetch();
-                    SeRasterAttr attr = row.getRaster(0);
-                    SeRaster raster = attr.getRasterInfo();
-                    SeRasterBand[] bands = raster.getBands();
-                    rasterBand = bands[0];
-                }
+                int rasterSize = 128;
+                pSeQuery.execute();
+                row = pSeQuery.fetch();
+                SeRasterAttr attr = row.getRaster(0);
+                SeRaster raster = attr.getRasterInfo();
+                SeRasterBand[] bands = raster.getBands();
+                SeRasterBand rasterBand = bands[0];
+                
                 
                 int height = rasterBand.getBandHeight();
                 int width = rasterBand.getBandWidth();
@@ -553,48 +547,44 @@
                 log.debug("Maxlevel: "+maxLevel);
                 
                 if (isPointInRaster){
-                    int columnIndex = pixelX / 128;
-                    int rowIndex = pixelY / 128;
-                    String tileKey = columnIndex + "/"+ rowIndex;
+                                        
+                    if (row == null){
+                        pSeQuery.execute();
+                        row = pSeQuery.fetch();
+                    }
+                    SeRasterConstraint constraint = new SeRasterConstraint();
+                    constraint.setLevel(maxLevel);
+                    constraint.setBands(bandNumber);
+                    constraint.setEnvelope(pixelX / rasterSize, pixelY / rasterSize, pixelX / rasterSize, pixelY / rasterSize);
+                    pSeQuery.queryRasterTile(constraint);
+                    SeRasterTile tile = row.getRasterTile();
                     
-                    double[] tileValues = tiles.get(tileKey);
-                    if (tileValues == null){
-                        if (row == null){
-                            pSeQuery.execute();
-                            row = pSeQuery.fetch();
-                        }
-                        SeRasterConstraint constraint = new SeRasterConstraint();
-                        constraint.setLevel(maxLevel);
-                        constraint.setBands(bandNumber);
-                        constraint.setEnvelope(pixelX / 128, pixelY / 128, pixelX / 128, pixelY / 128);
-                        pSeQuery.queryRasterTile(constraint);
-                        SeRasterTile tile = row.getRasterTile();
-                     
-                        if(tile != null){
-                            log.debug("BAND-ID Tile "+tile.getBandId().longValue());
-                            log.debug("Pixel "+ tile.getNumPixels());
-                            log.debug("Column / Row "+tile.getColumnIndex()+" / "+tile.getRowIndex());
-                            int localPixelX = pixelX - (tile.getColumnIndex()*128);
-                            int localPixelY = pixelY - (tile.getRowIndex()*128);
-                            int pos = localPixelY*128 +localPixelX;
-                            if (pos < tile.getNumPixels()){
-                                tileValues = new double[tile.getNumPixels()];
-                                tileValues = tile.getPixels(tileValues);
-                                this.tiles.put(tileKey, tileValues);
-                                
-                            }
-                         }
-                    }else{
-                        log.debug("Tile kommt aus dem Cache.");
-                    }
+                    if(tile != null){
+                        log.debug("BAND-ID Tile "+tile.getBandId().longValue());
+                        log.debug("Pixel "+ tile.getNumPixels());
+                        log.debug("Column / Row "+tile.getColumnIndex()+" / "+tile.getRowIndex());
+                        
+                        
+                        double[] tileValues = new double[tile.getNumPixels()];
+                        tileValues = tile.getPixels(tileValues);
+                        lSet.addCol(new ColDefinition("tile",ColDefinition.FLOAT64));
+                        Row lBackingRow = new Row(1);
+                        Envelope envelope = new Envelope(
+                                            new Coordinate(extent.getMinX(), 
+                                                           extent.getMinY()), 
+                                            new Coordinate(extent.getMaxX(), 
+                                                           extent.getMaxY()));
+                        RasterObject ro = new RasterObject(envelope, 
+                                                           tileValues, 
+                                                           rasterSize, 
+                                                           tile.getRowIndex(), 
+                                                           tile.getColumnIndex(),
+                                                           width,
+                                                           height);
+                        lBackingRow.addObject(ro,0);
+                        lSet.addRow(lBackingRow);
+                     }
                     
-                    int localPixelX = pixelX - (columnIndex*128);
-                    int localPixelY = pixelY - (rowIndex*128);
-                    int pos = localPixelY*128 +localPixelX;
-                    lSet.addCol(new ColDefinition("height",ColDefinition.FLOAT64));
-                    Row lBackingRow = new Row(1);
-                    lBackingRow.addObject(tileValues[pos], 0);
-                    lSet.addRow(lBackingRow);
                 }else{
                     log.debug("The Query doesn't deliver any Information because the Point is located outside the Raster.");
                 }

http://dive4elements.wald.intevation.org