Statistics
| Revision:

gvsig-raster / org.gvsig.raster / trunk / org.gvsig.raster / org.gvsig.raster.lib / org.gvsig.raster.lib.impl / src / main / java / org / gvsig / raster / impl / store / AbstractRasterDataStore.java @ 1868

History | View | Annotate | Download (36.7 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
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
 */
22
package org.gvsig.raster.impl.store;
23

    
24
import java.awt.geom.Point2D;
25
import java.awt.geom.Rectangle2D;
26
import java.io.File;
27
import java.util.Iterator;
28
import java.util.List;
29
import java.util.Set;
30

    
31
import org.cresques.cts.ICoordTrans;
32
import org.gvsig.fmap.dal.DataManager;
33
import org.gvsig.fmap.dal.DataQuery;
34
import org.gvsig.fmap.dal.DataServerExplorer;
35
import org.gvsig.fmap.dal.DataSet;
36
import org.gvsig.fmap.dal.DataStore;
37
import org.gvsig.fmap.dal.DataStoreParameters;
38
import org.gvsig.fmap.dal.coverage.RasterLibrary;
39
import org.gvsig.fmap.dal.coverage.RasterLocator;
40
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
41
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
42
import org.gvsig.fmap.dal.coverage.datastruct.GeoPointList;
43
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
44
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
45
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
46
import org.gvsig.fmap.dal.coverage.exception.RmfSerializerException;
47
import org.gvsig.fmap.dal.coverage.grid.render.Render;
48
import org.gvsig.fmap.dal.coverage.process.vector.Vectorization;
49
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
50
import org.gvsig.fmap.dal.coverage.store.RasterQuery;
51
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
52
import org.gvsig.fmap.dal.coverage.store.parameter.RasterFileStoreParameters;
53
import org.gvsig.fmap.dal.coverage.store.props.ColorTable;
54
import org.gvsig.fmap.dal.coverage.store.props.TimeSeries;
55
import org.gvsig.fmap.dal.coverage.util.RasterUtils;
56
import org.gvsig.fmap.dal.exception.DataException;
57
import org.gvsig.fmap.dal.exception.InitializeException;
58
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
59
import org.gvsig.fmap.dal.raster.CoverageSelection;
60
import org.gvsig.fmap.dal.raster.CoverageStore;
61
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
62
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProviderServices;
63
import org.gvsig.fmap.dal.resource.Resource;
64
import org.gvsig.fmap.dal.spi.DataStoreInitializer;
65
import org.gvsig.fmap.dal.spi.DataStoreProvider;
66
import org.gvsig.metadata.MetadataLocator;
67
import org.gvsig.metadata.MetadataManager;
68
import org.gvsig.metadata.exceptions.MetadataException;
69
import org.gvsig.raster.cache.tile.Tile;
70
import org.gvsig.raster.cache.tile.exception.TileGettingException;
71
import org.gvsig.raster.impl.DefaultRasterManager;
72
import org.gvsig.raster.impl.buffer.DefaultRasterQuery;
73
import org.gvsig.raster.impl.datastruct.ExtentImpl;
74
import org.gvsig.raster.impl.grid.render.DefaultRender;
75
import org.gvsig.raster.impl.process.vector.PotraceVectorization;
76
import org.gvsig.raster.impl.provider.RasterProvider;
77
import org.gvsig.tools.ToolsLocator;
78
import org.gvsig.tools.dispose.impl.AbstractDisposable;
79
import org.gvsig.tools.dynobject.DelegatedDynObject;
80
import org.gvsig.tools.dynobject.DynClass;
81
import org.gvsig.tools.dynobject.DynObject;
82
import org.gvsig.tools.dynobject.DynObjectManager;
83
import org.gvsig.tools.dynobject.DynStruct;
84
import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException;
85
import org.gvsig.tools.dynobject.exception.DynMethodException;
86
import org.gvsig.tools.exception.BaseException;
87
import org.gvsig.tools.observer.impl.DelegateWeakReferencingObservable;
88
import org.gvsig.tools.undo.command.Command;
89
import org.gvsig.tools.visitor.Visitor;
90

    
91
/**
92
 * Default implementation for RasterDataSource
93
 * 
94
 * @author Nacho Brodin (nachobrodin@gmail.com)
95
 */
96
public abstract class AbstractRasterDataStore extends AbstractDisposable 
97
        implements RasterDataStore, CoverageStoreProviderServices, QueryableRaster, DataStoreInitializer {
98
        public static final String         PERSISTENT_NAME        = "AbstractRasterDataStore_Persistent";
99
    public static final String         PERSISTENT_DESCRIPTION = "AbstractRasterDataStore Persistent";
100
        protected DefaultRasterQuery       currentQuery           = null;
101
        /**
102
         * Lista de paletas asociadas a las bandas cargadas en el DataSource. Estas son calculadas
103
         * en las funciones que asignan las bandas a dibujar (addDrawableBands)
104
         */
105
        private ColorTable[]                           palette                = null;
106
        /**
107
         * Extensi?n de los datos del buffer
108
         */
109
        protected Extent                                   dataExtent             = null;
110
        /**
111
         * Ancho y alto en pixeles del ?ltimo buffer asignado
112
         */
113
        protected double                                nWidth                 = 0;
114
        protected double                                nHeight                = 0;
115
        protected double[]                 step                   = null;
116
        private Buffer                     lastBuffer             = null;
117
        
118
        private DataManager                dataManager            = null;
119
        protected DataStoreParameters      parameters             = null;
120
        private DelegatedDynObject         metadata               = null;
121
        private RasterUtils                util                   = null;
122
        private DelegateWeakReferencingObservable 
123
                                           delegateObservable     = new DelegateWeakReferencingObservable(this);
124
        private Render                     render                 = null;
125
        /**
126
         * Flag que fuerza al buffer de solo lectura
127
         */
128
        protected boolean                  readOnly               = false;
129
        protected ICoordTrans              coordTrans             = null;
130
        
131
        public AbstractRasterDataStore() {
132
                util = RasterLocator.getManager().getRasterUtils();
133
        }
134
        
135
        /*
136
         * (non-Javadoc)
137
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#queryBuffer(org.gvsig.fmap.dal.coverage.store.RasterQuery)
138
         */
139
        public Buffer query(RasterQuery query) throws ProcessInterruptedException, RasterDriverException, InvalidSetViewException {
140
                Object[] obj = queryArray(query);
141
                if(obj != null && obj.length > 0 && obj[0] instanceof Buffer)
142
                        return ((Buffer)obj[0]);
143
                return null;
144
        }
145
        
146

    
147
        /*
148
         * (non-Javadoc)
149
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#query(org.gvsig.fmap.dal.coverage.store.RasterQuery)
150
         */
151
        public Object[] queryArray(RasterQuery query)
152
                        throws ProcessInterruptedException, RasterDriverException,
153
                        InvalidSetViewException {
154
                Object[] result = null;
155
                currentQuery = (DefaultRasterQuery)query;
156
                DefaultRasterQuery q = currentQuery;
157
                
158
                if(q.getDrawableBands() != null)
159
                        setQueryDrawableBands(q.getDrawableBands());
160
                else 
161
                        setQueryAllDrawableBands();
162
                
163
                setMemoryBuffer(q.isMemoryBuffer());
164
                readOnly = q.isReadOnly();
165
                Buffer buf = null;
166
                
167
                //*****************************************
168
                //All data
169
                //*****************************************
170
                if(q.getType() == DefaultRasterQuery.TYPE_ENTIRE) {
171
                        step = null;
172
                        dataExtent = getExtent();
173
                        q.setAreaOfInterest(0, 0, (int)getWidth(), (int)getHeight(), -1, -1);
174
                        q.setAreaOfInterest(); //Vuelve a poner el tipo correcto
175
                        buf = getWindowPx(q);
176
                        buf.setDataExtent(
177
                                        new Rectangle2D.Double(dataExtent.getULX(), dataExtent.getULY() - (dataExtent.getMax().getY() - dataExtent.getMin().getY()), 
178
                                        dataExtent.getMax().getX() - dataExtent.getMin().getX(), 
179
                                        dataExtent.getMax().getY() - dataExtent.getMin().getY()));
180
                }
181
                
182
                //*****************************************
183
                //Real coordinates without resampling
184
                //*****************************************
185
                if(q.getType() == DefaultRasterQuery.TYPE_COORDS) {
186
                        buf = setAreaOfInterestInWC(q);
187
                        buf.setDataExtent(new Rectangle2D.Double(q.getX(), q.getY(), q.getW(), q.getH()));
188
                }
189
                
190
                //*****************************************
191
                //Real coordinates with resampling
192
                //*****************************************
193
                if(q.getType() == DefaultRasterQuery.TYPE_COORDS_SIZE) {
194
                        buf = setAreaOfInterestInWC(q);
195
                        buf.setDataExtent(new Rectangle2D.Double(q.getBBox().getULX(), q.getBBox().getULY(),
196
                                        q.getBBox().getLRX() - q.getBBox().getULX(), q.getBBox().getLRY() - q.getBBox().getULY()));
197
                }
198
                
199
                //*****************************************
200
                //Tiled
201
                //*****************************************
202
                if(q.getType() == DefaultRasterQuery.TYPE_COORDS_SIZE_TILED) {
203
                        step = null;
204
                        dataExtent = new ExtentImpl(q.getBBox().getULX(), q.getBBox().getULY(), 
205
                                                                                q.getBBox().getLRX(), q.getBBox().getLRY());
206
                        ((RasterDataParameters)getParameters()).setAlphaBand(currentQuery.getAlphaBandNumber());
207
                        getWindowTiled(q);
208
                }
209
                
210
                //*****************************************
211
                //Pixel coordinates with and without resampling 
212
                //*****************************************
213
                if(q.getType() == DefaultRasterQuery.TYPE_PX || q.getType() == DefaultRasterQuery.TYPE_PX_SIZE) {
214
                        buf = getWindowPx(q);
215
                }
216
                
217
                result = new Object[]{buf};
218
                
219
                //*****************************************
220
                //Request only one tile
221
                //*****************************************
222
                if(q.getType() == DefaultRasterQuery.TYPE_ONE_TILE) {
223
                        if(isTiled()) {
224
                                try {
225
                                        Tile t = getTile(q);
226
                                        result = t.getData();
227
                                } catch (TileGettingException e) {
228
                                        throw new RasterDriverException("Problems getting the tile", e);
229
                                }
230
                        } else {
231
                                buf = setAreaOfInterestInWC(q);
232
                                buf.setDataExtent(new Rectangle2D.Double(q.getBBox().getULX(), q.getBBox().getULY(), 
233
                                                q.getBBox().getLRX() - q.getBBox().getULX(), q.getBBox().getLRY() - q.getBBox().getULY()));
234
                                result = new Object[]{buf};
235
                        }
236
                }
237
                
238
                if(q.isStoredLastBuffer())
239
                        lastBuffer = buf;
240
                else
241
                        lastBuffer = null;
242
                q.storeLastBuffer(false);
243
                
244
                if(result != null && result.length > 0 && result[0] instanceof Buffer) {
245
                        ((Buffer)result[0]).setStore(this);
246
                        if(getNoDataValue() != null && getNoDataValue().isDefined())
247
                                ((Buffer)result[0]).setNoDataValue(getNoDataValue());
248
                        return result;
249
                }
250
                return null;
251
        }
252
        
253
        /**
254
         * Gets a resampled window of data using world coordinates and buffer size.
255
         * @param q
256
         * @return
257
         */
258
        public abstract Buffer getWindowWithResampling(DefaultRasterQuery q) throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException ;
259
        
260
        /**
261
         * Gets a resampled window of data using world. The buffer size variable will be ignored and the final size will
262
         * be calculated using the pixel size.
263
         * @param q
264
         * @return
265
         */
266
        public abstract Buffer getWindowWithoutResampling(DefaultRasterQuery q) throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException ;
267
        
268
        /**
269
         * Asigna el ?rea de interes en coordenadas del mundo real. Si las coordenadas exceden del tama?o de la imagen
270
         * estas coordenadas son ajustadas el extent.
271
         * @param x Coordenada X, esquina superior izquierda
272
         * @param y Coordenada Y, esquina superior izquierda
273
         * @param w Ancho del ?rea
274
         * @param h Alto del ?rea
275
         * @throws ArrayIndexOutOfBoundsException
276
         * @throws InvalidSetViewException 
277
         */
278
        protected Buffer setAreaOfInterestInWC(DefaultRasterQuery q)
279
                throws RasterDriverException, InvalidSetViewException, ProcessInterruptedException {
280
                if(q.getType() == DefaultRasterQuery.TYPE_COORDS) {
281
                        step = null;
282
                        dataExtent = new ExtentImpl(q.getX(), q.getY(), q.getX() + q.getW(), q.getY() - q.getH());
283
                        Extent adjustedDataExtent = util.calculateAdjustedView(dataExtent, getAffineTransform(), getWidth(), getHeight());
284
                        q.setAreaOfInterest(adjustedDataExtent.getMin().getX(), adjustedDataExtent.getMax().getY(), adjustedDataExtent.width(), adjustedDataExtent.height());
285
                        q.setAdjustToExtent(currentQuery.isAdjustToExtent());
286
                        return getWindowWithoutResampling(q);
287
                }
288
                
289
                if(        q.getType() == DefaultRasterQuery.TYPE_COORDS_SIZE || 
290
                        q.getType() == DefaultRasterQuery.TYPE_ONE_TILE) {
291
                        step = null;
292
                        dataExtent = q.getBBox();//new ExtentImpl(q.getBBox().getULX(), q.getBBox().getULY(), q.getBBox().getLRX(), q.getBBox().getLRY());
293
                        Extent adjustedDataExtent = util.calculateAdjustedView(dataExtent, getAffineTransform(), getWidth(), getHeight());
294

    
295
                        //Caso 3D: La petici?n no se ajusta al ?rea y se rellena el exterior con NoData
296
                        if(!currentQuery.isAdjustToExtent() && !util.isInside(dataExtent, getExtent())) { 
297
                                return requestFillingWithNoData(dataExtent, adjustedDataExtent, q.getBufWidth(), q.getBufHeight());
298
                        }
299
                
300
                        q.setBBox(adjustedDataExtent);
301
                        
302
                        //Esta secci?n es para que no supersamplee el driver y pueda hacerse en el cliente
303
                        if(!currentQuery.isSupersamplingLoadingBuffer()) {
304
                                Point2D p1 = worldToRaster(new Point2D.Double(adjustedDataExtent.getULX(), adjustedDataExtent.getULY()));
305
                                Point2D p2 = worldToRaster(new Point2D.Double(adjustedDataExtent.getLRX(), adjustedDataExtent.getLRY()));
306
                                nWidth = Math.abs(p1.getX() - p2.getX());
307
                                nHeight = Math.abs(p1.getY() - p2.getY());
308

    
309
                                if(q.getBufWidth() > Math.ceil(nWidth) && q.getBufHeight() > Math.ceil(nHeight)) {
310
                                        step = calcSteps(adjustedDataExtent.getULX(), adjustedDataExtent.getULY(), adjustedDataExtent.getLRX(), adjustedDataExtent.getLRY(), nWidth, nHeight, q.getBufWidth(), q.getBufHeight());
311
                                        q.setBufWidth(-1);
312
                                        q.setBufHeight(-1);
313
                                        return  getWindowWC(q);
314
                                }
315
                        }
316
                        q.setAdjustToExtent(true);
317
                        return getWindowWithResampling(q);
318
                }
319
                return null;
320
        }
321
        
322
        /*
323
         * (non-Javadoc)
324
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getAdjustedToExtent(org.gvsig.fmap.dal.coverage.datastruct.Extent)
325
         */
326
        public Extent adjustToExtent(Extent e) {
327
                Extent currentExtent = this.getExtent();
328
        
329
                double minx = e.getMin().getX() < currentExtent.getMin().getX() ? currentExtent.getMin().getX() : e.getMin().getX();
330
                double maxx = e.getMax().getX() > currentExtent.getMax().getX() ? currentExtent.getMax().getX() : e.getMax().getX();
331
                double miny = e.getMin().getY() < currentExtent.getMin().getY() ? currentExtent.getMin().getY() : e.getMin().getY();
332
                double maxy = e.getMax().getY() > currentExtent.getMax().getY() ? currentExtent.getMax().getY() : e.getMax().getY();
333
                
334
                return new ExtentImpl(minx, maxy, maxx, miny);
335
        }
336
        
337
        public String getFullName() {
338
                return getName();
339
        }
340
        
341
        /*
342
         * (non-Javadoc)
343
         * @see org.gvsig.fmap.dal.coverage.buffer.RasterDataSource#getLastBuffer()
344
         */
345
        public Buffer getLastBuffer() {
346
                return lastBuffer;
347
        }
348
        
349
        /*
350
         * (non-Javadoc)
351
         * @see org.gvsig.fmap.dal.coverage.buffer.RasterDataSource#getStep()
352
         */
353
        public double[] getStep() {
354
                return step;
355
        }
356
        
357
        /**
358
         * Para este GeoRasterFile asigna que bandas se pintaran
359
         * sobre el RasterBuf cuando se haga un update. Cada posici?n del vector es una banda
360
         * del rasterBuf y el contenido de esa posici?n es la banda de la imagen que se dibujar?
361
         * sobre ese RasterBuf.
362
         * @param drawableBands        Array con las bandas a dibujar.
363
         * @return array con tantos elementos como bandas a dibujar. El valor contenido es el fichero del
364
         * dataset multifichero al que corresponde la banda.
365
         */
366
        private void setQueryDrawableBands(int[] drawableBands) {
367
                //clearDrawableBands();
368
                setDrawableBands(drawableBands);
369

    
370
                int[] files = new int[drawableBands.length];
371
                palette = new ColorTable[drawableBands.length];
372

    
373
                for(int i = 0; i< drawableBands.length; i++) {
374
                        if(drawableBands[i] < 0 || drawableBands[i] >= getBandCount())
375
                                continue;
376
                        //addDrawableBand(i, drawableBands[i]);
377
                        String fileName = getBands().getBand(drawableBands[i]).getFileName();
378
                        files[i] = getBands().getFileNumber(fileName);
379
                        palette[i] = getColorTable(fileName);
380
                }
381
        }
382
        
383
        /**
384
         * Para este GeoRasterFile asigna que bandas se pintaran
385
         * sobre el RasterBuf cuando se haga un update. Cada posici?n del vector es una banda
386
         * del rasterBuf y el contenido de esa posici?n es la banda de la imagen que se dibujar?
387
         * sobre ese RasterBuf. Esta llamada asigna todas las bandas dibujables en su orden natural.
388
         * @return array con tantos elementos como bandas a dibujar. El valor contenido es el fichero del
389
         * dataset multifichero al que corresponde la banda.
390
         */
391
        public int[] setQueryAllDrawableBands() {
392
                clearDrawableBands();
393
                
394
                int[] list = new int[getBandCount()];
395
                for(int i = 0; i< getBandCount(); i++)
396
                        list[i] = i;
397
                setDrawableBands(list);
398
                
399
                int[] files = new int[getBandCount()];
400
                palette = new ColorTable[getBandCount()];
401

    
402
                for(int i = 0; i< getBandCount(); i++) {
403
                        addDrawableBand(i, i);
404
                        String fileName = getBands().getBand(i).getFileName();
405
                        files[i] = getBands().getFileNumber(fileName);
406
                        palette[i] = getColorTable(fileName);
407
                }
408
                return files;
409
        }
410
        
411
        /**
412
         * M?todo que crea un buffer con la extensi?n que se ha pedido completa y sin ajustar
413
         * a la extensi?n del raster. La zona que tenga informaci?n del raster se rellenara con 
414
         * esta y la que quede vacia se rellenar? con valores NoData. El ancho y alto del buffer corresponden
415
         * a toda la zona solicitada, tanto la que cae dentro como la rellena con Nodata
416
         * 
417
         * @param rasterBuf Buffer de salida.
418
         * @throws InvalidSetViewException 
419
         */
420
        private Buffer requestFillingWithNoData(Extent requestExtent, Extent fitExtent, int bufWidth, int bufHeight) 
421
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
422
                double error = 0.01;
423
                //Upper Left
424
                double distWcX = Math.abs(fitExtent.getMin().getX() - dataExtent.getMin().getX());
425
                distWcX = (distWcX > error) ? distWcX : 0;
426
                double distWcY = Math.abs(fitExtent.getMax().getY() - dataExtent.getMax().getY());
427
                distWcY = (distWcY > error) ? distWcY : 0;
428
                //Pixel inicial del buffer donde se empieza a dibujar. Redondeamos por arriba pq lo que sobra se pone NoData
429
                double initPxX = Math.ceil((distWcX * bufWidth) / requestExtent.width()); 
430
                double initPxY = Math.ceil((distWcY * bufHeight) / requestExtent.height());
431

    
432
                //Lower Right
433
                distWcX = Math.abs(fitExtent.getMax().getX() - dataExtent.getMin().getX());
434
                distWcX = (distWcX > error) ? distWcX : 0;
435
                distWcY = Math.abs(fitExtent.getMin().getY() - dataExtent.getMax().getY());
436
                distWcY = (distWcY > error) ? distWcY : 0;
437
                //Pixel final del buffer donde se dibuja. Redondeamos por abajo pq lo que sobra se pone NoData
438
                double endPxX = Math.floor((distWcX * bufWidth) / requestExtent.width()); 
439
                double endPxY = Math.floor((distWcY * bufHeight) / requestExtent.height());
440

    
441
                int copyX = (int)Math.abs(endPxX - initPxX);
442
                int copyY = (int)Math.abs(endPxY - initPxY);
443

    
444
                DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
445
                q.setBBox(fitExtent);
446
                q.setBufWidth(copyX);
447
                q.setBufHeight(copyY);
448
                q.setAdjustToExtent(true);
449
                Buffer rasterBuf = getWindowWithResampling(q);
450
                
451
                Buffer buf = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], bufWidth, bufHeight, rasterBuf.getBandCount(), true);
