Statistics
| Revision:

gvsig-raster / org.gvsig.raster / trunk / org.gvsig.raster / org.gvsig.raster.io / org.gvsig.raster.io.base / src / main / java / org / gvsig / fmap / dal / coverage / dataset / io / MemoryRasterDriver.java @ 162

History | View | Annotate | Download (29.8 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.fmap.dal.coverage.dataset.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.dataset.io.param.MemoryStoreParameters;
31
import org.gvsig.fmap.dal.coverage.datastruct.BandList;
32
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
33
import org.gvsig.fmap.dal.coverage.exception.BandAccessException;
34
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
35
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
36
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
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.impl.datastruct.ExtentImpl;
41
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
42
import org.gvsig.raster.impl.provider.RasterProvider;
43
import org.gvsig.raster.impl.store.AbstractRasterStoreParameters;
44
import org.gvsig.raster.impl.store.properties.DataStoreTransparency;
45
import org.gvsig.tools.ToolsLocator;
46
import org.gvsig.tools.extensionpoint.ExtensionPoint;
47
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
48

    
49
/**
50
 * Driver para datos cargados en un objeto IBuffer
51
 * @author Nacho Brodin (nachobrodin@gmail.com)
52
 *
53
 */
54
public class MemoryRasterDriver 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
                ExtensionPointManager extensionPoints =ToolsLocator.getExtensionPointManager();
71
                ExtensionPoint point=extensionPoints.get("RasterReader");
72
                point.append(new MemoryStoreParameters().getFormatID(), "", MemoryRasterDriver.class);
73
        }
74

    
75
        /**
76
         * Constructor. Asigna el buffer de datos y la extensi?n
77
         * @param proj Proyecci?n
78
         * @param buf Buffer
79
         * @throws NotSupportedExtensionException
80
         */
81
        public MemoryRasterDriver(AbstractRasterStoreParameters params,
82
                        DataStoreProviderServices storeServices) throws NotSupportedExtensionException {
83
                super(params, storeServices, ToolsLocator.getDynObjectManager()
84
                                .createDynObject(
85
                                                MetadataLocator.getMetadataManager().getDefinition(
86
                                                                METADATA_DEFINITION_NAME)));
87
                setParam(params);
88
                if(!(params instanceof MemoryStoreParameters))
89
                        throw new NotSupportedExtensionException("Buffer not supported");
90

    
91
                extent = ((MemoryStoreParameters)params).getExtent();
92
                this.buffer = ((MemoryStoreParameters)params).getBuffer();
93

    
94
                if(extent != null) {
95
                        double psX = (extent.maxX() - extent.minX()) / buffer.getWidth();
96
                        double psY = (extent.minY() - extent.maxY()) / buffer.getHeight();
97
                        ownTransformation = new AffineTransform(psX, 0, 0, psY, extent.minX(), extent.maxY());
98
                } else
99
                        ownTransformation = new AffineTransform(1, 0, 0, -1, 0, buffer.getHeight());
100

    
101
                if(buffer == null)
102
                        throw new NotSupportedExtensionException("Buffer invalid");
103

    
104
                load();
105
                bandCount = buffer.getBandCount();
106

    
107
                //Obtenemos el tipo de dato de gdal y lo convertimos el de RasterBuf
108
                int[] dt = new int[buffer.getBandCount()];
109
                for (int i = 0; i < dt.length; i++)
110
                        dt[i] = buffer.getDataType();
111
                setDataType(dt);
112
                open = true;
113
        }
114

    
115
        /*
116
         *  (non-Javadoc)
117
         * @see org.gvsig.raster.dataset.GeoInfo#load()
118
         */
119
        public RasterProvider load() {
120
                return this;
121
        }
122
        
123
        /*
124
         * (non-Javadoc)
125
         * @see org.gvsig.raster.impl.provider.RasterProvider#isOpen()
126
         */
127
        public boolean isOpen() {
128
                return open;
129
        }
130

    
131
        /*
132
         *  (non-Javadoc)
133
         * @see org.gvsig.raster.dataset.GeoInfo#close()
134
         */
135
        public void close() {
136
                buffer = null;
137
                open = false;
138
        }
139

    
140
        /**
141
         * Asigna el extent de la vista actual.
142
         */
