Statistics
| Revision:

gvsig-raster / org.gvsig.raster / branches / org.gvsig.raster.2.4 / org.gvsig.raster / org.gvsig.raster.gdal / org.gvsig.raster.gdal.provider / src / main / java / org / gvsig / raster / gdal / provider / AbstractRasterGdalStoreProvider.java @ 6691

History | View | Annotate | Download (21.2 KB)

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

    
25
import java.util.ArrayList;
26
import java.util.HashMap;
27
import java.util.List;
28
import java.util.Map;
29

    
30
import org.cresques.cts.IProjection;
31
import org.gdal.gdal.Dataset;
32
import org.gdal.gdal.Driver;
33
import org.slf4j.Logger;
34
import org.slf4j.LoggerFactory;
35

    
36
import org.gvsig.fmap.dal.DataStoreNotification;
37
import org.gvsig.fmap.dal.DataStoreParameters;
38
import org.gvsig.fmap.dal.FileHelper;
39
import org.gvsig.fmap.dal.exception.CloseException;
40
import org.gvsig.fmap.dal.exception.CreateException;
41
import org.gvsig.fmap.dal.exception.InitializeException;
42
import org.gvsig.fmap.dal.exception.OpenException;
43
import org.gvsig.fmap.dal.raster.api.BandAttributeDescriptor;
44
import org.gvsig.fmap.dal.raster.api.BandDescriptor;
45
import org.gvsig.fmap.dal.raster.api.BandQuery;
46
import org.gvsig.fmap.dal.raster.api.RasterQuery;
47
import org.gvsig.fmap.dal.raster.spi.AbstractRasterStoreProvider;
48
import org.gvsig.fmap.dal.resource.spi.ResourceConsumer;
49
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
50
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
51
import org.gvsig.fmap.geom.DataTypes;
52
import org.gvsig.fmap.geom.Geometry;
53
import org.gvsig.fmap.geom.GeometryLocator;
54
import org.gvsig.fmap.geom.Geometry.DIMENSIONS;
55
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
56
import org.gvsig.fmap.geom.primitive.Envelope;
57
import org.gvsig.metadata.MetadataLocator;
58
import org.gvsig.metadata.MetadataManager;
59
import org.gvsig.metadata.exceptions.MetadataException;
60
import org.gvsig.raster.lib.buffer.api.Band;
61
import org.gvsig.raster.lib.buffer.api.BandInfo;
62
import org.gvsig.raster.lib.buffer.api.Buffer;
63
import org.gvsig.raster.lib.buffer.api.BufferDimensions;
64
import org.gvsig.raster.lib.buffer.api.BufferLocator;
65
import org.gvsig.raster.lib.buffer.api.BufferManager;
66
import org.gvsig.raster.lib.buffer.api.NoData;
67
import org.gvsig.raster.lib.buffer.api.PageManager;
68
import org.gvsig.raster.lib.buffer.api.TileStruct;
69
import org.gvsig.raster.lib.buffer.api.exceptions.BufferException;
70
import org.gvsig.raster.lib.buffer.spi.DefaultTileStruct;
71
import org.gvsig.tools.ToolsLocator;
72
import org.gvsig.tools.dynobject.DynClass;
73
import org.gvsig.tools.dynobject.DynField;
74
import org.gvsig.tools.dynobject.DynObject;
75
import org.gvsig.tools.exception.BaseException;
76
import org.gvsig.tools.locator.LocatorException;
77
import org.gvsig.tools.task.SimpleTaskStatus;
78
import org.gvsig.tools.task.TaskStatusManager;
79

    
80
/**
81
 * Provider for Raster GDAL files
82
 * @author dmartinezizquierdo
83
 *
84
 */
