Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / trunk / org.gvsig.raster.tools / org.gvsig.raster.tools.app / org.gvsig.raster.tools.app.basic / src / main / java / org / gvsig / raster / tools / app / basic / tool / saveraster / operation / RasterizerLayer.java @ 1081

History | View | Annotate | Download (10.9 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.tools.app.basic.tool.saveraster.operation;
23

    
24
import java.awt.Color;
25
import java.awt.Dimension;
26
import java.awt.Graphics2D;
27
import java.awt.geom.Rectangle2D;
28
import java.awt.image.BufferedImage;
29

    
30
import org.gvsig.andami.PluginServices;
31
import org.gvsig.andami.messages.NotificationManager;
32
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
33
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
34
import org.gvsig.fmap.dal.coverage.store.DataServerWriter;
35
import org.gvsig.fmap.dal.exception.ReadException;
36
import org.gvsig.fmap.geom.GeometryLocator;
37
import org.gvsig.fmap.geom.GeometryManager;
38
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
39
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
40
import org.gvsig.fmap.geom.primitive.Envelope;
41
import org.gvsig.fmap.mapcontext.ViewPort;
42
import org.gvsig.fmap.mapcontext.impl.DefaultMapContextDrawer;
43
import org.gvsig.fmap.mapcontext.layers.FLayers;
44
import org.gvsig.gui.beans.incrementabletask.IIncrementable;
45
import org.gvsig.raster.fmap.layers.FLyrRaster;
46
import org.gvsig.raster.tools.app.basic.RasterToolsUtil;
47
import org.gvsig.tools.task.Cancellable;
48

    
49
/**
50
 * Sirve datos solicitados por los drivers que salvan a raster. Hereda de
51
 * Rasterizer y reescribe el m?todo readData que es el que ser? llamado desde el
52
 * driver cada vez que vacie el buffer y necesite m?s datos.
53
 *
54
 * @version 04/06/2007
55
 * @author Nacho Brodin (nachobrodin@gmail.com)
56
 */
57
public class RasterizerLayer implements DataServerWriter, IIncrementable {
58
        private static final GeometryManager         geomManager                = GeometryLocator.getGeometryManager();
59
        private ViewPort                                                viewPort                 = null;
60
        private ViewPort                                                viewPortBlock        = null;
61
        private FLayers                                                        flayers                 = null;
62
        private Color                                                        backgroundColor = null;
63
        private boolean                                                        firstRead                 = true;
64
        private int                                                         nBlocks                 = 0;
65
//        private double                                                         percentMax                 = 100.0D;
66
        protected double                                                 wcIntervalo         = 0;
67
        protected Dimension                                         dimension                 = null;
68
        protected int                                                         blockSize                 = 0;
69
        protected double                                                 wcAlto                         = 0;
70
        protected int                                                         lastBlock                 = 0;
71
        protected BufferedImage                                 image                         = null;
72
        protected int[]                                                 rasterData                 = null;
73
        protected int                                                         contBlocks                 = 1;
74
        protected int                                                        percent                 = 0;
75
        protected int                                                        imgHeight                 = 0;
76

    
77
        /**
78
         * Calculo del viewPort
79
         * @param vp
80
         */
81
        private void calcViewPort(ViewPort vp) {
82
                Rectangle2D ext = null;
83

    
84
                if (viewPortBlock == null)
85
                        ext = new Rectangle2D.Double(        vp.getExtent().getMinX(),
86
                                                                                        vp.getExtent().getMaxY() - wcIntervalo,
87
                                                                                        vp.getExtent().getWidth(),
88
                                                                                        wcIntervalo
89
                                                                                );
90
                else
91
                        ext = new Rectangle2D.Double(        viewPortBlock.getExtent().getMinX(),
92
                                                                                        viewPortBlock.getExtent().getMinY() - wcIntervalo,
93
                                                                                        viewPortBlock.getExtent().getWidth(),
94
                                                                                        wcIntervalo
95
                                                                                );
96

    
97
                viewPortBlock = new ViewPort(vp.getProjection());
98
                Envelope env;
99
                try {
100
                        env = geomManager.createEnvelope(ext.getMinX(), ext.getMinY(), ext.getMaxX(), ext.getMaxY(), SUBTYPES.GEOM2D);
101
                        viewPortBlock.setEnvelope(env);
102
                } catch (CreateEnvelopeException e) {
103
                        RasterToolsUtil.debug("Error creating the envelope", null, e);
104
                }                
105
                viewPortBlock.setImageSize(dimension);
106
                viewPortBlock.refreshExtent();
107
        }
108

    
109
        /**
110
         * Constructor
111
         * @param flyrs capas
112
         * @param vp viewport
113
         * @param blockSize altura del bloque que se lee de una vez en la imagen de entrada
114
         * @param mapCtrl Mapcontrol
115
         */
116
        public RasterizerLayer(FLayers flyrs, ViewPort vp, int blockSize) {
117
                this.blockSize = blockSize;
118
                backgroundColor = vp.getBackColor();
119
                viewPort = new ViewPort(vp.getProjection());
120
                viewPort.setImageSize(vp.getImageSize());
121
                Rectangle2D ex = vp.getExtent();
122
                Envelope env = null;
123
                try {
124
                        env = geomManager.createEnvelope(ex.getMinX(), ex.getMinY(), ex.getMaxX(), ex.getMaxY(), SUBTYPES.GEOM2D);
125
                        //viewPortBlock = new ViewPort(vp.getProjection());
126
                        //viewPortBlock.setEnvelope(env);
127
                } catch (CreateEnvelopeException e) {
128
                        RasterToolsUtil.debug("Error creating the envelope", null, e);
129
                }
130
                
131

    
132
                // Calculo del viewPort del primer bloque
133
                viewPort.setEnvelope(vp.getAdjustedExtent());
134
                wcAlto = viewPort.getExtent().getMaxY() - viewPort.getExtent().getMinY();
135
                wcIntervalo = (blockSize * wcAlto) / viewPort.getImageHeight();
136
                dimension = new Dimension(viewPort.getImageWidth(), blockSize);
137

    
138
                imgHeight = vp.getImageHeight();
139
                nBlocks = (vp.getImageHeight() / blockSize);
140

    
141
                // Tama?o de ?ltimo bloque en pixeles
142
                lastBlock = vp.getImageHeight() - (nBlocks * blockSize);
143

    
144
                calcViewPort(viewPort);
145

    
146
                this.flayers = flyrs;
147
        }
148

    
149
        /**
150
         * Compatibilidad con el piloto de raster
151
         * @see readData
152
         */
153
        public int[] readARGBData(int sX, int sY, int nBand) throws ProcessInterruptedException, OutOfMemoryError {
154
                return readData( sX, sY, nBand);
155
        }
156

    
157
        public int[] readData(int sX, int sY, int nBand) throws ProcessInterruptedException, OutOfMemoryError {
158
                if (nBand == 0) { // Con nBand==0 se devuelven las 3 bandas
159
                        nBlocks = (int) Math.ceil(imgHeight / (double) blockSize);
160
                        image = new BufferedImage(sX, sY, BufferedImage.TYPE_INT_RGB);
161
                        Graphics2D g = (Graphics2D) image.getGraphics();
162
                        g.setColor(backgroundColor);
163
                        g.fillRect(0, 0, viewPortBlock.getImageWidth(), viewPortBlock.getImageHeight());
164
                        try {
165
                                // TODO: FUNCIONALIDAD: Salvar los m?ximos y m?nimos para salvar 16 bits
166

    
167
                                // Si es la primera lectura salvamos los valores de m?ximo y m?nimo para la aplicaci?n
168
                                // de realce si la imagen es de 16 bits.
169
                                if (firstRead) {
170
                                        for (int i = 0; i < flayers.getLayersCount(); i++)
171
                                                if (flayers.getLayer(i) instanceof FLyrRaster) {
172
                                                        FLyrRaster raster = (FLyrRaster) flayers.getLayer(i);
173
                                                        if (raster.getDataStore().getDataType()[0] == Buffer.TYPE_SHORT || raster.getDataStore().getDataType()[0] == Buffer.TYPE_USHORT) {
174
                                                                //Statistic stats = raster.getSource().getFilterStack().getStats();
175
                                                                //stats.history.add(stats.new History(raster.getName(), stats.minBandValue, stats.maxBandValue, stats.secondMinBandValue, stats.secondMaxBandValue));
176
                                                        }
177
                                                }
178
                                        firstRead = false;
179
                                }
180

    
181
                                DefaultMapContextDrawer mapContextDrawer = new DefaultMapContextDrawer();
182
                                mapContextDrawer.setMapContext(flayers.getMapContext());
183
                                mapContextDrawer.setViewPort(viewPortBlock);
184
                                mapContextDrawer.draw(flayers, image, g, new Cancellable(){
185
                                        public boolean isCanceled() {
186
                                                return false;
187
                                        }
188

    
189
                                        public void setCanceled(boolean canceled) {
190
                                        }
191
                                }, flayers.getMapContext().getScaleView());
192

    
193
                                // Si es el ?ltimo bloque vaciamos el historial de m?ximos y m?nimos
194
                                if ((contBlocks + 1) == nBlocks)
195
                                        for (int i = 0; i < flayers.getLayersCount(); i++)
196
                                                if (flayers.getLayer(i) instanceof FLyrRaster) {
197
                                                        FLyrRaster raster = (FLyrRaster) flayers.getLayer(i);
198
                                                        if (raster.getDataStore().getDataType()[0] == Buffer.TYPE_SHORT || raster.getDataStore().getDataType()[0] == Buffer.TYPE_USHORT) {
199
                                                                //raster.getDatasource().getFilterStack().getStats().history.clear();
200
                                                                //Statistic stats = raster.getSource().getFilterStack().getStats();
201
                                                        }
202
                                                }
203

    
204
                        } catch (ReadException e) {
205
                                NotificationManager.addError("Error en el draw de capa", e);
206
                        }
207
                        rasterData = image.getRGB(0, 0, sX, sY, rasterData, 0, sX);
208

    
209
                        // Calculamos el viewPort del sgte bloque
210

    
211
                        if (((contBlocks + 1) * blockSize) <= viewPort.getImageHeight())
212
                                dimension = new Dimension(sX, sY);
213
                        else { // Calculo de la altura del ?ltimo bloque
214
                                dimension = new Dimension(sX, (viewPort.getImageHeight() - (contBlocks * blockSize)));
215
                                wcIntervalo = (lastBlock * wcAlto) / viewPort.getImageHeight();
216
                        }
217

    
218
                        calcViewPort(viewPortBlock);
219

    
220
                        percent = ((100 * (contBlocks)) / nBlocks);
221
                        contBlocks++;
222

    
223
                        return rasterData;
224
                }
225

    
226
                return null;
227
        }
228

    
229
        /**
230
         * Asigna el ancho del bloque
231
         * @param sizeBlock Ancho del bloque en pixeles
232
         */
233
        public void setBlockSize(int blockSize) {
234
                this.blockSize = blockSize;
235
        }
236

    
237
        /**
238
         * No tiene uso en RasterizerLayer
239
         */
240
        public byte[][] readByteData(int sizeX, int sizeY) {
241
                return null;
242
        }
243

    
244
        /**
245
         * No tiene uso en RasterizerLayer
246
         */
247
        public double[][] readDoubleData(int sizeX, int sizeY) {
248
                return null;
249
        }
250

    
251
        /**
252
         * No tiene uso en RasterizerLayer
253
         */
254
        public float[][] readFloatData(int sizeX, int sizeY) {
255
                return null;
256
        }
257

    
258
        /**
259
         * No tiene uso en RasterizerLayer
260
         */
261
        public int[][] readIntData(int sizeX, int sizeY) {
262
                return null;
263
        }
264

    
265
        /**
266
         * No tiene uso en RasterizerLayer
267
         */
268
        public short[][] readShortData(int sizeX, int sizeY) {
269
                return null;
270
        }
271

    
272
        /*
273
         * (non-Javadoc)
274
         * @see org.gvsig.gui.beans.incrementabletask.IIncrementable#getTitle()
275
         */
276
        public String getTitle() {
277
                return PluginServices.getText(this, "salvando_raster");
278
        }
279

    
280
        /*
281
         * (non-Javadoc)
282
         * @see org.gvsig.gui.beans.incrementabletask.IIncrementable#getLog()
283
         */
284
        public String getLog() {
285
                return PluginServices.getText(this, "salvando_bloque") + " " + Math.min(nBlocks, contBlocks) + " " + PluginServices.getText(this, "de") + " " + nBlocks;
286
        }
287

    
288
        /*
289
         * (non-Javadoc)
290
         * @see org.gvsig.gui.beans.incrementabletask.IIncrementable#getLabel()
291
         */
292
        public String getLabel() {
293
                return PluginServices.getText(this, "rasterizando") + "...";
294
        }
295

    
296
        /*
297
         * (non-Javadoc)
298
         * @see org.gvsig.gui.beans.incrementabletask.IIncrementable#getPercent()
299
         */
300
        public int getPercent() {
301
                return percent;
302
        }
303

    
304
        /*
305
         * (non-Javadoc)
306
         * @see org.gvsig.gui.beans.incrementabletask.IIncrementable#isCancelable()
307
         */
308
        public boolean isCancelable() {
309
                return true;
310
        }
311

    
312
        /*
313
         * (non-Javadoc)
314
         * @see org.gvsig.gui.beans.incrementabletask.IIncrementable#isPausable()
315
         */
316
        public boolean isPausable() {
317
                return false;
318
        }
319

    
320
        public void setAlphaBuffer(Buffer alphaBuffer) {
321
                // TODO Auto-generated method stub
322
        }
323

    
324
        public void setBuffer(Buffer buffer, int nband) {
325
                // TODO Auto-generated method stub
326
        }
327

    
328
        public void setBand(int nband) {
329
                // TODO Auto-generated method stub
330
        }
331

    
332
        public void dispose() {
333
                // TODO Auto-generated method stub
334
                
335
        }
336

    
337
        public Buffer getSource() {
338
                // TODO Auto-generated method stub
339
                return null;
340
        }
341

    
342
        public void setPercent(int value) {
343
                // TODO Auto-generated method stub
344
                
345
        }
346
}