143
        public void setView(Extent e) {
144
                v = e;
145
        }
146

    
147
        /**
148
         * Obtiene extent de la vista actual
149
         */
150
        public Extent getView() {
151
                return v;
152
        }
153

    
154
        /**
155
         * Obtiene la anchura del fichero
156
         */
157
        public double getWidth() {
158
                return buffer.getWidth();
159
        }
160

    
161
        /**
162
         * Obtiene la altura del fichero
163
         */
164
        public double getHeight() {
165
                return buffer.getHeight();
166
        }
167

    
168
        /*
169
         *  (non-Javadoc)
170
         * @see org.cresques.geo.Projected#reProject(org.cresques.cts.ICoordTrans)
171
         */
172
        public void reProject(ICoordTrans rp) {
173
        }
174

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

    
195
        /* (non-Javadoc)
196
         * @see org.cresques.io.GeoRasterFile#getData(int, int, int)
197
         */
198
        public Object getData(int x, int y, int band) {
199
                if(buffer.getDataType() == Buffer.TYPE_BYTE){
200
                        return new Integer(buffer.getElemByte(y, x, band));
201
                }else if(buffer.getDataType() == Buffer.TYPE_SHORT){
202
                        return new Integer(buffer.getElemShort(y, x, band));
203
                }else if(buffer.getDataType() == Buffer.TYPE_INT){
204
                        return new Integer(buffer.getElemInt(y, x, band));
205
                }else if(buffer.getDataType() == Buffer.TYPE_FLOAT){
206
                        return new Float(buffer.getElemFloat(y, x, band));
207
                }else if(buffer.getDataType() == Buffer.TYPE_DOUBLE){
208
                        return new Double(buffer.getElemDouble(y, x, band));
209
                }
210
                return null;
211
        }
212

    
213

    
214
        /**
215
         * Devuelve el tama?o de bloque
216
         * @return Tama?o de bloque
217
         */
218
        public int getBlockSize(){
219
                return 0;
220
        }
221

    
222
        /**
223
         * Obtiene el flag que dice si la imagen est? o no georreferenciada
224
         * @return true si est? georreferenciada y false si no lo est?.
225
         */
226
        public boolean isGeoreferenced() {
227
                return (this.extent != null);
228
        }
229

    
230
        /**
231
         * Informa de si el driver ha supersampleado en el ?ltimo dibujado. Es el driver el que colocar?
232
         * el valor de esta variable cada vez que dibuja.
233
         * @return true si se ha supersampleado y false si no se ha hecho.
234
         */
235
        public boolean isSupersampling() {
236
                return false;
237
        }
238

    
239
        /**
240
         * @return Returns the dataType.
241
         */
242
        public int[] getDataType() {
243
                int[] dt = new int[buffer.getBandCount()];
244
                for (int i = 0; i < dt.length; i++)
245
                        dt[i] = buffer.getDataType();
246
                return dt;
247
        }
248

    
249
        /**
250
         * Ajusta los puntos pasados por par?metro a los l?mites del buffer. Es decir si alguno excede
251
         * los l?mites por arriba o por abajo los ajusta.
252
         * @param begin Punto inicial
253
         * @param end Punto final
254
         */
255
        private void adjustPointsToBufferLimits(Point2D begin, Point2D end) {
256
                if(begin.getX() < 0)
257
                        begin.setLocation(0, begin.getY());
258
                if(begin.getY() > buffer.getHeight())
259
                        begin.setLocation(begin.getX(), buffer.getHeight());
260
                if(end.getY() < 0)
261
                        end.setLocation(begin.getX(), 0);
262
                if(end.getX() > buffer.getWidth())
263
                        begin.setLocation(buffer.getWidth(), begin.getY());
264
        }
265

    
266
        /*
267
         * (non-Javadoc)
268
         * @see org.gvsig.raster.dataset.RasterDataset#getWindowRaster(double, double, double, double, org.gvsig.raster.dataset.BandList, org.gvsig.raster.dataset.Buffer)
269
         */