452
                buf.setNoDataValue(currentQuery.getNoDataValueToFill());
453
                for(int i = 0; i < buf.getBandCount(); i++) {
454
                        switch(buf.getDataType()) {
455
                        case Buffer.TYPE_BYTE:buf.assign(i, 
456
                                        buf.getNoDataValue().isDefined() ? buf.getNoDataValue().getValue().byteValue() : RasterLibrary.defaultByteNoDataValue);
457
                        break;
458
                        case Buffer.TYPE_SHORT:buf.assign(i, 
459
                                        buf.getNoDataValue().isDefined() ? buf.getNoDataValue().getValue().shortValue() : RasterLibrary.defaultShortNoDataValue);
460
                        break;
461
                        case Buffer.TYPE_INT:buf.assign(i, 
462
                                        buf.getNoDataValue().isDefined() ? buf.getNoDataValue().getValue().intValue() : RasterLibrary.defaultIntegerNoDataValue);
463
                        break;
464
                        case Buffer.TYPE_FLOAT:buf.assign(i, 
465
                                        buf.getNoDataValue().isDefined() ? buf.getNoDataValue().getValue().floatValue() : RasterLibrary.defaultFloatNoDataValue);
466
                        break;
467
                        case Buffer.TYPE_DOUBLE:buf.assign(i, 
468
                                        buf.getNoDataValue().isDefined() ? buf.getNoDataValue().getValue().doubleValue() : RasterLibrary.defaultDoubleNoDataValue);
469
                        break;
470
                        }
471
                }        