85
public abstract class AbstractRasterGdalStoreProvider extends AbstractRasterStoreProvider implements
86
ResourceConsumer{
87

    
88
    private static final Logger logger =
89
        LoggerFactory.getLogger(AbstractRasterGdalStoreProvider.class);
90

    
91
    /**
92
     * Provider name
93
     */
94
    public static String NAME = "RasterGdal";
95
    /**
96
     * Provider description
97
     */
98
    public static String DESCRIPTION = "Raster GDAL provider";
99
    /**
100
     * Parameters definition name for metadata
101
     */
102
    public static final String METADATA_DEFINITION_NAME = NAME;
103

    
104
    protected ResourceProvider resource;
105
    protected final SimpleTaskStatus taskStatus;
106

    
107
    protected Envelope envelope = null;
108
    protected IProjection projection= null;
109
    protected Dataset gdalDataSet;
110
    protected Driver gdalDriver;
111

    
112
    private List<PageManager> pageManagers;
113

    
114
    /**
115
     * Dataset from gdal containing the raster data
116
     * @return Dataset
117
     */
118
    public Dataset getGdalDataSet() {
119
        return gdalDataSet;
120
    }
121

    
122
    protected static void registerMetadataDefinition()
123
        throws MetadataException {
124
        MetadataManager manager = MetadataLocator.getMetadataManager();
125
        if (manager.getDefinition(METADATA_DEFINITION_NAME) == null) {
126
            manager.addDefinition(METADATA_DEFINITION_NAME,
127
                DataStoreParameters.class
128
                    .getResourceAsStream("RasterGdalMetadata.xml"),
129
                    DataStoreParameters.class.getClassLoader());
130
        }
131
    }
132

    
133
    /**
134
     * Constructor
135
     * @param params
136
     * @param storeServices
137
     * @throws InitializeException
138
     */
139
    public AbstractRasterGdalStoreProvider(DataStoreParameters params,
140
        DataStoreProviderServices storeServices)
141
        throws InitializeException {
142
        super(
143
                params,
144
                storeServices,
145
                FileHelper.newMetadataContainer(METADATA_DEFINITION_NAME)
146
        );
147
        TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
148
        this.taskStatus = manager.createDefaultSimpleTaskStatus("RasterGdal");
149
        this.init(params, storeServices);
150
    }
151

    
152
    protected AbstractRasterGdalStoreProvider(DataStoreParameters params,
153
            DataStoreProviderServices storeServices, DynObject metadata)
154
            throws InitializeException {
155
        super(params, storeServices, metadata);
156
        TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
157
        this.taskStatus = manager.createDefaultSimpleTaskStatus("RasterGdal");
158
        this.init((DataStoreParameters)params, storeServices);
159
    }
160

    
161
    protected AbstractRasterGdalStoreProvider(NewRasterGdalStoreParameters params, Driver gdalDriver) {
162
        //PARA Exportar
163
        super(params,null,null);
164
        this.gdalDriver=gdalDriver;
165
        TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
166
        this.taskStatus = manager.createDefaultSimpleTaskStatus("RasterGdal");
167
    }
168

    
169
    protected void init(DataStoreParameters params,
170
        DataStoreProviderServices storeServices) throws InitializeException {
171
        if (params == null) {
172
            throw new InitializeException(
173
                new NullPointerException("params is null"));
174
        }
175

    
176
    }
177

    
178
    protected DataStoreParameters getRasterGdalParameters() {
179
        return (DataStoreParameters) this.getParameters();
180
    }
181

    
182
    /**
183
     * Used to obtain the specific options for a specific driver
184
     * Not in use yet. Used as example.
185
     * @return options used to open a specific driver in format ("optionName=optionValue")
186
     */
187
    private String [] getParametersDriverOptions(){
188
        ArrayList<String> optionsList=new ArrayList<String>();
189
        DynClass dynClass = getRasterGdalParameters().getDynClass();
190
        DynField[] fields = dynClass.getDynFields();
191
        for (DynField field:fields){
192
            String fieldName = field.getName();
193
            String gdalOption = fieldName.toUpperCase();
194
            Object dynValue = getRasterGdalParameters().getDynValue(fieldName);
195

    
196
            if (dynValue!=null && field.getGroup().equalsIgnoreCase(RasterGdalFileStoreParameters.OPEN_OPTIONS_GROUP)){
197
                if(field.getType() == DataTypes.BOOLEAN) {
198
                    if((Boolean)dynValue){
199
                        optionsList.add(gdalOption+"=YES");
200
                    }else{
201
                        optionsList.add(gdalOption+"=NO");
202
                    }
203

    
204
                } else {
205
                    optionsList.add(gdalOption+"="+dynValue);
206
                }
207
            }
208
        }
209
        String[]options=new String[optionsList.size()];
210
        optionsList.toArray(options);
211
        return options;
212
    }
213

    
214
    @Override
215
    public Buffer createBuffer(RasterQuery rasterQuery) throws BufferException {
216

    
217
        BufferManager bufferManager = BufferLocator.getBufferManager();
218

    
219
        Buffer buffer = null;
220

    
221
        if (rasterQuery != null && !rasterQuery.getBands().isEmpty()) {
222
            List<BandQuery> bands;
223
            bands = rasterQuery.getBands();
224
            int bandDataTypes[];
225
            bandDataTypes = new int[bands.size()];
226
            NoData[] bandNoDatas = new NoData[bands.size()];
227
            List<PageManager> pageManagers = new ArrayList<PageManager>();
228

    
229
            int i=0;
230
            for (BandQuery bandQuery : bands) {
231
                int band = bandQuery.getBand();
232
                bandDataTypes[i] = this.getBandDescriptor(band).getDataType();
233
                bandNoDatas[i] = this.getNoData(rasterQuery, band);
234
                pageManagers.add(this.pageManagers.get(band));
235
                i++;
236
            }
237
            buffer =
238
                bufferManager.createBuffer(gdalDataSet.getRasterYSize(), gdalDataSet.getRasterXSize(), bandDataTypes,
239
                    bandNoDatas, this.projection, envelope, pageManagers);
240
        } else {
241
            buffer =
242
                bufferManager.createBuffer(gdalDataSet.getRasterYSize(), gdalDataSet.getRasterXSize(), this.getDataTypes(),
243
                    this.getNoDatas(), this.projection, this.envelope, this.pageManagers);
244
        }
245

    
246
        return buffer;
247
    }
248

    
249
    @Override
250
    public int getBands() {
251
        return gdalDataSet.getRasterCount();
252
    }
253

    
254
    private Double getNoData(org.gdal.gdal.Band gdalBand){
255
        Double[] noDataValueResult=new Double[1];
256
        gdalBand.GetNoDataValue(noDataValueResult);
257
        Double noData=noDataValueResult[0];
258
        return noData;
259
    }
260

    
261

    
262

    
263
    public void open() throws OpenException {
264
        if (this.gdalDataSet != null) {
265
            return;
266
        }
267
        openEver();
268
        //Create the page managers
269
        BufferManager bufferManager=BufferLocator.getBufferManager();
270

    
271
        int bandCount=gdalDataSet.getRasterCount();
272

    
273
        pageManagers = new ArrayList<PageManager>();
274

    
275
        for (int i=0;i<bandCount;i++){
276
            //Gdal bands begin count in 1
277
            int gdalBandNumber=i+1;
278
            org.gdal.gdal.Band gdalBand=gdalDataSet.GetRasterBand(gdalBandNumber);
279

    
280
            this.getBandDescriptor(i).setDataType(getRasterBufTypeFromGdalType(gdalBand.getDataType()));
281
            Double noData=getNoData(gdalBand);
282
            this.getBandDescriptor(i).setDescription(gdalBand.GetDescription());
283
            if (noData!=null){
284
                this.getBandDescriptor(i).setNoData(bufferManager.createNoData(noData, noData));
285
            }
286
            //Paginated
287
            pageManagers.add(new RasterGdalBandPageManager(gdalDataSet, gdalBandNumber));
288
            //Tiled
289
//            pageManagers.add(new RasterGdalBandTileManager(gdalDataSet, gdalBandNumber, 256, 256));
290
        }
291

    
292

    
293
    }
294

    
295
    protected abstract void openEver() throws OpenException;
296

    
297
    protected Envelope createEnvelope(double[] geotransform){
298

    
299
        double leftMostX        = geotransform[0];/* top left x */
300
        double pixelSizeX       = geotransform[1];/* w-e pixel resolution */
301
        double rotationAxisX    = geotransform[2];/* 0 */
302
        double upperMostY       = geotransform[3];/* top left y */
303
        double rotationAxisY    = geotransform[4];/* 0 */
304
        double pixelSizeY       = geotransform[5];/* n-s pixel resolution (negative value) */
305

    
306
        if (0.0 != rotationAxisX || 0.0 != rotationAxisY) {
307
            logger.warn(
308
                "Rotation in wld file not implemented yet. It will be ignored");
309
        }
310

    
311
        double width =Math.abs(gdalDataSet.getRasterXSize()*pixelSizeX);
312
        double height=Math.abs(gdalDataSet.getRasterYSize()*pixelSizeY);
313

    
314
        // double minX, double minY, double maxX, double maxY, int subType
315
        try {
316
            envelope = GeometryLocator.getGeometryManager().createEnvelope(
317
                Math.min(leftMostX,leftMostX + width),
318
                Math.min(upperMostY,upperMostY - height),
319
                Math.max(leftMostX,leftMostX + width),
320
                Math.max(upperMostY,upperMostY - height),
321
                Geometry.SUBTYPES.GEOM2D);
322
        } catch (LocatorException | CreateEnvelopeException e) {
323
            logger.warn(
324
                "Failed to create envelope from wld file with coords: minx:"+leftMostX+
325
                ", miny:"+upperMostY+", maxX: "+leftMostX + width+", maxY: "+upperMostY + height);
326
            e.printStackTrace();
327
        }
328

    
329
        return envelope;
330
    }
331

    
332
    @Override
333
    public void close() throws CloseException {
334
        this.gdalDataSet.delete();
335
        this.gdalDataSet = null;
336
    }
337

    
338
    @Override
339
    public ResourceProvider getResource() {
340
        return this.resource;
341
    }
342

    
343
    @Override
344
    public String getProviderName() {
345
        return getRasterGdalParameters().getDataStoreName();
346
    }
347

    
348
    @Override
349
    public boolean closeResourceRequested(ResourceProvider resource) {
350
        return true;
351
    }
352

    
353
    @Override
354
    /*
355
     * (non-Javadoc)
356
     *
357
     * @see
358
     * org.gvsig.fmap.dal.resource.spi.ResourceConsumer#resourceChanged(org.
359
     * gvsig.fmap.dal.resource.spi.ResourceProvider)
360
     */
361
    public void resourceChanged(ResourceProvider resource) {
362
        this.getStoreServices().notifyChange(
363
            DataStoreNotification.RESOURCE_CHANGED,
364
            resource);
365
    }
366

    
367
    @Override
368
    /* (non-Javadoc)
369
     * @see org.gvsig.fmap.dal.feature.spi.memory.AbstractMemoryStoreProvider#doDispose()
370
     */
371
    protected void doDispose() throws BaseException {
372
        super.doDispose();
373
        if(gdalDataSet!=null){
374
            gdalDataSet.delete();
375
            gdalDataSet=null;
376
        }
377
        resource.removeConsumer(this);
378
    }
379

    
380
    /**
381
     * Conversi?n de los tipos de datos de gdal a los tipos de datos de RasterBuf
382
     * @param gdalType Tipo de dato de gdal
383
     * @return Tipo de dato de RasterBuf
384
     */
385
    protected static int getRasterBufTypeFromGdalType(int gdalType) {
386
        switch (gdalType) {
387
            case 1:// Eight bit unsigned integer GDT_Byte = 1
388
                return BufferManager.TYPE_BYTE;
389

    
390
            case 3:// Sixteen bit signed integer GDT_Int16 = 3,
391
                return BufferManager.TYPE_SHORT;
392

    
393
            case 2:// Sixteen bit unsigned integer GDT_UInt16 = 2
394
                //return RasterBuffer.TYPE_USHORT;
395
                return BufferManager.TYPE_SHORT; //Apa?o para usar los tipos de datos que soportamos
396

    
397
            case 5:// Thirty two bit signed integer GDT_Int32 = 5
398
                return BufferManager.TYPE_INT;
399

    
400
            case 6:// Thirty two bit floating point GDT_Float32 = 6
401
                return BufferManager.TYPE_FLOAT;
402

    
403
            case 7:// Sixty four bit floating point GDT_Float64 = 7
404
                return BufferManager.TYPE_DOUBLE;
405

    
406
                // TODO:Estos tipos de datos no podemos gestionarlos. Habria que definir
407
                // el tipo complejo y usar el tipo long que de momento no se gasta.
408
            case 4:// Thirty two bit unsigned integer GDT_UInt32 = 4,
409
                return BufferManager.TYPE_INT;
410
                //return RasterBuffer.TYPE_UNDEFINED; // Deberia devolver un Long
411

    
412
            case 8:// Complex Int16 GDT_CInt16 = 8
413
            case 9:// Complex Int32 GDT_CInt32 = 9
414
            case 10:// Complex Float32 GDT_CFloat32 = 10
415
            case 11:// Complex Float64 GDT_CFloat64 = 11
416
                return BufferManager.TYPE_UNDEFINED;
417
        }
418
        return BufferManager.TYPE_UNDEFINED;
419
    }
420

    
421
    /**
422
     * Conversi?n de los tipos de datos de RasterBuffer a los tipos de datos de gdal
423
     * @param ype Tipo de dato de RasterBuffer
424
     * @return Tipo de dato de gdal
425
     */
426
    protected static int getGdalTypeFromRasterBufType(int type) {
427
        switch (type) {
428
        case BufferManager.TYPE_BYTE:
429
            return 1; // Eight bit unsigned integer GDT_Byte = 1
430
        case BufferManager.TYPE_SHORT:
431
            return 3;// Sixteen bit signed integer GDT_Int16 = 3,
432
        case BufferManager.TYPE_USHORT:
433
            return 2;// Sixteen bit unsigned integer GDT_UInt16 = 2
434
        case BufferManager.TYPE_INT:
435
            return 5;// Thirty two bit signed integer GDT_Int32 = 5
436
        case BufferManager.TYPE_FLOAT:
437
            return 6;// Thirty two bit floating point GDT_Float32 = 6
438
        case BufferManager.TYPE_DOUBLE:
439
            return 7;// Sixty four bit floating point GDT_Float64 = 7
440
        default:
441
            return 1; // By default eight bit unsigned integer GDT_Byte = 1 and the force be with you.
442
        }
443
    }
444

    
445

    
446

    
447
    /**
448
     * Stores a buffer into a new entity
449
     * @param newRasterParams
450
     * @param overwrite
451
     * @throws CreateException
452
     */
453
    public void store(boolean overwrite)
454
        throws CreateException {
455
        //This method must be overwritten by subclasses than can be stored
456
        throw new UnsupportedOperationException("This provider can't store the raster");
457
    }
458

    
459

    
460
    /**
461
     * Fills a given dataset with data from a buffer
462
     * @param buffer
463
     * @param gdalDataset
464
     */
465
    protected void fillDataset(Buffer buffer, Dataset gdalDataset) {
466
        for (int i=0;i<buffer.getBandCount();i++){
467
            Band band = buffer.getBand(i);
468

    
469
            switch (band.getDataType()) {
470
            case BufferManager.TYPE_BYTE:
471
                byte[] byteRowBuffer = (byte[])band.createRowBuffer(); //new byte[band.getColumns()];
472
                for (int row=0;row<band.getRows();row++){
473
                    band.fetchRow(row, byteRowBuffer);
474
                    gdalDataset.GetRasterBand(i+1).WriteRaster(0, row, band.getColumns(), 1,
475
                        byteRowBuffer);
476
                }
477
                break;
478

    
479
            case BufferManager.TYPE_DOUBLE:
480
                double[] doubleRowBuffer=(double[])band.createRowBuffer();
481
                for (int row=0;row<band.getRows();row++){
482
                    band.fetchRow(row, doubleRowBuffer);
483
                    gdalDataset.GetRasterBand(i+1).WriteRaster(0, row, band.getColumns(), 1,
484
                        doubleRowBuffer);
485
                }
486
                break;
487

    
488
            case BufferManager.TYPE_FLOAT:
489
                float[] floatRowBuffer=(float[])band.createRowBuffer();
490
                for (int row=0;row<band.getRows();row++){
491
                    band.fetchRow(row, floatRowBuffer);
492
                    gdalDataset.GetRasterBand(i+1).WriteRaster(0, row, band.getColumns(), 1,
493
                        floatRowBuffer);
494
                }
495
                break;
496

    
497
            case BufferManager.TYPE_INT:
498
                int[] intRowBuffer=(int[])band.createRowBuffer();
499
                for (int row=0;row<band.getRows();row++){
500
                    band.fetchRow(row, intRowBuffer);
501
                    gdalDataset.GetRasterBand(i+1).WriteRaster(0, row, band.getColumns(), 1,
502
                        intRowBuffer);
503
                }
504
                break;
505

    
506
            case BufferManager.TYPE_SHORT:
507
            case BufferManager.TYPE_USHORT:
508
                short[] shortRowBuffer=(short[])band.createRowBuffer();
509
                for (int row=0;row<band.getRows();row++){
510
                    band.fetchRow(row, shortRowBuffer);
511
                    gdalDataset.GetRasterBand(i+1).WriteRaster(0, row, band.getColumns(), 1,
512
                        shortRowBuffer);
513
                }
514
                break;
515

    
516
            default:
517
                break;
518
            }
519

    
520
        }
521
    }
522

    
523
    public TileStruct getTileStruct() {
524

    
525
        List<Double> pixelSizes = new ArrayList<Double>();
526
        Map<Integer, Double> zoomLevels = new HashMap<Integer, Double>();
527

    
528
        TileStruct tileStruct = new DefaultTileStruct();
529
        //FIXME: DefaultTileStruct ya pone un rows y columns per tile por defecto a 256,
530
        // si se prefiere otro asignar los nuevos valores aqu?.
531

    
532
        int completeRows = getGdalDataSet().getRasterYSize();
533
        int completeColumns = getGdalDataSet().getRasterXSize(); //image.columns;
534
        double completePixelSizeX = envelope.getLength(DIMENSIONS.X)/completeColumns;
535
        double completePixelSizeY = envelope.getLength(DIMENSIONS.Y)/completeRows;
536

    
537
        int maximumLength = completeColumns;
538
        int tileMaximumLength = tileStruct.getColumnsPerTile(); //tileSizeX;
539
        double maximumPixelSize = completePixelSizeX;
540

    
541
        if (completeRows * tileStruct.getRowsPerTile() > completeColumns * tileStruct.getColumnsPerTile()) {
542
            maximumLength = completeRows;
543
            tileMaximumLength = tileStruct.getRowsPerTile();
544
            maximumPixelSize = completePixelSizeY;
545
        }
546

    
547
        double pixelSize = maximumPixelSize;
548
        while (maximumLength * maximumPixelSize / pixelSize > tileMaximumLength) {
549
            pixelSizes.add(pixelSize);
550
            pixelSize = pixelSize * 2;
551
        }
552
        pixelSizes.add(pixelSize);
553
        int i = 0;
554
        for (int zoomLevel = pixelSizes.size() - 1; zoomLevel >= 0; zoomLevel--) {
555
            zoomLevels.put(i, pixelSizes.get(zoomLevel));
556
            i++;
557
        }
558
        tileStruct.setEnvelope(this.envelope);
559
        tileStruct.setPixelSizePerZoomLevel(zoomLevels);
560

    
561
        return tileStruct;
562

    
563
    }
564

    
565

    
566

    
567
    @Override
568
    public BufferDimensions getDimensions() throws InitializeException {
569
        if(this.dimensions==null){;
570
        this.dimensions = BufferLocator.getBufferManager().createBufferDimensions(this.gdalDataSet.getRasterYSize(), this.gdalDataSet.getRasterXSize(),  this.envelope);
571
    }
572
    return this.dimensions;
573
}
574

    
575

    
576
}