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 |
} |