472

    
473
                switch(rasterBuf.getDataType()) {
474
                case Buffer.TYPE_BYTE:
475
                        for (int iBand = 0; iBand < rasterBuf.getBandCount(); iBand++)        
476
                                for (int row = 0; row < copyY; row++) 
477
                                        for (int col = 0; col < copyX; col++) 
478
                                                buf.setElem((int)(row + initPxY), (int)(col + initPxX), 
479
                                                                iBand, 
480
                                                                rasterBuf.getElemByte(row, col, iBand));
481
                        break;
482
                case Buffer.TYPE_SHORT:
483
                case Buffer.TYPE_USHORT:
484
                        for (int iBand = 0; iBand < rasterBuf.getBandCount(); iBand++)        
485
                                for (int row = 0; row < copyY; row++) 
486
                                        for (int col = 0; col < copyX; col++) 
487
                                                buf.setElem((int)(row + initPxY), (int)(col + initPxX), 
488
                                                                iBand, 
489
                                                                rasterBuf.getElemShort(row, col, iBand));
490
                        break;
491
                case Buffer.TYPE_INT:
492
                        for (int iBand = 0; iBand < rasterBuf.getBandCount(); iBand++)        
493
                                for (int row = 0; row < copyY; row++) 
494
                                        for (int col = 0; col < copyX; col++) 
495
                                                buf.setElem((int)(row + initPxY), (int)(col + initPxX), 
496
                                                                iBand, 
497
                                                                rasterBuf.getElemInt(row, col, iBand));
498
                        break;
499
                case Buffer.TYPE_FLOAT:
500
                        for (int iBand = 0; iBand < rasterBuf.getBandCount(); iBand++)        
501
                                for (int row = 0; row < copyY; row++) 
502
                                        for (int col = 0; col < copyX; col++) 
503
                                                buf.setElem((int)(row + initPxY), (int)(col + initPxX), 
504
                                                                iBand, 
505
                                                                rasterBuf.getElemFloat(row, col, iBand));
506
                        break;
507
                case Buffer.TYPE_DOUBLE:
508
                        for (int iBand = 0; iBand < rasterBuf.getBandCount(); iBand++)        
509
                                for (int row = 0; row < copyY; row++) 
510
                                        for (int col = 0; col < copyX; col++) 
511
                                                buf.setElem((int)(row + initPxY), (int)(col + initPxX), 
512
                                                                iBand, 
513
                                                                rasterBuf.getElemDouble(row, col, iBand));
514
                        break;
515
                }