270
        public Buffer getWindowRaster(double ulx, double uly, double lrx, double lry, BandList bandList, Buffer rasterBuf) {
271
                Point2D begin = worldToRaster(new Point2D.Double(ulx, uly));
272
                Point2D end = worldToRaster(new Point2D.Double(lrx, lry));
273
                setView(new ExtentImpl(ulx, uly, lrx, lry));
274

    
275
                adjustPointsToBufferLimits(begin, end);
276

    
277
                switch(buffer.getDataType()){
278
                case Buffer.TYPE_BYTE: writeByteBuffer(rasterBuf, 1, 1, begin, bandList); break;
279
                case Buffer.TYPE_SHORT: writeShortBuffer(rasterBuf, 1, 1, begin, bandList); break;
280
                case Buffer.TYPE_INT: writeIntBuffer(rasterBuf, 1, 1, begin, bandList); break;
281
                case Buffer.TYPE_FLOAT: writeFloatBuffer(rasterBuf, 1, 1, begin, bandList); break;
282
                case Buffer.TYPE_DOUBLE: writeDoubleBuffer(rasterBuf, 1, 1, begin, bandList); break;
283
                }
284
                return rasterBuf;
285
        }
286

    
287
        /*
288
         *  (non-Javadoc)
289
         * @see org.gvsig.raster.dataset.RasterDataset#getWindowRaster(double, double, double, double, org.gvsig.raster.dataset.BandList, org.gvsig.raster.dataset.Buffer, boolean)
290
         */
