Statistics
| Revision:

gvsig-raster / org.gvsig.raster.gdal / trunk / org.gvsig.raster.gdal / org.gvsig.raster.gdal.io / src / main / java / org / gvsig / raster / memory / io / MemoryRasterProvider.java @ 488

History | View | Annotate | Download (30.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.memory.io;
23

    
24
import java.awt.geom.AffineTransform;
25
import java.awt.geom.Point2D;
26
import java.awt.geom.Rectangle2D;
27

    
28
import org.cresques.cts.ICoordTrans;
29
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
30
import org.gvsig.fmap.dal.coverage.datastruct.BandList;
31
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
32
import org.gvsig.fmap.dal.coverage.exception.BandAccessException;
33
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
34
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
35
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
36
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
37
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
38
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
39
import org.gvsig.metadata.MetadataLocator;
40
import org.gvsig.raster.cache.tile.provider.TileListener;
41
import org.gvsig.raster.cache.tile.provider.TileServer;
42
import org.gvsig.raster.impl.datastruct.ExtentImpl;
43
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
44
import org.gvsig.raster.impl.provider.RasterProvider;
45
import org.gvsig.raster.impl.store.AbstractRasterDataParameters;
46
import org.gvsig.raster.impl.store.properties.DataStoreTransparency;
47
import org.gvsig.tools.ToolsLocator;
48

    
49
/**
50
 * Driver para datos cargados en un objeto IBuffer
51
 * @author Nacho Brodin (nachobrodin@gmail.com)
52
 *
53
 */
54
public class MemoryRasterProvider extends DefaultRasterProvider {
55
        public static String        NAME                     = "Gdal Store";
56
        public static String        DESCRIPTION              = "Gdal Raster file";
57
        public static final String  METADATA_DEFINITION_NAME = "GdalStore";
58
        
59
        private Extent              v                        = null;
60
        protected Buffer            buffer                   = null;
61
        private Extent                         extent                   = null;
62
        private boolean             open                     = false;
63
        
64
        /**
65
         * Estado de transparencia del raster.
66
         */
67
        protected DataStoreTransparency   fileTransparency = null;
68

    
69
        public static void register() {
70
        }
71
        
72
        /*
73
         * (non-Javadoc)
74
         * @see org.gvsig.raster.impl.provider.RasterProvider#registerTileProviderFormats(java.lang.Class)
75
         */
76
        public void registerTileProviderFormats(Class<RasterProvider> c) {
77
                
78
        }
79
        
80
        /**
81
         * Mandatory constructor to instantiate an empty provider
82
         */
83
        public MemoryRasterProvider() {}
84

    
85
        /**
86
         * Constructor. Asigna el buffer de datos y la extensi?n
87
         * @param proj Proyecci?n
88
         * @param buf Buffer
89
         * @throws NotSupportedExtensionException
90
         */
91
        public MemoryRasterProvider(AbstractRasterDataParameters params,
92
                        DataStoreProviderServices storeServices) throws NotSupportedExtensionException {
93
                super(params, storeServices, ToolsLocator.getDynObjectManager()
94
                                .createDynObject(
95
                                                MetadataLocator.getMetadataManager().getDefinition(
96
                                                                METADATA_DEFINITION_NAME)));
97
                setParam(storeServices, params);
98
                if(!(params instanceof MemoryDataParameters))
99
                        throw new NotSupportedExtensionException("Buffer not supported");
100

    
101
                extent = ((MemoryDataParameters)params).getExtent();
102
                this.buffer = ((MemoryDataParameters)params).getBuffer();
103

    
104
                if(extent != null) {
105
                        double psX = (extent.maxX() - extent.minX()) / buffer.getWidth();
106
                        double psY = (extent.minY() - extent.maxY()) / buffer.getHeight();
107
                        ownTransformation = new AffineTransform(psX, 0, 0, psY, extent.minX(), extent.maxY());
108
                } else
109
                        ownTransformation = new AffineTransform(1, 0, 0, -1, 0, buffer.getHeight());
110

    
111
                if(buffer == null)
112
                        throw new NotSupportedExtensionException("Buffer invalid");
113

    
114
                load();
115
                bandCount = buffer.getBandCount();
116

    
117
                //Obtenemos el tipo de dato de gdal y lo convertimos el de RasterBuf
118
                int[] dt = new int[buffer.getBandCount()];
119
                for (int i = 0; i < dt.length; i++)
120
                        dt[i] = buffer.getDataType();
121
                setDataType(dt);
122
                open = true;
123
        }
124

    
125
        /*
126
         *  (non-Javadoc)
127
         * @see org.gvsig.raster.dataset.GeoInfo#load()
128
         */
129
        public RasterProvider load() {
130
                return this;
131
        }
132
        
133
        /*
134
         * (non-Javadoc)
135
         * @see org.gvsig.raster.impl.provider.RasterProvider#isOpen()
136
         */
137
        public boolean isOpen() {
138
                return open;
139
        }
140

    
141
        /*
142
         *  (non-Javadoc)
143
         * @see org.gvsig.raster.dataset.GeoInfo#close()
144
         */
145
        public void close() {
146
                buffer = null;
147
                open = false;
148
        }
149

    
150
        /**
151
         * Asigna el extent de la vista actual.
152
         */
153
        public void setView(Extent e) {
154
                v = e;
155
        }
156

    
157
        /**
158
         * Obtiene extent de la vista actual
159
         */
160
        public Extent getView() {
161
                return v;
162
        }
163

    
164
        /**
165
         * Obtiene la anchura del fichero
166
         */
167
        public double getWidth() {
168
                return buffer.getWidth();
169
        }
170

    
171
        /**
172
         * Obtiene la altura del fichero
173
         */
174
        public double getHeight() {
175
                return buffer.getHeight();
176
        }
177

    
178
        /*
179
         *  (non-Javadoc)
180
         * @see org.cresques.geo.Projected#reProject(org.cresques.cts.ICoordTrans)
181
         */
182
        public void reProject(ICoordTrans rp) {
183
        }
184

    
185
        /**
186
         * Obtiene la orientaci?n de la imagen a partir del signo del tama?o de pixel para poder
187
         * asignarlo en el setView. Esto es util para poder conocer como debe leerse la image,
188
         * de abajo a arriba, de arriba a abajo, de izquierda a derecha o de derecha a izquierda.
189
         * La posici?n habitual es la que el pixel size en X es positivo y en Y negativo leyendose
190
         * en este caso las X de menor a mayor y las Y de mayor a menor. Los casos posibles son:
191
         * <UL>
192
         * <LI><B>X > 0; Y < 0;</B> {true, false}</LI>
193
         * <LI><B>X > 0; Y > 0;</B> {true, true}</LI>
194
         * <LI><B>X < 0; Y > 0;</B> {false, true}</LI>
195
         * <LI><B>X < 0; Y < 0;</B> {false, false}</LI>
196
         * </UL>
197
         *
198
         * @return
199
         */
200
        /*private boolean[] getOrientation(){
201
                boolean[] orientation = {true, false};
202
                return orientation;
203
        }*/
204

    
205
        /* (non-Javadoc)
206
         * @see org.cresques.io.GeoRasterFile#getData(int, int, int)
207
         */
208
        public Object getData(int x, int y, int band) {
209
                if(buffer.getDataType() == Buffer.TYPE_BYTE){
210
                        return new Integer(buffer.getElemByte(y, x, band));
211
                }else if(buffer.getDataType() == Buffer.TYPE_SHORT){
212
                        return new Integer(buffer.getElemShort(y, x, band));
213
                }else if(buffer.getDataType() == Buffer.TYPE_INT){
214
                        return new Integer(buffer.getElemInt(y, x, band));
215
                }else if(buffer.getDataType() == Buffer.TYPE_FLOAT){
216
                        return new Float(buffer.getElemFloat(y, x, band));
217
                }else if(buffer.getDataType() == Buffer.TYPE_DOUBLE){
218
                        return new Double(buffer.getElemDouble(y, x, band));
219
                }
220
                return null;
221
        }
222

    
223

    
224
        /**
225
         * Devuelve el tama?o de bloque
226
         * @return Tama?o de bloque
227
         */
228
        public int getBlockSize(){
229
                return 0;
230
        }
231

    
232
        /**
233
         * Obtiene el flag que dice si la imagen est? o no georreferenciada
234
         * @return true si est? georreferenciada y false si no lo est?.
235
         */
236
        public boolean isGeoreferenced() {
237
                return (this.extent != null);
238
        }
239

    
240
        /**
241
         * Informa de si el driver ha supersampleado en el ?ltimo dibujado. Es el driver el que colocar?
242
         * el valor de esta variable cada vez que dibuja.
243
         * @return true si se ha supersampleado y false si no se ha hecho.
244
         */
245
        public boolean isSupersampling() {
246
                return false;
247
        }
248

    
249
        /**
250
         * @return Returns the dataType.
251
         */
252
        public int[] getDataType() {
253
                int[] dt = new int[buffer.getBandCount()];
254
                for (int i = 0; i < dt.length; i++)
255
                        dt[i] = buffer.getDataType();
256
                return dt;
257
        }
258

    
259
        /**
260
         * Ajusta los puntos pasados por par?metro a los l?mites del buffer. Es decir si alguno excede
261
         * los l?mites por arriba o por abajo los ajusta.
262
         * @param begin Punto inicial
263
         * @param end Punto final
264
         */
265
        private void adjustPointsToBufferLimits(Point2D begin, Point2D end) {
266
                if(begin.getX() < 0)
267
                        begin.setLocation(0, begin.getY());
268
                if(begin.getY() > buffer.getHeight())
269
                        begin.setLocation(begin.getX(), buffer.getHeight());
270
                if(end.getY() < 0)
271
                        end.setLocation(begin.getX(), 0);
272
                if(end.getX() > buffer.getWidth())
273
                        begin.setLocation(buffer.getWidth(), begin.getY());
274
        }
275
        
276
        /*
277
         * (non-Javadoc)
278
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(org.gvsig.fmap.dal.coverage.datastruct.Extent, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.raster.cache.tile.provider.TileListener)
279
         */
280
        public void getWindow(Extent ex, int bufWidth, int bufHeight, 
281
                        BandList bandList, TileListener listener) throws ProcessInterruptedException, RasterDriverException {
282
                 
283
        }
284

    
285
        /*
286
         * (non-Javadoc)
287
         * @see org.gvsig.raster.dataset.RasterDataset#getWindowRaster(double, double, double, double, org.gvsig.raster.dataset.BandList, org.gvsig.raster.dataset.Buffer)
288
         */
289
        public Buffer getWindow(Extent ex, BandList bandList, Buffer rasterBuf) {
290
                Point2D begin = worldToRaster(new Point2D.Double(ex.getULX(), ex.getULY()));
291
                Point2D end = worldToRaster(new Point2D.Double(ex.getLRX(), ex.getLRY()));
292
                setView(ex);
293

    
294
                adjustPointsToBufferLimits(begin, end);
295

    
296
                switch(buffer.getDataType()){
297
                case Buffer.TYPE_BYTE: writeByteBuffer(rasterBuf, 1, 1, begin, bandList); break;
298
                case Buffer.TYPE_SHORT: writeShortBuffer(rasterBuf, 1, 1, begin, bandList); break;
299
                case Buffer.TYPE_INT: writeIntBuffer(rasterBuf, 1, 1, begin, bandList); break;
300
                case Buffer.TYPE_FLOAT: writeFloatBuffer(rasterBuf, 1, 1, begin, bandList); break;
301
                case Buffer.TYPE_DOUBLE: writeDoubleBuffer(rasterBuf, 1, 1, begin, bandList); break;
302
                }
303
                return rasterBuf;
304
        }
305

    
306
        /*
307
         *  (non-Javadoc)
308
         * @see org.gvsig.raster.dataset.RasterDataset#getWindowRaster(double, double, double, double, org.gvsig.raster.dataset.BandList, org.gvsig.raster.dataset.Buffer, boolean)
309
         */
310
        public Buffer getWindow(double x, double y, double w, double h, 
311
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent) {
312
                Point2D begin = worldToRaster(new Point2D.Double(x, y));
313
                Point2D end = worldToRaster(new Point2D.Double(x + w, y - h));
314
                setView(new ExtentImpl(x, y, x + w, y - h));
315

    
316
                adjustPointsToBufferLimits(begin, end);
317

    
318
                switch(buffer.getDataType()){
319
                case Buffer.TYPE_BYTE: writeByteBuffer(rasterBuf, 1, 1, begin, bandList); break;
320
                case Buffer.TYPE_SHORT: writeShortBuffer(rasterBuf, 1, 1, begin, bandList); break;
321
                case Buffer.TYPE_INT: writeIntBuffer(rasterBuf, 1, 1, begin, bandList); break;
322
                case Buffer.TYPE_FLOAT: writeFloatBuffer(rasterBuf, 1, 1, begin, bandList); break;
323
                case Buffer.TYPE_DOUBLE: writeDoubleBuffer(rasterBuf, 1, 1, begin, bandList); break;
324
                }
325
                return rasterBuf;
326
        }
327

    
328
        /*
329
         *  (non-Javadoc)
330
         * @see org.gvsig.raster.dataset.RasterDataset#getWindowRaster(double, double, double, double, int, int, org.gvsig.raster.dataset.BandList, org.gvsig.raster.dataset.Buffer, boolean)
331
         */
332
        public Buffer getWindow(Extent extent, 
333
                        int bufWidth, int bufHeight, BandList bandList, Buffer rasterBuf, boolean adjustToExtent) {
334
                Point2D begin = worldToRaster(new Point2D.Double(extent.getMin().getX(), extent.getMax().getY()));
335
                Point2D end = worldToRaster(new Point2D.Double(extent.getMax().getX(), extent.getMin().getY()));
336
                setView(extent);
337

    
338
                adjustPointsToBufferLimits(begin, end);
339

    
340
                //Ancho y alto en pixels (double) del area seleccionada.
341
                double w = Math.abs(end.getX() - begin.getX());
342
                double h = Math.abs(end.getY() - begin.getY());
343

    
344
                //Relaci?n entre el n?mero de pixels del buffer origen (area seleccionada) y el destino
345
                double stepX = w / ((double)bufWidth);
346
                double stepY = h / ((double)bufHeight);
347

    
348
                //Escritura separada en 5 llamadas para mejorar el rendimiento
349
                switch(buffer.getDataType()){
350
                case Buffer.TYPE_BYTE: writeByteBuffer(rasterBuf, stepX, stepY, begin, bandList); break;
351
                case Buffer.TYPE_SHORT: writeShortBuffer(rasterBuf, stepX, stepY, begin, bandList); break;
352
                case Buffer.TYPE_INT: writeIntBuffer(rasterBuf, stepX, stepY, begin, bandList); break;
353
                case Buffer.TYPE_FLOAT: writeFloatBuffer(rasterBuf, stepX, stepY, begin, bandList); break;
354
                case Buffer.TYPE_DOUBLE: writeDoubleBuffer(rasterBuf, stepX, stepY, begin, bandList); break;
355
                }
356

    
357
                /*int xPx = 0, yPx = 0;
358
                for (int iBand = 0; iBand < rasterBuf.getBandCount(); iBand++) {
359
                        yPx = 0;
360
                        for(double row = begin.getY(); yPx < bufHeight; row += stepY) {
361
                                xPx = 0;
362
                                for(double col = begin.getX(); xPx < bufWidth; col += stepX) {
363
                                        switch(buffer.getDataType()){
364
                                        case Buffer.TYPE_BYTE: rasterBuf.setElem(yPx, xPx, iBand, buffer.getElemByte((int)row, (int)col, iBand)); break;
365
                                        case Buffer.TYPE_SHORT: rasterBuf.setElem(yPx, xPx, iBand, buffer.getElemShort((int)row, (int)col, iBand)); break;
366
                                        case Buffer.TYPE_INT: rasterBuf.setElem(yPx, xPx, iBand, buffer.getElemInt((int)row, (int)col, iBand)); break;
367
                                        case Buffer.TYPE_FLOAT: rasterBuf.setElem(yPx, xPx, iBand, buffer.getElemFloat((int)row, (int)col, iBand)); break;
368
                                        case Buffer.TYPE_DOUBLE: rasterBuf.setElem(yPx, xPx, iBand, buffer.getElemDouble((int)row, (int)col, iBand)); break;
369
                                        }
370
                                        xPx ++;
371
                                }
372
                                yPx ++;
373
                        }
374
                }*/
375
                return rasterBuf;
376
        }
377

    
378
        /**
379
         * Escribe sobre el buffer pasado por par?metro los valores solicitados, desde el buffer de la clase. Los valores
380
         * se solicitan a trav?s de los par?metros. En ellos se especifica el tama?o del buffer de destino, las bandas a
381
         * escribir, el punto inicial en coordenadas pixel (double) y el incremento.
382
         * @param rasterBuf Buffer donde se escriben los datos
383
         * @param stepX Incremento en X. Cada vez que se escribe un pixel en X se incrementa el contador en stepX pixels. Esto es necesario
384
         * ya que el buffer destino no tiene porque tener el mismo ancho que el de origen. Este valor suele ser ancho_buffer_origen / ancho_buffer_destino.
385
         * @param stepY Incremento en Y. Cada vez que se escribe un pixel en Y se incrementa el contador en stepY pixels. Esto es necesario
386
         * ya que el buffer destino no tiene porque tener el mismo alto que el de origen. Este valor suele ser alto_buffer_origen / alto_buffer_destino.
387
         * @param begin pixel donde se comienza a leer en el buffer de origen. Este valor es decimal ya que no tiene porque empezar a leerse al principio
388
         * del pixel. Esto es util cuando se supersamplea.
389
         */
390
        private void writeByteBuffer(Buffer rasterBuf, double stepX, double stepY, Point2D begin, BandList bandList) {
391
                int xPx = 0, yPx = 0;
392
                for (int iBand = 0; iBand < buffer.getBandCount(); iBand++) {
393
                        int[] drawableBands = bandList.getBufferBandToDraw(this.getFName(), iBand);
394
                        if(drawableBands == null || (drawableBands.length == 1 && drawableBands[0] == -1))
395
                                continue;
396
                        for(int drawBands = 0; drawBands < drawableBands.length; drawBands++) {
397
                                yPx = 0;
398
                                for(double row = begin.getY(); (yPx < rasterBuf.getHeight() && row < buffer.getHeight()); row += stepY) {
399
                                        xPx = 0;
400
                                        for(double col = begin.getX(); (xPx < rasterBuf.getWidth() && col < buffer.getWidth()); col += stepX) {
401
                                                rasterBuf.setElem(yPx, xPx, iBand, buffer.getElemByte((int)row, (int)col, iBand));
402
                                                xPx ++;
403
                                        }
404
                                        yPx ++;
405
                                }
406
                        }
407
                }
408
        }
409

    
410
        /**
411
         * Escribe sobre el buffer pasado por par?metro los valores solicitados, desde el buffer de la clase. Los valores
412
         * se solicitan a trav?s de los par?metros. En ellos se especifica el tama?o del buffer de destino, las bandas a
413
         * escribir, el punto inicial en coordenadas pixel (double) y el incremento.
414
         * @param rasterBuf Buffer donde se escriben los datos
415
         * @param stepX Incremento en X. Cada vez que se escribe un pixel en X se incrementa el contador en stepX pixels. Esto es necesario
416
         * ya que el buffer destino no tiene porque tener el mismo ancho que el de origen. Este valor suele ser ancho_buffer_origen / ancho_buffer_destino.
417
         * @param stepY Incremento en Y. Cada vez que se escribe un pixel en Y se incrementa el contador en stepY pixels. Esto es necesario
418
         * ya que el buffer destino no tiene porque tener el mismo alto que el de origen. Este valor suele ser alto_buffer_origen / alto_buffer_destino.
419
         * @param begin pixel donde se comienza a leer en el buffer de origen. Este valor es decimal ya que no tiene porque empezar a leerse al principio
420
         * del pixel. Esto es util cuando se supersamplea.
421
         */
422
        private void writeShortBuffer(Buffer rasterBuf, double stepX, double stepY, Point2D begin, BandList bandList) {
423
                int xPx = 0, yPx = 0;
424
                for (int iBand = 0; iBand < buffer.getBandCount(); iBand++) {
425
                        int[] drawableBands = bandList.getBufferBandToDraw(this.getFName(), iBand);
426
                        if(drawableBands == null || (drawableBands.length == 1 && drawableBands[0] == -1))
427
                                continue;
428
                        for(int drawBands = 0; drawBands < drawableBands.length; drawBands++) {
429
                                yPx = 0;
430
                                for(double row = begin.getY(); yPx < rasterBuf.getHeight(); row += stepY) {
431
                                        xPx = 0;
432
                                        for(double col = begin.getX(); xPx < rasterBuf.getWidth(); col += stepX) {
433
                                                rasterBuf.setElem(yPx, xPx, iBand, buffer.getElemShort((int)row, (int)col, iBand));
434
                                                xPx ++;
435
                                        }
436
                                        yPx ++;
437
                                }
438
                        }
439
                }
440
        }
441

    
442
        /**
443
         * Escribe sobre el buffer pasado por par?metro los valores solicitados, desde el buffer de la clase. Los valores
444
         * se solicitan a trav?s de los par?metros. En ellos se especifica el tama?o del buffer de destino, las bandas a
445
         * escribir, el punto inicial en coordenadas pixel (double) y el incremento.
446
         * @param rasterBuf Buffer donde se escriben los datos
447
         * @param stepX Incremento en X. Cada vez que se escribe un pixel en X se incrementa el contador en stepX pixels. Esto es necesario
448
         * ya que el buffer destino no tiene porque tener el mismo ancho que el de origen. Este valor suele ser ancho_buffer_origen / ancho_buffer_destino.
449
         * @param stepY Incremento en Y. Cada vez que se escribe un pixel en Y se incrementa el contador en stepY pixels. Esto es necesario
450
         * ya que el buffer destino no tiene porque tener el mismo alto que el de origen. Este valor suele ser alto_buffer_origen / alto_buffer_destino.
451
         * @param begin pixel donde se comienza a leer en el buffer de origen. Este valor es decimal ya que no tiene porque empezar a leerse al principio
452
         * del pixel. Esto es util cuando se supersamplea.
453
         */
454
        private void writeIntBuffer(Buffer rasterBuf, double stepX, double stepY, Point2D begin, BandList bandList) {
455
                int xPx = 0, yPx = 0;
456
                for (int iBand = 0; iBand < buffer.getBandCount(); iBand++) {
457
                        int[] drawableBands = bandList.getBufferBandToDraw(this.getFName(), iBand);
458
                        if(drawableBands == null || (drawableBands.length == 1 && drawableBands[0] == -1))
459
                                continue;
460
                        for(int drawBands = 0; drawBands < drawableBands.length; drawBands++) {
461
                                yPx = 0;
462
                                for(double row = begin.getY(); yPx < rasterBuf.getHeight(); row += stepY) {
463
                                        xPx = 0;
464
                                        for(double col = begin.getX(); xPx < rasterBuf.getWidth(); col += stepX) {
465
                                                rasterBuf.setElem(yPx, xPx, iBand, buffer.getElemInt((int)row, (int)col, iBand));
466
                                                xPx ++;
467
                                        }
468
                                        yPx ++;
469
                                }
470
                        }
471
                }
472
        }
473

    
474
        /**
475
         * Escribe sobre el buffer pasado por par?metro los valores solicitados, desde el buffer de la clase. Los valores
476
         * se solicitan a trav?s de los par?metros. En ellos se especifica el tama?o del buffer de destino, las bandas a
477
         * escribir, el punto inicial en coordenadas pixel (double) y el incremento.
478
         * @param rasterBuf Buffer donde se escriben los datos
479
         * @param stepX Incremento en X. Cada vez que se escribe un pixel en X se incrementa el contador en stepX pixels. Esto es necesario
480
         * ya que el buffer destino no tiene porque tener el mismo ancho que el de origen. Este valor suele ser ancho_buffer_origen / ancho_buffer_destino.
481
         * @param stepY Incremento en Y. Cada vez que se escribe un pixel en Y se incrementa el contador en stepY pixels. Esto es necesario
482
         * ya que el buffer destino no tiene porque tener el mismo alto que el de origen. Este valor suele ser alto_buffer_origen / alto_buffer_destino.
483
         * @param begin pixel donde se comienza a leer en el buffer de origen. Este valor es decimal ya que no tiene porque empezar a leerse al principio
484
         * del pixel. Esto es util cuando se supersamplea.
485
         */
486
        private void writeFloatBuffer(Buffer rasterBuf, double stepX, double stepY, Point2D begin, BandList bandList) {
487
                int xPx = 0, yPx = 0;
488
                for (int iBand = 0; iBand < buffer.getBandCount(); iBand++) {
489
                        int[] drawableBands = bandList.getBufferBandToDraw(this.getFName(), iBand);
490
                        if(drawableBands == null || (drawableBands.length == 1 && drawableBands[0] == -1))
491
                                continue;
492
                        for(int drawBands = 0; drawBands < drawableBands.length; drawBands++) {
493
                                yPx = 0;
494
                                for(double row = begin.getY(); yPx < rasterBuf.getHeight(); row += stepY) {
495
                                        xPx = 0;
496
                                        for(double col = begin.getX(); xPx < rasterBuf.getWidth(); col += stepX) {
497
                                                rasterBuf.setElem(yPx, xPx, iBand, buffer.getElemFloat((int)row, (int)col, iBand));
498
                                                xPx ++;
499
                                        }
500
                                        yPx ++;
501
                                }
502
                        }
503
                }
504
        }
505

    
506
        /**
507
         * Escribe sobre el buffer pasado por par?metro los valores solicitados, desde el buffer de la clase. Los valores
508
         * se solicitan a trav?s de los par?metros. En ellos se especifica el tama?o del buffer de destino, las bandas a
509
         * escribir, el punto inicial en coordenadas pixel (double) y el incremento.
510
         * @param rasterBuf Buffer donde se escriben los datos
511
         * @param stepX Incremento en X. Cada vez que se escribe un pixel en X se incrementa el contador en stepX pixels. Esto es necesario
512
         * ya que el buffer destino no tiene porque tener el mismo ancho que el de origen. Este valor suele ser ancho_buffer_origen / ancho_buffer_destino.
513
         * @param stepY Incremento en Y. Cada vez que se escribe un pixel en Y se incrementa el contador en stepY pixels. Esto es necesario
514
         * ya que el buffer destino no tiene porque tener el mismo alto que el de origen. Este valor suele ser alto_buffer_origen / alto_buffer_destino.
515
         * @param begin pixel donde se comienza a leer en el buffer de origen. Este valor es decimal ya que no tiene porque empezar a leerse al principio
516
         * del pixel. Esto es util cuando se supersamplea.
517
         */
518
        private void writeDoubleBuffer(Buffer rasterBuf, double stepX, double stepY, Point2D begin, BandList bandList) {
519
                int xPx = 0, yPx = 0;
520
                for (int iBand = 0; iBand < buffer.getBandCount(); iBand++) {
521
                        int[] drawableBands = bandList.getBufferBandToDraw(this.getFName(), iBand);
522
                        if(drawableBands == null || (drawableBands.length == 1 && drawableBands[0] == -1))
523
                                continue;
524
                        for(int drawBands = 0; drawBands < drawableBands.length; drawBands++) {
525
                                yPx = 0;
526
                                for(double row = begin.getY(); yPx < rasterBuf.getHeight(); row += stepY) {
527
                                        xPx = 0;
528
                                        for(double col = begin.getX(); xPx < rasterBuf.getWidth(); col += stepX) {
529
                                                rasterBuf.setElem(yPx, xPx, iBand, buffer.getElemDouble((int)row, (int)col, iBand));
530
                                                xPx ++;
531
                                        }
532
                                        yPx ++;
533
                                }
534
                        }
535
                }
536
        }
537

    
538
        /*
539
         *  (non-Javadoc)
540
         * @see org.gvsig.raster.dataset.RasterDataset#getWindowRaster(int, int, org.gvsig.raster.dataset.BandList, org.gvsig.raster.dataset.Buffer)
541
         */
542
        public Buffer getWindow(int x, int y, BandList bandList, Buffer rasterBuf) {
543
                int w = rasterBuf.getWidth();
544
                int h = rasterBuf.getHeight();
545
                setView(
546
                                new ExtentImpl( rasterUtil.getMapRectFromPxRect(getExtent().toRectangle2D(),
547
                                                        getWidth(),
548
                                                        getHeight(),
549
                                                        new Rectangle2D.Double(x, y, w, h)))
550
                                );
551

    
552
                for(int iBand = 0; iBand < buffer.getBandCount(); iBand ++){
553
                        int[] drawableBands = bandList.getBufferBandToDraw(this.getFName(), iBand);
554
                        if(drawableBands == null || (drawableBands.length == 1 && drawableBands[0] == -1))
555
                                continue;
556
                        if(buffer.getDataType() == Buffer.TYPE_BYTE) {
557
                                for(int drawBands = 0; drawBands < drawableBands.length; drawBands++) {
558
                                        for(int line = y; line < (y + h); line ++)
559
                                                for(int col = x; col < (x + w); col ++)
560
                                                        rasterBuf.setElem((line - y), (col - x), drawableBands[drawBands], buffer.getElemByte(line, col, drawableBands[drawBands]));
561
                                }
562
                        }else if(buffer.getDataType() == Buffer.TYPE_SHORT){
563
                                for(int drawBands = 0; drawBands < drawableBands.length; drawBands++){
564
                                        for(int line = y; line < (y + h); line ++)
565
                                                for(int col = x; col < (x + w); col ++)
566
                                                        rasterBuf.setElem((line - y), (col - x), drawableBands[drawBands], buffer.getElemShort(line, col, drawableBands[drawBands]));
567
                                }
568
                        }else if(buffer.getDataType() == Buffer.TYPE_INT){
569
                                for(int drawBands = 0; drawBands < drawableBands.length; drawBands++){
570
                                        for(int line = y; line < (y + h); line ++)
571
                                                for(int col = x; col < (x + w); col ++)
572
                                                        rasterBuf.setElem((line - y), (col - x), drawableBands[drawBands], buffer.getElemInt(line, col, drawableBands[drawBands]));
573
                                }
574
                        }else if(buffer.getDataType() == Buffer.TYPE_FLOAT){
575
                                for(int drawBands = 0; drawBands < drawableBands.length; drawBands++){
576
                                        for(int line = y; line < (y + h); line ++)
577
                                                for(int col = x; col < (x + w); col ++)
578
                                                        rasterBuf.setElem((line - y), (col - x), drawableBands[drawBands], buffer.getElemFloat(line, col, drawableBands[drawBands]));
579
                                }
580
                        }else if(buffer.getDataType() == Buffer.TYPE_DOUBLE){
581
                                for(int drawBands = 0; drawBands < drawableBands.length; drawBands++){
582
                                        for(int line = y; line < (y + h); line ++)
583
                                                for(int col = x; col < (x + w); col ++)
584
                                                        rasterBuf.setElem((line - y), (col - x), drawableBands[drawBands], buffer.getElemDouble(line, col, drawableBands[drawBands]));
585
                                }
586
                        }
587
                }
588
                return rasterBuf;
589
        }
590

    
591
        /*
592
         *  (non-Javadoc)
593
         * @see org.gvsig.raster.dataset.RasterDataset#getWindowRaster(int, int, int, int, int, int, org.gvsig.raster.dataset.BandList, org.gvsig.raster.dataset.Buffer)
594
         */
595
        public Buffer getWindow(int x, int y, int w, int h, int bufWidth, int bufHeight, BandList bandList, Buffer rasterBuf) {
596
                setView(
597
                                new ExtentImpl( rasterUtil.getMapRectFromPxRect(getExtent().toRectangle2D(),
598
                                                        getWidth(),
599
                                                        getHeight(),
600
                                                        new Rectangle2D.Double(x, y, w, h)))
601
                                );
602

    
603
                //Relaci?n entre el n?mero de pixels del buffer origen (area seleccionada) y el destino
604
                double stepX = w / ((double)bufWidth);
605
                double stepY = h / ((double)bufHeight);
606
                switch(buffer.getDataType()){
607
                case Buffer.TYPE_BYTE: writeByteBuffer(rasterBuf, stepX, stepY, new Point2D.Double(x, y), bandList); break;
608
                case Buffer.TYPE_SHORT: writeShortBuffer(rasterBuf, stepX, stepY, new Point2D.Double(x, y), bandList); break;
609
                case Buffer.TYPE_INT: writeIntBuffer(rasterBuf, stepX, stepY, new Point2D.Double(x, y), bandList); break;
610
                case Buffer.TYPE_FLOAT: writeFloatBuffer(rasterBuf, stepX, stepY, new Point2D.Double(x, y), bandList); break;
611
                case Buffer.TYPE_DOUBLE: writeDoubleBuffer(rasterBuf, stepX, stepY, new Point2D.Double(x, y), bandList); break;
612
                }
613
                return rasterBuf;
614
        }
615

    
616
        /*
617
         *  (non-Javadoc)
618
         * @see org.gvsig.raster.dataset.RasterDataset#readCompleteLine(int, int)
619
         */
620
        public Object readCompleteLine(int line, int band) throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
621
                switch(buffer.getDataType()){
622
                case Buffer.TYPE_BYTE: return buffer.getLineFromBandByte(line, band);
623
                case Buffer.TYPE_SHORT: return buffer.getLineFromBandShort(line, band);
624
                case Buffer.TYPE_INT: return buffer.getLineFromBandInt(line, band);
625
                case Buffer.TYPE_FLOAT: return buffer.getLineFromBandFloat(line, band);
626
                case Buffer.TYPE_DOUBLE: return buffer.getLineFromBandDouble(line, band);
627
                }
628
                return null;
629
        }
630

    
631
        /*
632
         *  (non-Javadoc)
633
         * @see org.gvsig.raster.dataset.RasterDataset#readBlock(int, int)
634
         */
635
        public Object readBlock(int pos, int blockHeight) throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
636
                if(pos < 0)
637
                        throw new InvalidSetViewException("Request out of grid");
638

    
639
                if((pos + blockHeight) > buffer.getHeight())
640
                        blockHeight = Math.abs(buffer.getHeight() - pos);
641

    
642
                switch(buffer.getDataType()){
643
                case Buffer.TYPE_BYTE:
644
                        byte[][][] bufb = new byte[getBandCount()][][];
645
                        for (int iBand = 0; iBand < buffer.getBandCount(); iBand++) {
646
                                for (int row = 0; row < blockHeight; row++) {
647
                                        bufb[iBand][row] = buffer.getLineFromBandByte(row, iBand);
648
                                }
649
                        }
650
                        return bufb;
651
                case Buffer.TYPE_SHORT:
652
                        short[][][] bufs = new short[getBandCount()][][];
653
                        for (int iBand = 0; iBand < buffer.getBandCount(); iBand++) {
654
                                for (int row = 0; row < blockHeight; row++) {
655
                                        bufs[iBand][row] = buffer.getLineFromBandShort(row, iBand);
656
                                }
657
                        }
658
                        return bufs;
659
                case Buffer.TYPE_INT:
660
                        int[][][] bufi = new int[getBandCount()][][];
661
                        for (int iBand = 0; iBand < buffer.getBandCount(); iBand++) {
662
                                for (int row = 0; row < blockHeight; row++) {
663
                                        bufi[iBand][row] = buffer.getLineFromBandInt(row, iBand);
664
                                }
665
                        }
666
                        return bufi;
667
                case Buffer.TYPE_FLOAT:
668
                        float[][][] buff = new float[getBandCount()][][];
669
                        for (int iBand = 0; iBand < buffer.getBandCount(); iBand++) {
670
                                for (int row = 0; row < blockHeight; row++) {
671
                                        buff[iBand][row] = buffer.getLineFromBandFloat(row, iBand);
672
                                }
673
                        }
674
                        return buff;
675
                case Buffer.TYPE_DOUBLE:
676
                        double[][][] bufd = new double[getBandCount()][][];
677
                        for (int iBand = 0; iBand < buffer.getBandCount(); iBand++) {
678
                                for (int row = 0; row < blockHeight; row++) {
679
                                        bufd[iBand][row] = buffer.getLineFromBandDouble(row, iBand);
680
                                }
681
                        }
682
                        return bufd;
683
                }
684
                return null;
685
        }