516
                return buf;
517
        }
518

    
519
        public TimeSeries getTimeSerials() throws RmfSerializerException {
520
                if(getProvider() instanceof RasterProvider)
521
                        return ((RasterProvider)getProvider()).getTimeSerials();
522
                return null;
523
        }
524

    
525
        public void setTimeSerials(TimeSeries serialInfo) throws RmfSerializerException {
526
                if(getProvider() instanceof RasterProvider)
527
                        ((RasterProvider)getProvider()).setTimeSerials(serialInfo);                        
528
        }
529
        
530
        public abstract void saveColorTableToRmf(ColorTable table) throws RmfSerializerException;
531
        
532
        public abstract void saveGeoPointListToRmf(GeoPointList pointList) throws RmfSerializerException;
533
        
534
        public abstract void saveROIFileListToRmf(List<File> fileList) throws RmfSerializerException;
535
        
536
        /**
537
         * Saves information about serials
538
         * @param object to save
539
         * @throws RmfSerializerException
540
         */
541
        public abstract void saveSerialInfoToRmf(TimeSeries serialInfo) throws RmfSerializerException;
542
        
543
        /**
544
         * Loads information about serials
545
         * @param object to load
546
         * @throws RmfSerializerException
547
         */
548
        public abstract boolean loadSerialInfoFromRmf(TimeSeries serialInfo);