291
        public Buffer getWindowRaster(double x, double y, double w, double h, BandList bandList, Buffer rasterBuf, boolean adjustToExtent) {
292
                Point2D begin = worldToRaster(new Point2D.Double(x, y));
293
                Point2D end = worldToRaster(new Point2D.Double(x + w, y - h));
294
                setView(new ExtentImpl(x, y, x + w, y - h));
295

    
296
                adjustPointsToBufferLimits(begin, end);
297

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

    
308
        /*
309
         *  (non-Javadoc)
310
         * @see org.gvsig.raster.dataset.RasterDataset#getWindowRaster(double, double, double, double, int, int, org.gvsig.raster.dataset.BandList, org.gvsig.raster.dataset.Buffer, boolean)
311
         */
312
        public Buffer getWindowRaster(double minX, double minY, double maxX, double maxY, int bufWidth, int bufHeight, BandList bandList, Buffer rasterBuf, boolean adjustToExtent) {
313
                Point2D begin = worldToRaster(new Point2D.Double(minX, maxY));
314
                Point2D end = worldToRaster(new Point2D.Double(maxX, minY));
315
                setView(new ExtentImpl(minX, minY, maxX, maxY));
316

    
317
                adjustPointsToBufferLimits(begin, end);
318

    
319
                //Ancho y alto en pixels (double) del area seleccionada.
320
                double w = Math.abs(end.getX() - begin.getX());
321
                double h = Math.abs(end.getY() - begin.getY());
322

    
323
                //Relaci?n entre el n?mero de pixels del buffer origen (area seleccionada) y el destino
324
                double stepX = w / ((double)bufWidth);
325
                double stepY = h / ((double)bufHeight);
326

    
327
                //Escritura separada en 5 llamadas para mejorar el rendimiento
328
                switch(buffer.getDataType()){
329
                case Buffer.TYPE_BYTE: writeByteBuffer(rasterBuf, stepX, stepY, begin, bandList); break;
330
                case Buffer.TYPE_SHORT: writeShortBuffer(rasterBuf, stepX, stepY, begin, bandList); break;
331
                case Buffer.TYPE_INT: writeIntBuffer(rasterBuf, stepX, stepY, begin, bandList); break;
332
                case Buffer.TYPE_FLOAT: writeFloatBuffer(rasterBuf, stepX, stepY, begin, bandList); break;
333
                case Buffer.TYPE_DOUBLE: writeDoubleBuffer(rasterBuf, stepX, stepY, begin, bandList); break;
334
                }
335

    
336
                /*int xPx = 0, yPx = 0;
337
                for (int iBand = 0; iBand < rasterBuf.getBandCount(); iBand++) {
338
                        yPx = 0;
339
                        for(double row = begin.getY(); yPx < bufHeight; row += stepY) {
340
                                xPx = 0;
341
                                for(double col = begin.getX(); xPx < bufWidth; col += stepX) {
342
                                        switch(buffer.getDataType()){
343
                                        case Buffer.TYPE_BYTE: rasterBuf.setElem(yPx, xPx, iBand, buffer.getElemByte((int)row, (int)col, iBand)); break;
344
                                        case Buffer.TYPE_SHORT: rasterBuf.setElem(yPx, xPx, iBand, buffer.getElemShort((int)row, (int)col, iBand)); break;
345
                                        case Buffer.TYPE_INT: rasterBuf.setElem(yPx, xPx, iBand, buffer.getElemInt((int)row, (int)col, iBand)); break;
346
                                        case Buffer.TYPE_FLOAT: rasterBuf.setElem(yPx, xPx, iBand, buffer.getElemFloat((int)row, (int)col, iBand)); break;
347
                                        case Buffer.TYPE_DOUBLE: rasterBuf.setElem(yPx, xPx, iBand, buffer.getElemDouble((int)row, (int)col, iBand)); break;
348
                                        }
349
                                        xPx ++;
350
                                }
351
                                yPx ++;
352
                        }
353
                }*/
354
                return rasterBuf;
355
        }
356

    
357
        /**
358
         * Escribe sobre el buffer pasado por par?metro los valores solicitados, desde el buffer de la clase. Los valores
359
         * se solicitan a trav?s de los par?metros. En ellos se especifica el tama?o del buffer de destino, las bandas a
360
         * escribir, el punto inicial en coordenadas pixel (double) y el incremento.
361
         * @param rasterBuf Buffer donde se escriben los datos
362
         * @param stepX Incremento en X. Cada vez que se escribe un pixel en X se incrementa el contador en stepX pixels. Esto es necesario
363
         * 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.
364
         * @param stepY Incremento en Y. Cada vez que se escribe un pixel en Y se incrementa el contador en stepY pixels. Esto es necesario
365
         * 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.
366
         * @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
367
         * del pixel. Esto es util cuando se supersamplea.
368
         */
369
        private void writeByteBuffer(Buffer rasterBuf, double stepX, double stepY, Point2D begin, BandList bandList) {
370
                int xPx = 0, yPx = 0;
371
                for (int iBand = 0; iBand < buffer.getBandCount(); iBand++) {
372
                        int[] drawableBands = bandList.getBufferBandToDraw(this.getFName(), iBand);
373
                        if(drawableBands == null || (drawableBands.length == 1 && drawableBands[0] == -1))
374
                                continue;
375
                        for(int drawBands = 0; drawBands < drawableBands.length; drawBands++) {
376
                                yPx = 0;
377
                                for(double row = begin.getY(); (yPx < rasterBuf.getHeight() && row < buffer.getHeight()); row += stepY) {
378
                                        xPx = 0;
379
                                        for(double col = begin.getX(); (xPx < rasterBuf.getWidth() && col < buffer.getWidth()); col += stepX) {
380
                                                rasterBuf.setElem(yPx, xPx, iBand, buffer.getElemByte((int)row, (int)col, iBand));
381
                                                xPx ++;
382
                                        }
383
                                        yPx ++;
384
                                }
385
                        }
386
                }
387
        }
388

    
389
        /**
390
         * Escribe sobre el buffer pasado por par?metro los valores solicitados, desde el buffer de la clase. Los valores
391
         * se solicitan a trav?s de los par?metros. En ellos se especifica el tama?o del buffer de destino, las bandas a
392
         * escribir, el punto inicial en coordenadas pixel (double) y el incremento.
393
         * @param rasterBuf Buffer donde se escriben los datos
394
         * @param stepX Incremento en X. Cada vez que se escribe un pixel en X se incrementa el contador en stepX pixels. Esto es necesario
395
         * 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.
396
         * @param stepY Incremento en Y. Cada vez que se escribe un pixel en Y se incrementa el contador en stepY pixels. Esto es necesario
397
         * 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.
398
         * @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
399
         * del pixel. Esto es util cuando se supersamplea.
400
         */
401
        private void writeShortBuffer(Buffer rasterBuf, double stepX, double stepY, Point2D begin, BandList bandList) {
402
                int xPx = 0, yPx = 0;
403
                for (int iBand = 0; iBand < buffer.getBandCount(); iBand++) {
404
                        int[] drawableBands = bandList.getBufferBandToDraw(this.getFName(), iBand);
405
                        if(drawableBands == null || (drawableBands.length == 1 && drawableBands[0] == -1))
406
                                continue;
407
                        for(int drawBands = 0; drawBands < drawableBands.length; drawBands++) {
408
                                yPx = 0;
409
                                for(double row = begin.getY(); yPx < rasterBuf.getHeight(); row += stepY) {
410
                                        xPx = 0;
411
                                        for(double col = begin.getX(); xPx < rasterBuf.getWidth(); col += stepX) {
412
                                                rasterBuf.setElem(yPx, xPx, iBand, buffer.getElemShort((int)row, (int)col, iBand));
413
                                                xPx ++;
414
                                        }
415
                                        yPx ++;
416
                                }
417
                        }
418
                }
419
        }
420

    
421
        /**
422
         * Escribe sobre el buffer pasado por par?metro los valores solicitados, desde el buffer de la clase. Los valores
423
         * se solicitan a trav?s de los par?metros. En ellos se especifica el tama?o del buffer de destino, las bandas a
424
         * escribir, el punto inicial en coordenadas pixel (double) y el incremento.
425
         * @param rasterBuf Buffer donde se escriben los datos
426
         * @param stepX Incremento en X. Cada vez que se escribe un pixel en X se incrementa el contador en stepX pixels. Esto es necesario
427
         * 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.
428
         * @param stepY Incremento en Y. Cada vez que se escribe un pixel en Y se incrementa el contador en stepY pixels. Esto es necesario
429
         * 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.
430
         * @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
431
         * del pixel. Esto es util cuando se supersamplea.
432
         */
433
        private void writeIntBuffer(Buffer rasterBuf, double stepX, double stepY, Point2D begin, BandList bandList) {
434
                int xPx = 0, yPx = 0;
435
                for (int iBand = 0; iBand < buffer.getBandCount(); iBand++) {
436
                        int[] drawableBands = bandList.getBufferBandToDraw(this.getFName(), iBand);
437
                        if(drawableBands == null || (drawableBands.length == 1 && drawableBands[0] == -1))
438
                                continue;
439
                        for(int drawBands = 0; drawBands < drawableBands.length; drawBands++) {
440
                                yPx = 0;
441
                                for(double row = begin.getY(); yPx < rasterBuf.getHeight(); row += stepY) {
442
                                        xPx = 0;
443
                                        for(double col = begin.getX(); xPx < rasterBuf.getWidth(); col += stepX) {
444
                                                rasterBuf.setElem(yPx, xPx, iBand, buffer.getElemInt((int)row, (int)col, iBand));
445
                                                xPx ++;
446
                                        }
447
                                        yPx ++;
448
                                }
449
                        }
450
                }
451
        }
452

    
453
        /**
454
         * Escribe sobre el buffer pasado por par?metro los valores solicitados, desde el buffer de la clase. Los valores
455
         * se solicitan a trav?s de los par?metros. En ellos se especifica el tama?o del buffer de destino, las bandas a
456
         * escribir, el punto inicial en coordenadas pixel (double) y el incremento.
457
         * @param rasterBuf Buffer donde se escriben los datos
458
         * @param stepX Incremento en X. Cada vez que se escribe un pixel en X se incrementa el contador en stepX pixels. Esto es necesario
459
         * 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.
460
         * @param stepY Incremento en Y. Cada vez que se escribe un pixel en Y se incrementa el contador en stepY pixels. Esto es necesario
461
         * 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.
462
         * @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
463
         * del pixel. Esto es util cuando se supersamplea.
464
         */
465
        private void writeFloatBuffer(Buffer rasterBuf, double stepX, double stepY, Point2D begin, BandList bandList) {
466
                int xPx = 0, yPx = 0;
467
                for (int iBand = 0; iBand < buffer.getBandCount(); iBand++) {
468
                        int[] drawableBands = bandList.getBufferBandToDraw(this.getFName(), iBand);
469
                        if(drawableBands == null || (drawableBands.length == 1 && drawableBands[0] == -1))
470
                                continue;
471
                        for(int drawBands = 0; drawBands < drawableBands.length; drawBands++) {
472
                                yPx = 0;
473
                                for(double row = begin.getY(); yPx < rasterBuf.getHeight(); row += stepY) {
474
                                        xPx = 0;
475
                                        for(double col = begin.getX(); xPx < rasterBuf.getWidth(); col += stepX) {
476
                                                rasterBuf.setElem(yPx, xPx, iBand, buffer.getElemFloat((int)row, (int)col, iBand));
477
                                                xPx ++;
478
                                        }
479
                                        yPx ++;
480
                                }
481
                        }
482
                }
483
        }
484

    
485
        /**
486
         * Escribe sobre el buffer pasado por par?metro los valores solicitados, desde el buffer de la clase. Los valores
487
         * se solicitan a trav?s de los par?metros. En ellos se especifica el tama?o del buffer de destino, las bandas a
488
         * escribir, el punto inicial en coordenadas pixel (double) y el incremento.
489
         * @param rasterBuf Buffer donde se escriben los datos
490
         * @param stepX Incremento en X. Cada vez que se escribe un pixel en X se incrementa el contador en stepX pixels. Esto es necesario
491
         * 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.
492
         * @param stepY Incremento en Y. Cada vez que se escribe un pixel en Y se incrementa el contador en stepY pixels. Esto es necesario
493
         * 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.
494
         * @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
495
         * del pixel. Esto es util cuando se supersamplea.
496
         */
497
        private void writeDoubleBuffer(Buffer rasterBuf, double stepX, double stepY, Point2D begin, BandList bandList) {
498
                int xPx = 0, yPx = 0;
499
                for (int iBand = 0; iBand < buffer.getBandCount(); iBand++) {
500
                        int[] drawableBands = bandList.getBufferBandToDraw(this.getFName(), iBand);
501
                        if(drawableBands == null || (drawableBands.length == 1 && drawableBands[0] == -1))
502
                                continue;
503
                        for(int drawBands = 0; drawBands < drawableBands.length; drawBands++) {
504
                                yPx = 0;
505
                                for(double row = begin.getY(); yPx < rasterBuf.getHeight(); row += stepY) {
506
                                        xPx = 0;
507
                                        for(double col = begin.getX(); xPx < rasterBuf.getWidth(); col += stepX) {
508
                                                rasterBuf.setElem(yPx, xPx, iBand, buffer.getElemDouble((int)row, (int)col, iBand));
509
                                                xPx ++;
510
                                        }
511
                                        yPx ++;
512
                                }
513
                        }
514
                }
515
        }
516

    
517
        /*
518
         *  (non-Javadoc)
519
         * @see org.gvsig.raster.dataset.RasterDataset#getWindowRaster(int, int, int, int, org.gvsig.raster.dataset.BandList, org.gvsig.raster.dataset.Buffer)
520
         */
521
        public Buffer getWindowRaster(int x, int y, int w, int h, BandList bandList, Buffer rasterBuf) {
522
                setView(
523
                                new ExtentImpl( rasterUtil.getMapRectFromPxRect(getExtent().toRectangle2D(),
524
                                                        getWidth(),
525
                                                        getHeight(),
526
                                                        new Rectangle2D.Double(x, y, w, h)))
527
                                );
528

    
529
                for(int iBand = 0; iBand < buffer.getBandCount(); iBand ++){
530
                        int[] drawableBands = bandList.getBufferBandToDraw(this.getFName(), iBand);
531
                        if(drawableBands == null || (drawableBands.length == 1 && drawableBands[0] == -1))
532
                                continue;
533
                        if(buffer.getDataType() == Buffer.TYPE_BYTE) {
534
                                for(int drawBands = 0; drawBands < drawableBands.length; drawBands++) {
535
                                        for(int line = y; line < (y + h); line ++)
536
                                                for(int col = x; col < (x + w); col ++)
537
                                                        rasterBuf.setElem((line - y), (col - x), drawableBands[drawBands], buffer.getElemByte(line, col, drawableBands[drawBands]));
538
                                }
539
                        }else if(buffer.getDataType() == Buffer.TYPE_SHORT){
540
                                for(int drawBands = 0; drawBands < drawableBands.length; drawBands++){
541
                                        for(int line = y; line < (y + h); line ++)
542
                                                for(int col = x; col < (x + w); col ++)
543
                                                        rasterBuf.setElem((line - y), (col - x), drawableBands[drawBands], buffer.getElemShort(line, col, drawableBands[drawBands]));
544
                                }
545
                        }else if(buffer.getDataType() == Buffer.TYPE_INT){
546
                                for(int drawBands = 0; drawBands < drawableBands.length; drawBands++){
547
                                        for(int line = y; line < (y + h); line ++)
548
                                                for(int col = x; col < (x + w); col ++)
549
                                                        rasterBuf.setElem((line - y), (col - x), drawableBands[drawBands], buffer.getElemInt(line, col, drawableBands[drawBands]));
550
                                }
551
                        }else if(buffer.getDataType() == Buffer.TYPE_FLOAT){
552
                                for(int drawBands = 0; drawBands < drawableBands.length; drawBands++){
553
                                        for(int line = y; line < (y + h); line ++)
554
                                                for(int col = x; col < (x + w); col ++)
555
                                                        rasterBuf.setElem((line - y), (col - x), drawableBands[drawBands], buffer.getElemFloat(line, col, drawableBands[drawBands]));
556
                                }
557
                        }else if(buffer.getDataType() == Buffer.TYPE_DOUBLE){
558
                                for(int drawBands = 0; drawBands < drawableBands.length; drawBands++){
559
                                        for(int line = y; line < (y + h); line ++)
560
                                                for(int col = x; col < (x + w); col ++)
561
                                                        rasterBuf.setElem((line - y), (col - x), drawableBands[drawBands], buffer.getElemDouble(line, col, drawableBands[drawBands]));
562
                                }
563
                        }
564
                }
565
                return rasterBuf;
566
        }
567

    
568
        /*
569
         *  (non-Javadoc)
570
         * @see org.gvsig.raster.dataset.RasterDataset#getWindowRaster(int, int, int, int, int, int, org.gvsig.raster.dataset.BandList, org.gvsig.raster.dataset.Buffer)
571
         */
572
        public Buffer getWindowRaster(int x, int y, int w, int h, int bufWidth, int bufHeight, BandList bandList, Buffer rasterBuf) {
573
                setView(
574
                                new ExtentImpl( rasterUtil.getMapRectFromPxRect(getExtent().toRectangle2D(),
575
                                                        getWidth(),
576
                                                        getHeight(),
577
                                                        new Rectangle2D.Double(x, y, w, h)))
578
                                );
579

    
580
                //Relaci?n entre el n?mero de pixels del buffer origen (area seleccionada) y el destino
581
                double stepX = w / ((double)bufWidth);
582
                double stepY = h / ((double)bufHeight);
583
                switch(buffer.getDataType()){
584
                case Buffer.TYPE_BYTE: writeByteBuffer(rasterBuf, stepX, stepY, new Point2D.Double(x, y), bandList); break;
585
                case Buffer.TYPE_SHORT: writeShortBuffer(rasterBuf, stepX, stepY, new Point2D.Double(x, y), bandList); break;
586
                case Buffer.TYPE_INT: writeIntBuffer(rasterBuf, stepX, stepY, new Point2D.Double(x, y), bandList); break;
587
                case Buffer.TYPE_FLOAT: writeFloatBuffer(rasterBuf, stepX, stepY, new Point2D.Double(x, y), bandList); break;
588
                case Buffer.TYPE_DOUBLE: writeDoubleBuffer(rasterBuf, stepX, stepY, new Point2D.Double(x, y), bandList); break;
589
                }
590
                return rasterBuf;
591
        }
592

    
593
        /*
594
         *  (non-Javadoc)
595
         * @see org.gvsig.raster.dataset.RasterDataset#readCompleteLine(int, int)
596
         */
597
        public Object readCompleteLine(int line, int band) throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
598
                switch(buffer.getDataType()){
599
                case Buffer.TYPE_BYTE: return buffer.getLineFromBandByte(line, band);
600
                case Buffer.TYPE_SHORT: return buffer.getLineFromBandShort(line, band);
601
                case Buffer.TYPE_INT: return buffer.getLineFromBandInt(line, band);
602
                case Buffer.TYPE_FLOAT: return buffer.getLineFromBandFloat(line, band);
603
                case Buffer.TYPE_DOUBLE: return buffer.getLineFromBandDouble(line, band);
604
                }
605
                return null;
606
        }
