Revision 531 2.1/trunk/org.gvsig.view3d/org.gvsig.view3d.swing/org.gvsig.view3d.swing.impl/src/main/java/org/gvsig/view3d/swing/impl/data/GvSIGLayerDataRaster.java

View differences:

GvSIGLayerDataRaster.java
37 37
import java.awt.Rectangle;
38 38
import java.awt.geom.AffineTransform;
39 39
import java.awt.geom.Point2D;
40
import java.awt.geom.Rectangle2D;
40 41
import java.awt.image.BufferedImage;
41 42

  
42 43
import org.cresques.cts.ICoordTrans;
43 44
import org.cresques.cts.IProjection;
44 45
import org.gvsig.fmap.crs.CRSFactory;
45 46
import org.gvsig.fmap.dal.coverage.RasterLocator;
47
import org.gvsig.fmap.dal.coverage.RasterManager;
46 48
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
49
import org.gvsig.fmap.dal.coverage.datastruct.DataStructFactory;
50
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
47 51
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
48 52
import org.gvsig.fmap.dal.coverage.exception.QueryException;
53
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
49 54
import org.gvsig.fmap.dal.coverage.store.RasterQuery;
50 55
import org.gvsig.fmap.dal.exception.ReadException;
51 56
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
......
80 85

  
81 86
    private MapControl3D mapControl3D;
82 87
    private FLayer layer;
88
    
89
    private Extent canvasExtent;
90
    private Extent overlapExtent;