549
        
550
        /*
551
         * (non-Javadoc)
552
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#createVectorizeObject(org.gvsig.fmap.dal.coverage.store.RasterDataStore)
553
         */
554
        public Vectorization createVectorizeObject() throws RasterDriverException, ProcessInterruptedException {
555
                return new PotraceVectorization((RasterDataStore)this);
556
        }
557
        
558
        /*
559
         * (non-Javadoc)
560
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getRender()
561
         */
562
        public Render getRender() {
563
                if(render == null)
564
                        render = new DefaultRender(this);
565
                return render;
566
        }
567
        
568
        /*
569
         * (non-Javadoc)
570
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getRender()
571
         */
572
        public void setRender(Render render) {
573
                this.render = render;
574
        }
575

    
576
        
577
        /*
578
         * (non-Javadoc)
579
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isFileSupported(java.lang.String)
580
         */
581
        public boolean isFileSupported(String fName) {
582
                return RasterLocator.getManager().getProviderServices().isExtensionSupported(fName);
583
        }
584
        
585
        /**
586
         * Registers metadata definition
587
         * @throws MetadataException
588
         */
589
        public static void registerMetadataDefinition() throws MetadataException {
590
                MetadataManager manager = MetadataLocator.getMetadataManager();
591
                
592
                if(manager == null)
593
                        return;
594
                
595
                if( manager.getDefinition(METADATA_DEFINITION_NAME) == null  ) {
596
                        DynStruct defnition = manager.addDefinition(
597
                                        METADATA_DEFINITION_NAME,
598
                                        METADATA_DEFINITION_NAME 
599
                        );
600
                        defnition.extend(
601
                                        MetadataManager.METADATA_NAMESPACE, 
602
                                        DataStore.METADATA_DEFINITION_NAME
603
                        );
604
                }
605
        }