607

    
608
        /*
609
         *  (non-Javadoc)
610
         * @see org.gvsig.raster.dataset.RasterDataset#readBlock(int, int)
611
         */
612
        public Object readBlock(int pos, int blockHeight) throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
613
                if(pos < 0)
614
                        throw new InvalidSetViewException("Request out of grid");
615

    
616
                if((pos + blockHeight) > buffer.getHeight())
617
                        blockHeight = Math.abs(buffer.getHeight() - pos);
618

    
619
                switch(buffer.getDataType()){
620
                case Buffer.TYPE_BYTE:
621
                        byte[][][] bufb = new byte[getBandCount()][][];
622
                        for (int iBand = 0; iBand < buffer.getBandCount(); iBand++) {
623
                                for (int row = 0; row < blockHeight; row++) {
624
                                        bufb[iBand][row] = buffer.getLineFromBandByte(row, iBand);
625
                                }
626
                        }
627
                        return bufb;
628
                case Buffer.TYPE_SHORT:
629
                        short[][][] bufs = new short[getBandCount()][][];
630
                        for (int iBand = 0; iBand < buffer.getBandCount(); iBand++) {
631
                                for (int row = 0; row < blockHeight; row++) {
632
                                        bufs[iBand][row] = buffer.getLineFromBandShort(row, iBand);
633
                                }
634
                        }
635
                        return bufs;
636
                case Buffer.TYPE_INT:
637
                        int[][][] bufi = new int[getBandCount()][][];
638
                        for (int iBand = 0; iBand < buffer.getBandCount(); iBand++) {
639
                                for (int row = 0; row < blockHeight; row++) {
640
                                        bufi[iBand][row] = buffer.getLineFromBandInt(row, iBand);
641
                                }
642
                        }
643
                        return bufi;
644
                case Buffer.TYPE_FLOAT:
645
                        float[][][] buff = new float[getBandCount()][][];
646
                        for (int iBand = 0; iBand < buffer.getBandCount(); iBand++) {
647
                                for (int row = 0; row < blockHeight; row++) {
648
                                        buff[iBand][row] = buffer.getLineFromBandFloat(row, iBand);
649
                                }
650
                        }
651
                        return buff;
652
                case Buffer.TYPE_DOUBLE:
653
                        double[][][] bufd = new double[getBandCount()][][];
654
                        for (int iBand = 0; iBand < buffer.getBandCount(); iBand++) {
655
                                for (int row = 0; row < blockHeight; row++) {
656
                                        bufd[iBand][row] = buffer.getLineFromBandDouble(row, iBand);
657
                                }
658
                        }
659
                        return bufd;
660
                }