686

    
687
                /**
688
         * Obtiene el objeto que contiene el estado de la transparencia
689
         */
690
        public DataStoreTransparency getTransparency() {
691
                if(fileTransparency == null)
692
                        fileTransparency = new DataStoreTransparency();
693
                return fileTransparency;
694
        }
695

    
696
        /*
697
         * (non-Javadoc)
698
         * @see org.gvsig.raster.dataset.RasterDataset#getOverviewCount(int)
699
         */
700
        public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
701
                if(band >= getBandCount())
702
                        throw new BandAccessException("Wrong band");
703
                return 0;
704
        }
705

    
706
        /*
707
         * (non-Javadoc)
708
         * @see org.gvsig.raster.dataset.RasterDataset#getOverviewWidth(int, int)
709
         */
710
        public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException {
711
                if (band >= getBandCount())
712
                        throw new BandAccessException("Wrong band");
713
                return 0;
714
        }
715

    
716
        /*
717
         * (non-Javadoc)
718
         * @see org.gvsig.raster.dataset.RasterDataset#getOverviewWidth(int, int)
719
         */
720
        public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
721
                if (band >= getBandCount())
722
                        throw new BandAccessException("Wrong band");
723
                return 0;
724
        }
725

    
726
        /*
727
         * (non-Javadoc)
728
         * @see org.gvsig.raster.dataset.RasterDataset#overviewsSupport()
729
         */
730
        public boolean overviewsSupport() {
731
                return false;
732
        }
733
        
734
        /*
735
         * (non-Javadoc)
736
         * @see org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider#getName()
737
         */
738
        public String getName() {
739
                return NAME;
740
        }
741
        
742
        /*
743
         * (non-Javadoc)
744
         * @see org.gvsig.raster.impl.provider.RasterProvider#setStatus(org.gvsig.raster.impl.provider.RasterProvider)
745
         */
746
        public void setStatus(RasterProvider provider) {
747
                if(provider instanceof MemoryRasterProvider) {
748
                        //Not implemented yet
749
                }
750
        }
751
        
752
        /*
753
         * (non-Javadoc)
754
         * @see org.gvsig.raster.impl.provider.RasterProvider#getTileServer()
755
         */
756
        public TileServer getTileServer() {
757
                return null;
758
        }
759
}