Statistics
| Revision:

gvsig-3d / 2.1 / branches / org.gvsig.view3d_vector_and_extrusion_2.3 / org.gvsig.view3d / org.gvsig.view3d / org.gvsig.view3d.swing / org.gvsig.view3d.swing.impl / src / main / java / org / gvsig / view3d / swing / impl / data / GvSIGLayerDataRaster.java @ 735

History | View | Annotate | Download (22.3 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright � 2007-2015 gvSIG Association
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24

    
25
package org.gvsig.view3d.swing.impl.data;
26

    
27
import gov.nasa.worldwind.WWObjectImpl;
28
import gov.nasa.worldwind.avlist.AVKey;
29
import gov.nasa.worldwind.avlist.AVList;
30
import gov.nasa.worldwind.data.BufferedImageRaster;
31
import gov.nasa.worldwind.data.ByteBufferRaster;
32
import gov.nasa.worldwind.data.DataRaster;
33
import gov.nasa.worldwind.geom.Sector;
34

    
35
import java.awt.Dimension;
36
import java.awt.Graphics2D;
37
import java.awt.Rectangle;
38
import java.awt.geom.AffineTransform;
39
import java.awt.geom.Point2D;
40
import java.awt.geom.Rectangle2D;
41
import java.awt.image.BufferedImage;
42

    
43
import org.cresques.cts.ICoordTrans;
44
import org.cresques.cts.IProjection;
45
import org.gvsig.fmap.crs.CRSFactory;
46
import org.gvsig.fmap.dal.coverage.RasterLocator;
47
import org.gvsig.fmap.dal.coverage.RasterManager;
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;
51
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
52
import org.gvsig.fmap.dal.coverage.exception.QueryException;
53
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
54
import org.gvsig.fmap.dal.coverage.store.RasterQuery;
55
import org.gvsig.fmap.dal.exception.ReadException;
56
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
57
import org.gvsig.fmap.geom.GeometryLocator;
58
import org.gvsig.fmap.geom.GeometryManager;
59
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
60
import org.gvsig.fmap.geom.primitive.Envelope;
61
import org.gvsig.fmap.mapcontext.MapContext;
62
import org.gvsig.fmap.mapcontext.ViewPort;
63
import org.gvsig.fmap.mapcontext.layers.FLayer;
64
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
65
import org.gvsig.fmap.mapcontext.rendering.legend.styling.ILabelable;
66
import org.gvsig.raster.fmap.layers.FLyrRaster;
67
import org.gvsig.view3d.lib.api.View3DLocator;
68
import org.gvsig.view3d.lib.api.View3DManager;
69
import org.gvsig.view3d.lib.api.properties.ElevationLayerProperties3D;
70
import org.gvsig.view3d.lib.api.properties.LayerProperties3D;
71
import org.gvsig.view3d.swing.api.MapControl3D;
72
import org.slf4j.Logger;
73
import org.slf4j.LoggerFactory;
74

    
75
/**
76
 * Default implementation of {@link DataRaster}.
77
 *
78
 * @author <a href="mailto:lmarques@disid.com">Lluis Marques</a>
79
 *
80
 */
81
@SuppressWarnings("deprecation")
82
public class GvSIGLayerDataRaster extends WWObjectImpl implements DataRaster {
83

    
84
    private static final Logger LOG =
85
        LoggerFactory.getLogger(GvSIGLayerDataRaster.class);
86

    
87
    private MapControl3D mapControl3D;
88
    private FLayer layer;
89

    
90
    private Extent canvasExtent;
91
    private Extent overlapExtent;
92

    
93
    /**
94
     * Default constructor of <code>GvSIGLayerDataRaster</code>
95
     *
96
     * @param mapControl3D
97
     *            context where {@link FLayer} is loaded.
98
     * @param theLayer
99
     *            source to get raster information
100
     * @param params
101
     *            parameters of <code>GvSIGLayerDataRaster</code>
102
     */
103
    public GvSIGLayerDataRaster(MapControl3D mapControl3D, FLayer theLayer,
104
        AVList params) {
105

    
106
        if (params == null || mapControl3D == null || theLayer == null) {
107
            throw new IllegalArgumentException();
108
        }
109

    
110
        this.layer = theLayer;
111
        this.mapControl3D = mapControl3D;
112
        this.setValues(params.copy());
113
    }
114

    
115
    public void dispose() {
116
    }
117

    
118
    public int getWidth() {
119
        return (Integer) this.getValue(AVKey.WIDTH);
120
    }
121

    
122
    public int getHeight() {
123
        return (Integer) this.getValue(AVKey.HEIGHT);
124
    }
125

    
126
    public Sector getSector() {
127

    
128
        return (Sector) this.getValue(AVKey.SECTOR);
129

    
130
    }
131

    
132
    public void drawOnTo(DataRaster canvas) {
133
        View3DManager manager = View3DLocator.getManager();
134
        LayerProperties3D properties = manager.getLayerProperties(layer, null);
135

    
136
        if (properties instanceof ElevationLayerProperties3D) {
137
            if (this.layer instanceof FLyrRaster) {
138
                this.drawRasterElevationOnTo(canvas);
139
            } else if (this.layer instanceof FLyrVect) {
140
                this.drawVectElevationOnTo(canvas);
141
            }
142
        } else {
143
            this.drawImageOnTo(canvas);
144
        }
145
    }
146

    
147
    private void drawRasterElevationOnTo(DataRaster canvas) {
148

    
149
        if (canvas == null) {
150
            throw new IllegalArgumentException();
151
        }
152

    
153
        if (!(this.layer instanceof FLyrRaster)
154
            || !canvas.getSector().intersects(getSector())) {
155
            return;
156
        }
157

    
158
        Extent canvasExtent = getExtent(canvas.getSector());
159

    
160
        // Create query. Configure to get the zone request by canvas scaled to
161
        // tile size.
162
        RasterQuery query = RasterLocator.getManager().createQuery();
163
        query.setSupersamplingOption(false);
164
        query.setDrawableBands(new int[] { 0 });
165
        query.setReadOnly(true);
166
        query.storeLastBuffer(true);
167
        query.setAreaOfInterest(canvasExtent, canvas.getWidth(),
168
            canvas.getHeight());
169

    
170
        Buffer adjustedBuffer = null;
171
        FLyrRaster rasterLayer = (FLyrRaster) this.layer;
172
        RasterDataStore dataStore = rasterLayer.getDataStore();
173

    
174
        try {
175
            // For best performance, checks if canvas extent is the same than
176
            // last request. If it is the same, it will get last buffer
177
            // stored. Otherwise, it will do created query.
178
            if (canvasExtent.equals(this.canvasExtent)
179
                && dataStore.getLastBuffer() != null) {
180
                adjustedBuffer = dataStore.getLastBuffer();
181
            } else {
182
                adjustedBuffer = dataStore.query(query);
183
            }
184
        } catch (ProcessInterruptedException e) {
185
            LOG.error("Process interrupted while {} was executing a query",
186
                dataStore.getName(), e);
187
            return;
188
        } catch (QueryException e) {
189
            LOG.error("Query exception, can apply {} to {}",
190
                new Object[] { query.toString(), dataStore.getName() }, e);
191
            return;
192
        }
193

    
194
        // For performance reasons, stores canvas extent to avoid calculate it
195
        // in each iteration
196
        setCanvasEnxent(canvas.getSector());
197
        Sector overlap = this.getSector().intersection(canvas.getSector());
198
        setOverlapExtent(overlap);
199

    
200
        String dataType = this.getStringValue(AVKey.DATA_TYPE);
201

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

    
205
                Point2D rasterPoint =
206
                    getRasterPoint(x, y, canvas, adjustedBuffer);
207

    
208
                // If raster point is not null, get value of buffer and write it
209
                // to canvas
210
                if (rasterPoint != null) {
211
                    if (AVKey.INT8.equals(dataType)) {
212

    
213
                        byte byteValue =
214
                            adjustedBuffer.getElemByte((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 = adjustedBuffer.getElemShort(
223
                            (int) rasterPoint.getY(), (int) rasterPoint.getX(),
224
                            0);
225

    
226
                        setNumberToDataRaster((ByteBufferRaster) canvas, y, x,
227
                            shortValue);
228

    
229
                    } else if (AVKey.INT32.equals(dataType)) {
230

    
231
                        int intValue =
232
                            adjustedBuffer.getElemInt((int) rasterPoint.getY(),
233
                                (int) rasterPoint.getX(), 0);
234

    
235
                        setNumberToDataRaster((ByteBufferRaster) canvas, y, x,
236
                            intValue);
237

    
238
                    } else if (AVKey.FLOAT32.equals(dataType)) {
239

    
240
                        float floatValue = adjustedBuffer.getElemFloat(
241
                            (int) rasterPoint.getY(), (int) rasterPoint.getX(),
242
                            0);
243

    
244
                        setNumberToDataRaster((ByteBufferRaster) canvas, y, x,
245
                            floatValue);
246

    
247
                    } else if (AVKey.FLOAT64.equals(dataType)) {
248

    
249
                        double doubleValue = adjustedBuffer.getElemDouble(
250
                            (int) rasterPoint.getY(), (int) rasterPoint.getX(),
251
                            0);
252

    
253
                        setNumberToDataRaster((ByteBufferRaster) canvas, y, x,
254
                            doubleValue);
255
                    }
256
                } else {
257
                    // Invalid point, write NoData value
258
                    Number noData =
259
                        (Number) this.getValue(AVKey.MISSING_DATA_SIGNAL);
260
                    if (AVKey.INT8.equals(dataType)) {
261
                        setNumberToDataRaster((ByteBufferRaster) canvas, y, x,
262
                            noData.byteValue());
263
                    } else if (AVKey.INT16.equals(dataType)) {
264
                        setNumberToDataRaster((ByteBufferRaster) canvas, y, x,
265
                            noData.shortValue());
266
                    } else if (AVKey.INT32.equals(dataType)) {
267
                        setNumberToDataRaster((ByteBufferRaster) canvas, y, x,
268
                            noData.intValue());
269
                    } else if (AVKey.FLOAT32.equals(dataType)) {
270
                        setNumberToDataRaster((ByteBufferRaster) canvas, y, x,
271
                            noData.floatValue());
272
                    } else if (AVKey.FLOAT64.equals(dataType)) {
273
                        setNumberToDataRaster((ByteBufferRaster) canvas, y, x,
274
                            noData.doubleValue());
275
                    }
276
                }
277
            }
278
        }
279
    }
280

    
281
    private Point2D getRasterPoint(int x, int y, DataRaster canvas,
282
        Buffer adjustedBuffer) {
283

    
284
        // Gets coordiantes of pixel raster
285
        Point2D worldPoint =
286
            canvasExtent.rasterToWorld(new Point2D.Double(x, y),
287
                getCellSize(canvas.getSector(), canvas.getWidth()));
288

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

    
295
            if (isPointOfBuffer(rasterPoint, adjustedBuffer)) {
296
                return rasterPoint;
297
            }
298
        }
299
        return null;
300
    }
301

    
302
    private void setCanvasEnxent(Sector canvasSector) {
303
        this.canvasExtent = getExtent(canvasSector);
304
    }
305

    
306
    private void setOverlapExtent(Sector overlap) {
307
        this.overlapExtent = getExtent(overlap);
308
    }
309

    
310
    private Extent getExtent(Sector sector) {
311
        Rectangle2D rectangleDegrees = sector.toRectangleDegrees();
312
        RasterManager rasterManager = RasterLocator.getManager();
313
        DataStructFactory dataStructFactory =
314
            rasterManager.getDataStructFactory();
315
        return dataStructFactory.createExtent(rectangleDegrees);
316
    }
317

    
318
    private double getCellSize(Sector sector, int width) {
319

    
320
        Rectangle2D rectangleDegrees = sector.toRectangleDegrees();
321

    
322
        return rectangleDegrees.getWidth() / width;
323
    }
324

    
325
    private boolean isPointOfBuffer(Point2D rasterPoint, Buffer buffer) {
326
        if (layer instanceof FLyrRaster) {
327
            double x = rasterPoint.getX();
328
            double y = rasterPoint.getY();
329
            return x > -1 && y > -1 && x < buffer.getWidth()
330
                && y < buffer.getHeight() ? true : false;
331
        }
332
        return false;
333
    }
334

    
335
    private void setNumberToDataRaster(ByteBufferRaster byteBuferRaster,
336
        int line, int col, Number value) {
337
        byteBuferRaster.setDoubleAtPosition(line, col, value.doubleValue());
338
    }
339

    
340
    private void drawVectElevationOnTo(DataRaster canvas) {
341
        // TODO Auto-generated method stub
342

    
343
    }
344

    
345
    private void drawImageOnTo(DataRaster canvas) {
346
        if (canvas == null) {
347
            throw new IllegalArgumentException();
348
        }
349

    
350
        if (!canvas.getSector().intersects(getSector())) {
351
            return;
352
        }
353

    
354
        Sector overlap = this.getSector().intersection(canvas.getSector());
355
        
356
        if(mapControl3D == null) {
357
            return;
358
        }
359

    
360
        ViewPort viewPort =
361
            new ViewPort(mapControl3D.getMapContext().getProjection());
362

    
363
        // Set adjustable to false to avoid problems with adjusted envelope
364
        viewPort.setAdjustable(false);
365

    
366
        GeometryManager geoManager = GeometryLocator.getGeometryManager();
367

    
368
        Envelope envelope = null;
369
        double[] degrees = overlap.asDegreesArray();
370

    
371
        try {
372

    
373
            IProjection projection = layer.getProjection();
374
            ICoordTrans layerCoordTrans = layer.getCoordTrans();
375
            ICoordTrans ct;
376
            if(layerCoordTrans != null){
377
                ct = CRSFactory.getCRS("EPSG:4326").getCT(layerCoordTrans.getPDest());
378
            } else {
379
                ct = CRSFactory.getCRS("EPSG:4326").getCT(projection);
380
            }
381
            Point2D p1 =
382
                convert(ct, new Point2D.Double(degrees[2], degrees[0]));
383
            Point2D p2 =
384
                convert(ct, new Point2D.Double(degrees[3], degrees[1]));
385

    
386
            envelope = geoManager.createEnvelope(Math.min(p1.getX(), p2.getX()),
387
                Math.min(p1.getY(), p2.getY()), Math.max(p1.getX(), p2.getX()),
388
                Math.max(p1.getY(), p2.getY()), SUBTYPES.GEOM2D);
389

    
390
            /**
391
             * Check if request tile intersect with layer envelope to avoid
392
             * the creation of useless tiles.
393
             */
394
            if (!envelope.intersects(layer.getFullEnvelope())) {
395
                return;
396
            }
397

    
398
            viewPort.setEnvelope(envelope);
399

    
400
        } catch (CreateEnvelopeException e) {
401
            LOG.error(
402
                "Can't create envelope from sector tile:  minLat {} maxLat {} minLon {} maxLon {}",
403
                new Object[] { degrees[0], degrees[1], degrees[2],
404
                    degrees[3] });
405
            return;
406
        } catch (ReadException e) {
407
            LOG.warn("Can't get full envelope of {}", layer.getName());
408
        }
409

    
410
        int canvasWidth = canvas.getWidth();
411
        int canvasHeight = canvas.getHeight();
412

    
413
        java.awt.Rectangle clipRect = this.computeClipRect(overlap, this);
414
        if (null == clipRect || clipRect.width == 0 || clipRect.height == 0) {
415
            return;
416
        }
417

    
418
        // Apply the transform that correctly maps the image onto the canvas.
419
        java.awt.geom.AffineTransform affineTransform =
420
            this.computeSourceToDestTransform(clipRect.width, clipRect.height,
421
                overlap, canvasWidth, canvasHeight, canvas.getSector());
422

    
423
        // Trick to apply transform to size value
424
        Point2D srcSizePoint =
425
            new Point2D.Double(clipRect.width, clipRect.height);
426
        Point2D dstSizePoint = new Point2D.Double();
427

    
428
        affineTransform.transform(srcSizePoint, dstSizePoint);
429

    
430
        int clipWidth = (int) Math.ceil((dstSizePoint.getX() >= canvasWidth)
431
            ? canvasWidth : dstSizePoint.getX());
432
        int clipHeight = (int) Math.ceil((dstSizePoint.getY() >= canvasHeight)
433
            ? canvasHeight : dstSizePoint.getY());
434

    
435
        if (clipWidth <= 0 || clipHeight <= 0) {
436
            return;
437
        }
438

    
439
        BufferedImage image = new BufferedImage(clipWidth, clipHeight,
440
            BufferedImage.TYPE_INT_ARGB);
441

    
442
        viewPort.setImageSize(new Dimension(clipWidth, clipHeight));
443
        viewPort.refreshExtent();
444

    
445
        try {
446
            layer.draw(image, (Graphics2D) image.getGraphics(), viewPort,
447
                mapControl3D.getCancellable(), getScale(viewPort));
448

    
449
            if (layer instanceof FLyrVect && layer instanceof ILabelable) {
450

    
451
                ILabelable labelable = (ILabelable) layer;
452

    
453
                if (labelable.isLabeled()
454
                    && labelable.getLabelingStrategy() != null
455
                    && labelable.getLabelingStrategy()
456
                        .shouldDrawLabels(getScale(viewPort))) {
457

    
458
                    labelable.drawLabels(image,
459
                        (Graphics2D) image.getGraphics(), viewPort,
460
                        mapControl3D.getCancellable(), getScale(viewPort),
461
                        mapControl3D.getMapContext().getViewPort().getDPI());
462
                }
463
            }
464

    
465
        } catch (ReadException e) {
466
            LOG.warn("Can't draw required zone of layer {}, can't read legend",
467
                layer.getName());
468
            return;
469
        } finally {
470
            if (mapControl3D.getCancellable().isCanceled()) {
471
                return;
472
            }
473
        }
474
        BufferedImageRaster bufferedImageRaster =
475
            new BufferedImageRaster(overlap, image);
476
        bufferedImageRaster.drawOnTo(canvas);
477

    
478
    }
479

    
480
    private Point2D convert(ICoordTrans ct, Point2D srcPoint) {
481
        if (ct == null) {
482
            return srcPoint;
483
        }
484
        return ct.convert(srcPoint, null);
485
    }
486

    
487
    private java.awt.geom.AffineTransform computeSourceToDestTransform(
488
        int sourceWidth, int sourceHeight, Sector sourceSector, int destWidth,
489
        int destHeight, Sector destSector) {
490
        // Compute the the transform from source to destination coordinates. In
491
        // this computation a pixel is assumed
492
        // to cover a finite area.
493

    
494
        double ty = destHeight
495
            * -(sourceSector.getMaxLatitude().degrees
496
                - destSector.getMaxLatitude().degrees)
497
            / destSector.getDeltaLatDegrees();
498
        double tx = destWidth
499
            * (sourceSector.getMinLongitude().degrees
500
                - destSector.getMinLongitude().degrees)
501
            / destSector.getDeltaLonDegrees();
502

    
503
        double sy = ((double) destHeight / (double) sourceHeight)
504
            * (sourceSector.getDeltaLatDegrees()
505
                / destSector.getDeltaLatDegrees());
506
        double sx = ((double) destWidth / (double) sourceWidth)
507
            * (sourceSector.getDeltaLonDegrees()
508
                / destSector.getDeltaLonDegrees());
509

    
510
        java.awt.geom.AffineTransform transform =
511
            new java.awt.geom.AffineTransform();
512
        transform.translate(tx, ty);
513
        transform.scale(sx, sy);
514
        return transform;
515
    }
516

    
517
    private double getScale(ViewPort viewPort) {
518

    
519
        double dpi = viewPort.getDPI();
520
        IProjection proj = viewPort.getProjection();
521

    
522
        if (viewPort.getImageSize() == null) {
523
            return -1;
524
        }
525

    
526
        if (viewPort.getAdjustedEnvelope() == null) {
527
            return 0;
528
        }
529
        double[] trans2Meter = MapContext.getDistanceTrans2Meter();
530
        int mUnits = viewPort.getMapUnits();
531

    
532
        if (proj == null) {
533
            double w = ((viewPort.getImageSize().width / dpi) * 0.0254);
534
            return (long) (viewPort.getAdjustedEnvelope().getLength(0) / w
535
                * trans2Meter[mUnits]);
536
        }
537

    
538
        return Math.round(proj.getScale(
539
            viewPort.getAdjustedEnvelope().getMinimum(0) * trans2Meter[mUnits],
540
            viewPort.getAdjustedEnvelope().getMaximum(0) * trans2Meter[mUnits],
541
            viewPort.getImageSize().width, dpi));
542
    }
543

    
544
    private Rectangle computeClipRect(Sector clipSector,
545
        DataRaster clippedRaster) {
546

    
547
        AffineTransform geographicToRaster =
548
            this.computeGeographicToRasterTransform(clippedRaster.getWidth(),
549
                clippedRaster.getHeight(), clippedRaster.getSector());
550

    
551
        java.awt.geom.Point2D geoPoint = new java.awt.geom.Point2D.Double();
552
        java.awt.geom.Point2D ul = new java.awt.geom.Point2D.Double();
553
        java.awt.geom.Point2D lr = new java.awt.geom.Point2D.Double();
554

    
555
        geoPoint.setLocation(clipSector.getMinLongitude().degrees,
556
            clipSector.getMaxLatitude().degrees);
557
        geographicToRaster.transform(geoPoint, ul);
558

    
559
        geoPoint.setLocation(clipSector.getMaxLongitude().degrees,
560
            clipSector.getMinLatitude().degrees);
561
        geographicToRaster.transform(geoPoint, lr);
562

    
563
        int x = (int) Math.floor(ul.getX());
564
        int y = (int) Math.floor(ul.getY());
565
        int width = (int) Math.ceil(lr.getX() - ul.getX());
566
        int height = (int) Math.ceil(lr.getY() - ul.getY());
567

    
568
        return new Rectangle(x, y, width, height);
569
    }
570

    
571
    private java.awt.geom.AffineTransform computeGeographicToRasterTransform(
572
        int width, int height, Sector sector) {
573
        // Compute the the transform from geographic to raster coordinates. In
574
        // this computation a pixel is assumed
575
        // to cover a finite area.
576

    
577
        double ty = -sector.getMaxLatitude().degrees;
578
        double tx = -sector.getMinLongitude().degrees;
579

    
580
        double sy = -(height / sector.getDeltaLatDegrees());
581
        double sx = (width / sector.getDeltaLonDegrees());
582

    
583
        java.awt.geom.AffineTransform transform =
584
            new java.awt.geom.AffineTransform();
585
        transform.scale(sx, sy);
586
        transform.translate(tx, ty);
587
        return transform;
588
    }
589

    
590
    public DataRaster getSubRaster(AVList params) {
591
        int width = (Integer) params.getValue(AVKey.WIDTH);
592
        int height = (Integer) params.getValue(AVKey.HEIGHT);
593
        Sector sector = (Sector) params.getValue(AVKey.SECTOR);
594

    
595
        return this.getSubRaster(width, height, sector, params);
596
    }
597

    
598
    public DataRaster getSubRaster(int width, int height, Sector sector,
599
        AVList params) {
600

    
601
        params.setValue(AVKey.WIDTH, width);
602
        params.setValue(AVKey.HEIGHT, height);
603
        params.setValue(AVKey.SECTOR, sector);
604

    
605
        GvSIGLayerDataRaster subRaster =
606
            new GvSIGLayerDataRaster(mapControl3D, layer, params);
607
        return subRaster;
608
    }
609
}