661
                return null;
662
        }
663

    
664
                /**
665
         * Obtiene el objeto que contiene el estado de la transparencia
666
         */
667
        public DataStoreTransparency getTransparency() {
668
                if(fileTransparency == null)
669
                        fileTransparency = new DataStoreTransparency();
670
                return fileTransparency;
671
        }
672

    
673
        /*
674
         * (non-Javadoc)
675
         * @see org.gvsig.raster.dataset.RasterDataset#getOverviewCount(int)
676
         */
677
        public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
678
                if(band >= getBandCount())
679
                        throw new BandAccessException("Wrong band");
680
                return 0;
681
        }
682

    
683
        /*
684
         * (non-Javadoc)
685
         * @see org.gvsig.raster.dataset.RasterDataset#getOverviewWidth(int, int)
686
         */
687
        public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException {
688
                if (band >= getBandCount())
689
                        throw new BandAccessException("Wrong band");
690
                return 0;
691
        }
692

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

    
703
        /*
704
         * (non-Javadoc)
705
         * @see org.gvsig.raster.dataset.RasterDataset#overviewsSupport()
706
         */
707
        public boolean overviewsSupport() {
708
                return false;
709
        }
710
        
711
        /*
712
         * (non-Javadoc)
713
         * @see org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider#getName()
714
         */
715
        public String getName() {
716
                return NAME;
717
        }
718
}