83 91

  
84 92
    /**
85 93
     * Default constructor of <code>GvSIGLayerDataRaster</code>
......
145 153
            || !canvas.getSector().intersects(getSector())) {
146 154
            return;
147 155
        }
148

  
149
        FLyrRaster rasterLayer = (FLyrRaster) this.layer;
150

  
151
        Sector overlap = this.getSector().intersection(canvas.getSector());
152

  
153
        java.awt.Rectangle clipRect = this.computeClipRect(overlap, this);
154
        if (null == clipRect || clipRect.width == 0 || clipRect.height == 0) {
155
            return;
156
        }
157

  
158
        LOG.debug("Request zone: x = {} y= {} width = {} height = {}",
159
            new Object[] { clipRect.x, clipRect.y, clipRect.width,
160
                clipRect.height });
161

  
156
        
157
        Extent canvasExtent = getExtent(canvas.getSector());
158
        
159
        // Create query. Configure to get the zone request by canvas scaled to
160
        // tile size. 
162 161
        RasterQuery query = RasterLocator.getManager().createQuery();
163
        query.setSupersamplingOption(true);
162
        query.setSupersamplingOption(false);
164 163
        query.setDrawableBands(new int[] { 0 });
165 164
        query.setReadOnly(true);
166
        query.setAreaOfInterest(clipRect);
165
        query.storeLastBuffer(true);
166
        query.setAreaOfInterest(canvasExtent, canvas.getWidth(),
167
            canvas.getHeight());
167 168
        
168
        Buffer buffer = null;
169
        Buffer adjustedBuffer = null;
170
        FLyrRaster rasterLayer = (FLyrRaster) this.layer;
171
        RasterDataStore dataStore = rasterLayer.getDataStore();
172
        
169 173
        try {
170
            buffer = rasterLayer.getDataStore().query(query);
174
            // For best performance, checks if canvas extent is the same than
175
            // last request. If it is the same, it will get last buffer
176
            // stored. Otherwise, it will do created query. 
177
            if (canvasExtent.equals(this.canvasExtent)
178
                && dataStore.getLastBuffer() != null) {
179
                adjustedBuffer = dataStore.getLastBuffer();
180
            } else {
181
                adjustedBuffer = dataStore.query(query);
182
            }
171 183
        } catch (ProcessInterruptedException e) {
172 184
            LOG.error("Process interrupted while {} was executing a query",
173
                rasterLayer.getDataStore().getName(), e);
185
                dataStore.getName(), e);
174 186
            return;
175 187
        } catch (QueryException e) {
176 188
            LOG.error("Query exception, can apply {} to {}", new Object[] {
177
                query.toString(), rasterLayer.getDataStore().getName() }, e);
189
                query.toString(), dataStore.getName() }, e);
178 190
            return;
179 191
        }
192

  
193
        // For performance reasons, stores canvas extent to avoid calculate it
194
        // in each iteration
195
        setCanvasEnxent(canvas.getSector());
196
        Sector overlap = this.getSector().intersection(canvas.getSector());
197
        setOverlapExtent(overlap);
180 198
        
181
        ByteBufferRaster byteBuferRaster =
182
            new ByteBufferRaster(buffer.getWidth(), buffer.getHeight(),
183
                overlap, this.copy());
184
        
185
        // Create buffer depending on data type
186
        String dataType = (String) this.getValue(AVKey.DATA_TYPE);
187
        try{
188
            for (int i = 0; i < buffer.getHeight(); i++) {
189
                if (AVKey.INT8.equals(dataType)) {
190
                    byte[] byteValues = buffer.getLineFromBandByte(i, 0);
191
                    setLineByteToDataRaster(byteBuferRaster, i, byteValues);
192
                } else if (AVKey.INT16.equals(dataType)) {
193
                    short[] shortValues = buffer.getLineFromBandShort(i, 0);
194
                    setLineShortToDataRaster(byteBuferRaster, i, shortValues);
195
                } else if (AVKey.INT32.equals(dataType)) {
196
                    int[] intValues = buffer.getLineFromBandInt(i, 0);
197
                    setLineIntToDataRaster(byteBuferRaster, i, intValues);
198
                } else if (AVKey.FLOAT32.equals(dataType)) {
199
                    float[] floatValues = buffer.getLineFromBandFloat(i, 0);
200
                    setLineFloatToDataRaster(byteBuferRaster, i, floatValues);
201
                } else if (AVKey.FLOAT64.equals(dataType)) {
202
                    double[] doubleValues = buffer.getLineFromBandDouble(i, 0);
203
                    setLineDoubleToDataRaster(byteBuferRaster, i, doubleValues);
199
        String dataType = this.getStringValue(AVKey.DATA_TYPE);
200

  
201
        for (int y = 0; y < canvas.getHeight(); y++) {
202
            for (int x = 0; x < canvas.getWidth(); x++) {
203

  
204
                Point2D rasterPoint =
205
                    getRasterPoint(x, y, canvas, adjustedBuffer);
206
                
207
                // If raster point is not null, get value of buffer and write it
208
                // to canvas
209
                if (rasterPoint != null) {
210
                    if (AVKey.INT8.equals(dataType)) {
211

  
212
                        byte byteValue =
213
                            adjustedBuffer.getElemByte(
214
                                (int) rasterPoint.getY(),
215
                                (int) rasterPoint.getX(), 0);
216

  
217
                        setNumberToDataRaster((ByteBufferRaster) canvas, y, x,
218
                            byteValue);
219

  
220
                    } else if (AVKey.INT16.equals(dataType)) {
221
                        
222
                        short shortValue =
223
                            adjustedBuffer.getElemShort(
224
                                (int) rasterPoint.getY(),
225
                                (int) rasterPoint.getX(), 0);
226
                        
227
                        setNumberToDataRaster((ByteBufferRaster) canvas, y, x,
228
                            shortValue);
229
                        
230
                    } else if (AVKey.INT32.equals(dataType)) {
231
                        
232
                        int intValue =
233
                            adjustedBuffer.getElemInt((int) rasterPoint.getY(),
234
                                (int) rasterPoint.getX(), 0);
235
                        
236
                        setNumberToDataRaster((ByteBufferRaster) canvas, y, x,
237
                            intValue);
238
                        
239
                    } else if (AVKey.FLOAT32.equals(dataType)) {
240
                        
241
                        float floatValue =
242
                            adjustedBuffer.getElemFloat(
243
                                (int) rasterPoint.getY(),
244
                                (int) rasterPoint.getX(), 0);
245
                        
246
                        setNumberToDataRaster((ByteBufferRaster) canvas, y, x,
247
                            floatValue);
248
                        
249
                    } else if (AVKey.FLOAT64.equals(dataType)) {
250
                        
251
                        double doubleValue =
252
                            adjustedBuffer.getElemDouble(
253
                                (int) rasterPoint.getY(),
254
                                (int) rasterPoint.getX(), 0);
255
                        
256
                        setNumberToDataRaster((ByteBufferRaster) canvas, y, x,
257
                            doubleValue);
258
                    }
259
                } else {
260
                    // Invalid point, write NoData value
261
                    Number noData =
262
                        (Number) this.getValue(AVKey.MISSING_DATA_SIGNAL);
263
                    if (AVKey.INT8.equals(dataType)) {
264
                        setNumberToDataRaster((ByteBufferRaster) canvas, y, x,
265
                            noData.byteValue());
266
                    } else if (AVKey.INT16.equals(dataType)) {
267
                        setNumberToDataRaster((ByteBufferRaster) canvas, y, x,
268
                            noData.shortValue());
269
                    } else if (AVKey.INT32.equals(dataType)) {
270
                        setNumberToDataRaster((ByteBufferRaster) canvas, y, x,
271
                            noData.intValue());
272
                    } else if (AVKey.FLOAT32.equals(dataType)) {
273
                        setNumberToDataRaster((ByteBufferRaster) canvas, y, x,
274
                            noData.floatValue());
275
                    } else if (AVKey.FLOAT64.equals(dataType)) {
276
                        setNumberToDataRaster((ByteBufferRaster) canvas, y, x,
277
                            noData.doubleValue());
278
                    }
204 279
                }
205 280
            }
206
            byteBuferRaster.drawOnTo(canvas);
207
        } catch(Exception e){
208
            LOG.warn("Can't get elavation value matix", e);
209
            return;
210
        } finally {
211
            if(buffer != null){
212
                buffer.dispose();
213
            }
214 281
        }
215 282
    }
216 283

  
217
    private void setLineByteToDataRaster(ByteBufferRaster byteBuferRaster, int i,
218
        byte[] byteValues) {
219
        for (int j = 0; j < byteValues.length; j++) {
220
            Number value = byteValues[j];
221
            byteBuferRaster.setDoubleAtPosition(i, j, value.doubleValue());
284
    private Point2D getRasterPoint(int x, int y, DataRaster canvas,
285
        Buffer adjustedBuffer) {
286
        
287
        // Gets coordiantes of pixel raster
288
        Point2D worldPoint =
289
            canvasExtent.rasterToWorld(new Point2D.Double(x, y),
290
                getCellSize(canvas.getSector(), canvas.getWidth()));
291

  
292
        if (layer instanceof FLyrRaster) {
293
            // Gets pixel of adjusted buffer 
294
            Sector overlap = this.getSector().intersection(canvas.getSector());
295
            Point2D rasterPoint =
296
                overlapExtent.worldToRaster(worldPoint,
297
                    getCellSize(overlap, adjustedBuffer.getWidth()));
298

  
299
            if (isPointOfBuffer(rasterPoint, adjustedBuffer)) {
300
                return rasterPoint;
301
            }
222 302
        }
303
        return null;
223 304
    }
224 305

  
225
    private void setLineShortToDataRaster(ByteBufferRaster byteBuferRaster,
226
        int i, short[] shortValues) {
227
        for (int j = 0; j < shortValues.length; j++) {
228
            Number value = shortValues[j];
229
            byteBuferRaster.setDoubleAtPosition(i, j, value.doubleValue());
230
        }
306
    private void setCanvasEnxent(Sector canvasSector) {
307
        this.canvasExtent = getExtent(canvasSector);
231 308
    }
309
    
310
    private void setOverlapExtent(Sector overlap) {
311
        this.overlapExtent = getExtent(overlap);
312
    }
313
    
314
    private Extent getExtent(Sector sector){
315
        Rectangle2D rectangleDegrees = sector.toRectangleDegrees();
316
        RasterManager rasterManager = RasterLocator.getManager();
317
        DataStructFactory dataStructFactory =
318
            rasterManager.getDataStructFactory();
319
        return dataStructFactory.createExtent(rectangleDegrees);
320
    }
232 321

  
233
    private void setLineIntToDataRaster(ByteBufferRaster byteBuferRaster,
234
        int i, int[] intValues) {
235
        for (int j = 0; j < intValues.length; j++) {
236
            Number value = intValues[j];
237
            byteBuferRaster.setDoubleAtPosition(i, j, value.doubleValue());
238
        }
322
    private double getCellSize(Sector sector, int width) {
323

  
324
        Rectangle2D rectangleDegrees = sector.toRectangleDegrees();
325

  
326
        return rectangleDegrees.getWidth() / width;
239 327
    }
240 328

  
241
    private void setLineFloatToDataRaster(ByteBufferRaster byteBuferRaster,
242
        int i, float[] floatValues) {
243
        for (int j = 0; j < floatValues.length; j++) {
244
            Number value = floatValues[j];
245
            byteBuferRaster.setDoubleAtPosition(i, j, value.doubleValue());
329
    private boolean isPointOfBuffer(Point2D rasterPoint, Buffer buffer) {
330
        if (layer instanceof FLyrRaster) {
331
            double x = rasterPoint.getX();
332
            double y = rasterPoint.getY();
333
            return x > -1 && y > -1 && x < buffer.getWidth()
334
                && y < buffer.getHeight() ? true : false;
246 335
        }
336
        return false;
247 337
    }
248 338

  
249
    private void setLineDoubleToDataRaster(ByteBufferRaster byteBuferRaster,
250
        int i, double[] doubleValues) {
251
        for (int j = 0; j < doubleValues.length; j++) {
252
            Number value = doubleValues[j];
253
            byteBuferRaster.setDoubleAtPosition(i, j, value.doubleValue());
254
        }
339
    private void setNumberToDataRaster(ByteBufferRaster byteBuferRaster,
340
        int line, int col, Number value) {
341
        byteBuferRaster.setDoubleAtPosition(line, col, value.doubleValue());
255 342
    }
256

  
343
    
257 344
    private void drawVectElevationOnTo(DataRaster canvas) {
258 345
        // TODO Auto-generated method stub
259 346

  

Also available in: Unified diff