606

    
607
        /*
608
         * (non-Javadoc)
609
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getSourceType()
610
         */
611
        public int getSourceType() {
612
                return ((RasterProvider)getProvider()).getSourceType();
613
        }
614
        
615
    //****************************************************
616
        //****Implementing DataStoreImplementation methods****
617
        //****************************************************
618

    
619
        /*
620
         * (non-Javadoc)
621
         * @see org.gvsig.fmap.dal.impl.DataStoreImplementation#intializePhase1(org.gvsig.fmap.dal.impl.DefaultDataManager, org.gvsig.fmap.dal.DataStoreParameters)
622
         */
623
        public void intializePhase1(DataManager dataManager,
624
                        DataStoreParameters parameters) throws InitializeException {
625
                DynObjectManager dynManager = ToolsLocator.getDynObjectManager();
626

    
627
                this.metadata = (DelegatedDynObject) dynManager
628
                                .createDynObject( 
629
                                                MetadataLocator.getMetadataManager().getDefinition(DataStore.SPATIAL_METADATA_DEFINITION_NAME)
630
                                );
631
                this.dataManager = dataManager;
632
                this.parameters = parameters;
633

    
634
        }
635

    
636
        /*
637
         * (non-Javadoc)
638
         * @see org.gvsig.fmap.dal.impl.DataStoreImplementation#intializePhase2(org.gvsig.fmap.dal.spi.DataStoreProvider)
639
         */
640
        public void intializePhase2(DataStoreProvider provider)
641
                        throws InitializeException {
642
        }
643
        
644
        /* (non-Javadoc)
645
         * @see org.gvsig.fmap.dal.raster.spi.CoverageStoreProviderServices#getManager()
646
         */
647
        public DataManager getManager() {
648
                return this.dataManager;
649
        }        
650

    
651
        //****************************************************
652
        //*********Implementing DataStore methods*************
653
        //****************************************************
654

    
655
        /*
656
         * (non-Javadoc)
657
         * @see org.gvsig.fmap.dal.DataStore#getProviderName()
658
         */
659
        public String getProviderName() {
660
                return getProvider().getFullName();
661
        }
662
        
663
        /*
664
         * (non-Javadoc)
665
         * @see org.gvsig.fmap.dal.DataStore#refresh()
666
         */
667
        public void refresh() throws DataException {
668
                return;
669
        }
670

    
671
        /*
672
         * (non-Javadoc)
673
         * @see org.gvsig.fmap.dal.DataStore#getDataSet()
674
         */
675
        public DataSet getDataSet() throws DataException {
676
                RasterQuery query = DefaultRasterManager.getInstance().createQuery();
677
                query.setSupersamplingLoadingBuffer(false);
678
                query.setAreaOfInterest();
679
                int[] bands = new int[getBandCount()];
680
                for (int i = 0; i < bands.length; i++) {
681
                        bands[i] = i;
682
                }
683
                query.setDrawableBands(bands);
684
                return getDataSet(query);
685
        }
686

    
687
        /*
688
         * (non-Javadoc)
689
         * @see org.gvsig.fmap.dal.DataStore#getDataSet(org.gvsig.fmap.dal.DataQuery)
690
         */
691
        public DataSet getDataSet(DataQuery dataQuery) throws DataException {
692
                if(dataQuery instanceof RasterQuery) {
693
                        Object[] obj = null;
694
                        try {
695
                                obj = queryArray((RasterQuery)dataQuery);
696
                        } catch (ProcessInterruptedException e) {
697
                        } catch (InvalidSetViewException e) {
698
                                throw new RasterDriverException("", e);
699
                        }
700
                        if(obj != null && obj.length > 0 && obj[0] instanceof Buffer)
701
                                return (Buffer)obj[0];
702
                }
703
                return null;
704
        }
705

    
706
        /*
707
         * (non-Javadoc)
708
         * @see org.gvsig.fmap.dal.DataStore#accept(org.gvsig.tools.visitor.Visitor, org.gvsig.fmap.dal.DataQuery)
709
         */
710
        public void accept(Visitor visitor, DataQuery dataQuery)
711
                        throws BaseException {
712
        }
713

    
714
        /*
715
         * (non-Javadoc)
716
         * @see org.gvsig.fmap.dal.DataStore#getDataSet(org.gvsig.tools.observer.Observer)
717
         */
718
        public void getDataSet(org.gvsig.tools.observer.Observer observer) throws DataException {
719
                RasterQuery query = DefaultRasterManager.getInstance().createQuery();
720
                query.setSupersamplingLoadingBuffer(false);
721
                query.setAreaOfInterest();
722
                int[] bands = new int[getBandCount()];
723
                for (int i = 0; i < bands.length; i++) {
724
                        bands[i] = i;
725
                }
726
                query.setDrawableBands(bands);
727
                getDataSet(query, observer);
728
        }
729

    
730
        /*
731
         * (non-Javadoc)
732
         * @see org.gvsig.fmap.dal.DataStore#getDataSet(org.gvsig.fmap.dal.DataQuery, org.gvsig.tools.observer.Observer)
733
         */
734
        public void getDataSet(DataQuery dataQuery, org.gvsig.tools.observer.Observer observer) throws DataException {
735
                if(dataQuery instanceof RasterQuery) {
736
                        Object[] obj = null;
737
                        try {
738
                                obj = queryArray((RasterQuery)dataQuery);
739
                        } catch (ProcessInterruptedException e) {
740
                        } catch (InvalidSetViewException e) {
741
                                throw new RasterDriverException("", e);
742
                        }
743
                        if(obj != null && obj.length > 0 && obj[0] instanceof Buffer)
744
                                observer.update(this, obj[0]);
745
                }
746
        }
747

    
748
        /*
749
         * (non-Javadoc)
750
         * @see org.gvsig.fmap.dal.DataStore#getSelection()
751
         */
752
        public DataSet getSelection() throws DataException {
753
                return null;
754
        }
755

    
756
        /*
757
         * (non-Javadoc)
758
         * @see org.gvsig.fmap.dal.DataStore#setSelection(org.gvsig.fmap.dal.DataSet)
759
         */
760
        public void setSelection(DataSet selection) throws DataException {
761
        }
762

    
763
        /*
764
         * (non-Javadoc)
765
         * @see org.gvsig.fmap.dal.DataStore#createSelection()
766
         */
767
        public DataSet createSelection() throws DataException {
768
                return null;
769
        }
770

    
771
        /*
772
         * (non-Javadoc)
773
         * @see org.gvsig.fmap.dal.DataStore#getChildren()
774
         */
775
        @SuppressWarnings("unchecked")
776
        public Iterator getChildren() {
777
                return null;
778
        }
779

    
780
        /*
781
         * (non-Javadoc)
782
         * @see org.gvsig.fmap.dal.DataStore#getExplorer()
783
         */
784
        public DataServerExplorer getExplorer() throws DataException, ValidateDataParametersException {
785
                return null;
786
        }
787
        
788
        /*
789
         * (non-Javadoc)
790
         * @see org.gvsig.fmap.dal.DataStore#createQuery()
791
         */
792
        public DataQuery createQuery() {
793
                return new DefaultRasterQuery();
794
        }
795
        
796
        //****************************************************
797
        //*********Implementing Metadata methods*************
798
        //****************************************************
799
        
800
    /*
801
     * (non-Javadoc)
802
     * @see org.gvsig.metadata.Metadata#getMetadataID()
803
     */
804
    public Object getMetadataID() {
805
            if(parameters != null && parameters instanceof RasterFileStoreParameters)
806
                    return ((RasterFileStoreParameters)parameters).getFile();
807
            if(parameters != null && parameters instanceof RasterDataParameters)
808
                    return ((RasterDataParameters)parameters).getURI();
809
            return null;
810
    }
811

    
812
   /*
813
    * (non-Javadoc)
814
    * @see org.gvsig.metadata.Metadata#getMetadataChildren()
815
    */
816
    @SuppressWarnings("unchecked")
817
        public Set getMetadataChildren() {
818
            return null;
819
    }
820
    
821
    //****************************************************
822
        //*********Implementing Disposable methods************
823
        //****************************************************
824
    
825
    /*
826
     * (non-Javadoc)
827
     * @see org.gvsig.tools.dispose.impl.AbstractDisposable#doDispose()
828
     */
829
    public void doDispose() {
830
            
831
    }
832
    
833
    //****************************************************
834
        //*********Implementing Visitable methods*************
835
        //****************************************************
836
    
837
    /*
838
     * (non-Javadoc)
839
     * @see org.gvsig.tools.visitor.Visitable#accept(org.gvsig.tools.visitor.Visitor)
840
     */
841
    public void accept(Visitor visitor) throws BaseException {
842
            
843
    }
844
    
845
    //****************************************************
846
        //****Implementing ComplexObservable methods**********
847
        //****************************************************
848
    
849
   /*
850
    * (non-Javadoc)
851
    * @see org.gvsig.tools.observer.ComplexObservable#disableNotifications()
852
    */
853
    public void disableNotifications() {
854
                
855
        }
856

    
857
        /*
858
         * (non-Javadoc)
859
         * @see org.gvsig.tools.observer.ComplexObservable#enableNotifications()
860
         */
861
    public void enableNotifications() {
862
                
863
        }
864

    
865
        /*
866
         * (non-Javadoc)
867
         * @see org.gvsig.tools.observer.ComplexObservable#beginComplexNotification()
868
         */
869
    public void beginComplexNotification() {
870
                
871
        }
872

    
873
        /*
874
         * (non-Javadoc)
875
         * @see org.gvsig.tools.observer.ComplexObservable#endComplexNotification()
876
         */
877
    public void endComplexNotification() {
878
                
879
        }
880
    
881
    //****************************************************
882
        //********Implementing Observable methods*************
883
        //****************************************************
884
    
885
    /*
886
     * (non-Javadoc)
887
     * @see org.gvsig.tools.observer.Observable#addObserver(org.gvsig.tools.observer.Observer)
888
     */
889
        public void addObserver(org.gvsig.tools.observer.Observer o) {
890
                
891
        }
892

    
893
        /*
894
         * (non-Javadoc)
895
         * @see org.gvsig.tools.observer.Observable#deleteObserver(org.gvsig.tools.observer.Observer)
896
         */
897
        public void deleteObserver(org.gvsig.tools.observer.Observer o) {
898
                
899
        }
900

    
901
        /*
902
         * (non-Javadoc)
903
         * @see org.gvsig.tools.observer.Observable#deleteObservers()
904
         */
905
        public void deleteObservers() {
906
                
907
        }
908
        
909
    //****************************************************
910
        //********Implementing DynObject methods*************
911
        //****************************************************
912
        
913
        /*
914
         * (non-Javadoc)
915
         * @see org.gvsig.tools.dynobject.DynObject#getDynClass()
916
         */
917
        public DynClass getDynClass() {
918
                return this.metadata.getDynClass();
919
        }
920

    
921
        /*
922
         * (non-Javadoc)
923
         * @see org.gvsig.tools.dynobject.DynObject#implement(org.gvsig.tools.dynobject.DynClass)
924
         */
925
        public void implement(DynClass dynClass) {
926
                this.metadata.implement(dynClass);
927
    }
928

    
929
        /*
930
         * (non-Javadoc)
931
         * @see org.gvsig.tools.dynobject.DynObject#delegate(org.gvsig.tools.dynobject.DynObject)
932
         */
933
        public void delegate(DynObject dynObject) {
934
                this.metadata.delegate(dynObject);
935
    }
936

    
937
        /*
938
         * (non-Javadoc)
939
         * @see org.gvsig.tools.dynobject.DynObject#getDynValue(java.lang.String)
940
         */
941
        public Object getDynValue(String name)  throws DynFieldNotFoundException {
942
                return this.metadata.getDynValue(name);
943
        }
944

    
945
        /*
946
         * (non-Javadoc)
947
         * @see org.gvsig.tools.dynobject.DynObject#setDynValue(java.lang.String, java.lang.Object)
948
         */
949
        public void setDynValue(String name, Object value)  throws DynFieldNotFoundException {
950
                this.metadata.setDynValue(name, value);
951
    }
952

    
953
        /*
954
         * (non-Javadoc)
955
         * @see org.gvsig.tools.dynobject.DynObject#hasDynValue(java.lang.String)
956
         */
957
        public boolean hasDynValue(String name) {
958
                return this.metadata.hasDynValue(name);
959
        }
960

    
961
        /*
962
         * (non-Javadoc)
963
         * @see org.gvsig.tools.dynobject.DynObject#invokeDynMethod(java.lang.String, org.gvsig.tools.dynobject.DynObject)
964
         */
965
        public Object invokeDynMethod(String name, DynObject context) throws DynMethodException {
966
                return this.metadata.invokeDynMethod(this, name, context);
967
        }
968

    
969
        /*
970
         * (non-Javadoc)
971
         * @see org.gvsig.tools.dynobject.DynObject#invokeDynMethod(int, org.gvsig.tools.dynobject.DynObject)
972
         */
973
        public Object invokeDynMethod(int code, DynObject context) throws DynMethodException {
974
                return this.metadata.invokeDynMethod(this, code, context);
975
        }
976

    
977
        /*
978
         * (non-Javadoc)
979
         * @see org.gvsig.tools.dynobject.DynObject#clear()
980
         */
981
        public void clear() {
982
                if (metadata != null) {
983
                        metadata.clear();
984
                }
985
    }
986
        
987
        /*
988
         * (non-Javadoc)
989
         * @see org.gvsig.fmap.dal.DataStore#getParameters()
990
         */
991
        public DataStoreParameters getParameters() {
992
                return parameters;
993
        }
994
        
995
        //***********************************************************************
996
        //********Implementing CoverageStoreProviderServices methods*************
997
        //***********************************************************************
998

    
999
        public CoverageSelection createDefaultCoverageSelection()
1000
        throws DataException {
1001
                return null;
1002
        }
1003

    
1004
        /*
1005
         * (non-Javadoc)
1006
         * @see org.gvsig.fmap.dal.raster.spi.CoverageStoreProviderServices#getCoverageStore()
1007
         */
1008
        public CoverageStore getCoverageStore() {
1009
                return this;
1010
        }
1011

    
1012
        /*
1013
         * (non-Javadoc)
1014
         * @see org.gvsig.fmap.dal.raster.spi.CoverageStoreProviderServices#getProvider()
1015
         */
1016
        public abstract CoverageStoreProvider getProvider();
1017

    
1018
        /*
1019
         * (non-Javadoc)
1020
         * @see org.gvsig.fmap.dal.raster.spi.CoverageStoreProviderServices#notifyChange(java.lang.String)
1021
         */
1022
        public void notifyChange(String notification) {
1023
                delegateObservable
1024
                .notifyObservers(new DefaultCoverageStoreNotification(
1025
                                this, notification));
1026
        }
1027

    
1028
        /*
1029
         * (non-Javadoc)
1030
         * @see org.gvsig.fmap.dal.raster.spi.CoverageStoreProviderServices#notifyChange(java.lang.String, org.gvsig.fmap.dal.resource.Resource)
1031
         */
1032
        public void notifyChange(String arg0, Resource arg1) {
1033
                /*delegateObservable.notifyObservers(new DefaultFeatureStoreNotification(
1034
                                this, FeatureStoreNotification.RESOURCE_CHANGED));*/
1035
        }
1036

    
1037
        /*
1038
         * (non-Javadoc)
1039
         * @see org.gvsig.fmap.dal.raster.spi.CoverageStoreProviderServices#notifyChange(java.lang.String, org.gvsig.tools.undo.command.Command)
1040
         */
1041
        public void notifyChange(String notification, Command command) {
1042
                delegateObservable
1043
                .notifyObservers(new DefaultCoverageStoreNotification(
1044
                                this, notification, command));
1045
        }
1046

    
1047
        /*
1048
         * (non-Javadoc)
1049
         * @see org.gvsig.fmap.dal.spi.DataStoreProviderServices#getStore()
1050
         */
1051
        public DataStore getStore() {
1052
                return this;
1053
        }
1054
        
1055
        public void setCoordTrans(ICoordTrans t) {
1056
                this.coordTrans = t;
1057
        }
1058
        
1059
        public void close() {
1060
                if(lastBuffer != null) {
1061
                        lastBuffer.dispose();
1062
                }
1063
        }
1064
        
1065
        /*
1066
         * (non-Javadoc)
1067
         * @see java.lang.Object#finalize()
1068
         */
1069
        protected void finalize() throws Throwable {
1070
                currentQuery           = null;
1071
                if(palette != null) {
1072
                        for (int i = 0; i < palette.length; i++) {
1073
                                palette[i] = null;
1074
                        }
1075
                        palette = null;
1076
                }
1077
                dataExtent             = null;
1078
                step                   = null;
1079
                lastBuffer             = null;
1080
                dataManager            = null;
1081
                parameters             = null;
1082
                metadata               = null;
1083
                util                   = null;
1084
                delegateObservable     = null;
1085
                render                 = null;
1086
                super.finalize();
1087
        }
1088
}