Revision 1676
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/histogram/ui/HistogramDialog.java | ||
---|---|---|
34 | 34 |
* <code>HistogramDialog</code>. Creaci?n de la ventana de histograma para gvSIG. |
35 | 35 |
* |
36 | 36 |
* @version 20/03/2007 |
37 |
* @author Nacho Brodin (brodin_ign@gva.es)
|
|
38 |
* @author BorSanZa - Borja Sanchez Zamorano (borja.sanchez@iver.es)
|
|
37 |
* @author Nacho Brodin (nachobrodin@gmail.com)
|
|
38 |
* @author BorSanZa - Borja Sanchez Zamorano |
|
39 | 39 |
*/ |
40 | 40 |
public class HistogramDialog extends JPanel implements IWindow, ButtonsPanelListener { |
41 | 41 |
private static final long serialVersionUID = 7362459094802955247L; |
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/histogram/HistogramPanelListener.java | ||
---|---|---|
44 | 44 |
import org.gvsig.fmap.dal.coverage.datastruct.BufferHistogram; |
45 | 45 |
import org.gvsig.fmap.dal.coverage.datastruct.HistogramClass; |
46 | 46 |
import org.gvsig.fmap.dal.coverage.exception.HistogramException; |
47 |
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException; |
|
47 | 48 |
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException; |
49 |
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException; |
|
48 | 50 |
import org.gvsig.fmap.dal.coverage.store.props.HistogramComputer; |
49 | 51 |
import org.gvsig.fmap.dal.exception.DataException; |
50 | 52 |
import org.gvsig.fmap.dal.exception.ValidateDataParametersException; |
... | ... | |
193 | 195 |
ArrayList comboSource = getHistogramPanel().getComboSource(); |
194 | 196 |
for (int i = 0; i < comboSource.size(); i++) { |
195 | 197 |
String name = (String) ((ArrayList) comboSource.get(i)).get(1); |
196 |
if (name.compareTo(RasterToolsUtil.getText(this, "datos_visualizados")) == 0) { |
|
198 |
if (cbo.getSelectedItem().equals(name) && |
|
199 |
name.compareTo(RasterToolsUtil.getText(this, "datos_visualizados")) == 0) { |
|
197 | 200 |
((ArrayList) comboSource.get(i)).remove(0); |
198 |
((ArrayList) comboSource.get(i)).add(0, ((FLyrRaster) lyr).getRender().getLastRenderBuffer().getHistogramComputer()); |
|
201 |
try { |
|
202 |
((ArrayList) comboSource.get(i)).add(0, ((FLyrRaster) lyr).getRender().getLastRenderBuffer().getHistogramComputer()); |
|
203 |
} catch (RasterDriverException e1) { |
|
204 |
RasterToolsUtil.messageBoxError("histogram_error", getHistogramPanel(), e1); |
|
205 |
} catch (InvalidSetViewException e1) { |
|
206 |
RasterToolsUtil.messageBoxError("histogram_error", getHistogramPanel(), e1); |
|
207 |
} catch (ProcessInterruptedException e1) { |
|
208 |
} |
|
199 | 209 |
|
200 | 210 |
} |
201 |
if (name.compareTo(RasterToolsUtil.getText(this, "imagen_completa")) == 0) { |
|
211 |
if (cbo.getSelectedItem().equals(name) && |
|
212 |
name.compareTo(RasterToolsUtil.getText(this, "imagen_completa")) == 0) { |
|
202 | 213 |
((ArrayList) comboSource.get(i)).remove(0); |
203 | 214 |
((ArrayList) comboSource.get(i)).add(0, ((FLyrRaster) lyr).getDataStore().getHistogramComputer()); |
204 | 215 |
} |
org.gvsig.raster/trunk/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.api/src/main/java/org/gvsig/fmap/dal/coverage/grid/render/Render.java | ||
---|---|---|
188 | 188 |
* @throws InvalidSetViewException |
189 | 189 |
* @throws ArrayIndexOutOfBoundsException |
190 | 190 |
*/ |
191 |
public void draw(Graphics2D g, ViewPortData vp, TaskStatus taskStatus)
|
|
191 |
public Buffer draw(Graphics2D g, ViewPortData vp, TaskStatus taskStatus)
|
|
192 | 192 |
throws RasterDriverException, InvalidSetViewException, ProcessInterruptedException; |
193 | 193 |
|
194 | 194 |
/** |
... | ... | |
226 | 226 |
public void drawThread(Graphics2D g, ViewPortData vp); |
227 | 227 |
|
228 | 228 |
/** |
229 |
* Draws the image with the parameters used in the last drawn. |
|
230 |
* @return |
|
231 |
*/ |
|
232 |
public Buffer getLastRenderBuffer() |
|
233 |
throws RasterDriverException, InvalidSetViewException, ProcessInterruptedException; |
|
234 |
|
|
235 |
/** |
|
229 | 236 |
* Sets the view structures to draw |
230 | 237 |
* @param g |
231 | 238 |
* @param vp |
org.gvsig.raster/trunk/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.api/src/main/java/org/gvsig/fmap/dal/coverage/store/props/HistogramComputer.java | ||
---|---|---|
67 | 67 |
*/ |
68 | 68 |
public void refreshHistogram(); |
69 | 69 |
|
70 |
/** |
|
71 |
* This value represents the percentage of the image that will be used |
|
72 |
* for this process. The default value is one, that means that the entire |
|
73 |
* image will be processed |
|
74 |
*/ |
|
75 |
public void setScaleHistogram(double scale); |
|
76 |
|
|
70 | 77 |
} |
org.gvsig.raster/trunk/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.impl/src/main/java/org/gvsig/raster/impl/buffer/BufferHistogramComputer.java | ||
---|---|---|
42 | 42 |
protected int progressHistogram = 0; |
43 | 43 |
private double[] limits = null; |
44 | 44 |
private boolean refresh = false; |
45 |
@SuppressWarnings("unused") |
|
46 |
private double scale = 1; |
|
45 | 47 |
|
46 | 48 |
/** |
47 | 49 |
* Constructor |
... | ... | |
51 | 53 |
this.buffer = buffer; |
52 | 54 |
} |
53 | 55 |
|
56 |
public void setScaleHistogram(double scale) { |
|
57 |
this.scale = scale; |
|
58 |
} |
|
59 |
|
|
54 | 60 |
/* |
55 | 61 |
* (non-Javadoc) |
56 | 62 |
* @see org.gvsig.fmap.dal.coverage.store.props.HistogramComputer#getBufferHistogram() |
org.gvsig.raster/trunk/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.impl/src/main/java/org/gvsig/raster/impl/store/properties/SimpleProviderHistogramComputer.java | ||
---|---|---|
61 | 61 |
private RasterProvider provider = null; |
62 | 62 |
private int percent = 0; |
63 | 63 |
private boolean refresh = false; |
64 |
private double scale = 1; |
|
64 | 65 |
|
65 | 66 |
/** |
66 | 67 |
* Constructor |
... | ... | |
69 | 70 |
public SimpleProviderHistogramComputer(RasterProvider provider) { |
70 | 71 |
this.provider = provider; |
71 | 72 |
} |
73 |
|
|
74 |
public void setScaleHistogram(double scale) { |
|
75 |
this.scale = scale; |
|
76 |
} |
|
72 | 77 |
|
73 | 78 |
/** |
74 | 79 |
* Obtiene el minimo valor de las estadisticas de un histograma. |
... | ... | |
197 | 202 |
for (int block = 0; block < provider.getHeight(); block += h) { |
198 | 203 |
Object buf = null; |
199 | 204 |
try { |
200 |
buf = provider.readBlock(block, h, RasterLibrary.statisticsScale);
|
|
205 |
buf = provider.readBlock(block, h, scale);
|
|
201 | 206 |
} catch (InvalidSetViewException e) { |
202 | 207 |
// La vista se asigna autom?ticamente |
203 | 208 |
} |
... | ... | |
206 | 211 |
if ((block + hB) > provider.getHeight()) |
207 | 212 |
hB = Math.abs(((int)provider.getHeight()) - block); |
208 | 213 |
|
209 |
hB *= RasterLibrary.statisticsScale;
|
|
214 |
hB *= scale;
|
|
210 | 215 |
|
211 | 216 |
if(buf instanceof Buffer) { |
212 | 217 |
loadHistogramFromBuffer((Buffer)buf); |
org.gvsig.raster/trunk/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.impl/src/main/java/org/gvsig/raster/impl/store/properties/MultiProviderHistogramComputer.java | ||
---|---|---|
21 | 21 |
*/ |
22 | 22 |
package org.gvsig.raster.impl.store.properties; |
23 | 23 |
|
24 |
import org.gvsig.fmap.dal.coverage.RasterLibrary; |
|
25 | 24 |
import org.gvsig.fmap.dal.coverage.datastruct.BufferHistogram; |
26 | 25 |
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException; |
27 | 26 |
import org.gvsig.fmap.dal.coverage.exception.HistogramException; |
... | ... | |
46 | 45 |
private boolean refresh = false; |
47 | 46 |
private int percent = 0; |
48 | 47 |
private int files = 0; |
48 |
private double scale = 1; |
|
49 | 49 |
|
50 | 50 |
/** |
51 | 51 |
* Constructor |
... | ... | |
56 | 56 |
files = provider.getInternalProviderCount(); |
57 | 57 |
} |
58 | 58 |
|
59 |
public void setScaleHistogram(double scale) { |
|
60 |
this.scale = scale; |
|
61 |
} |
|
62 |
|
|
59 | 63 |
/** |
60 | 64 |
* Obtiene el histograma. Pregunta a todos los datasets que forman el multidataset |
61 | 65 |
* por su histograma y luego los fusiona. |
... | ... | |
81 | 85 |
return null; |
82 | 86 |
|
83 | 87 |
try { |
84 |
provider.getStatistics().calculate(RasterLibrary.statisticsScale);
|
|
88 |
provider.getStatistics().calculate(scale);
|
|
85 | 89 |
} catch (FileNotOpenException e) { |
86 | 90 |
throw new HistogramException(""); |
87 | 91 |
} catch (RasterDriverException e) { |
org.gvsig.raster/trunk/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.impl/src/main/java/org/gvsig/raster/impl/datastruct/BufferHistogramImpl.java | ||
---|---|---|
425 | 425 |
|
426 | 426 |
double[][] res = new double[5][]; |
427 | 427 |
|
428 |
double[] min = new double[bandCount];// M?nimo |
|
429 |
double[] max = new double[bandCount];// M?ximo |
|
430 |
for (int iBand = 0; iBand < bandCount; iBand++) { |
|
431 |
max[iBand] = Double.NEGATIVE_INFINITY; |
|
432 |
min[iBand] = Double.POSITIVE_INFINITY; |
|
433 |
} |
|
434 | 428 |
double[] average = new double[bandCount]; // Valor de pixel medio (Media) |
435 | 429 |
double[] middle = new double[bandCount]; // Mediana |
436 | 430 |
double[] nPixelsBand = new double[bandCount];// N?mero de pixels por banda |
... | ... | |
440 | 434 |
for (int iBand = 0; iBand < histogram.length; iBand++) { |
441 | 435 |
if (bands[iBand]) { |
442 | 436 |
for (int i = beginPos; i <= endPos; i++) { |
443 |
// Calculo del m?nimo |
|
444 |
if (histogram[iBand][i].getValue() != 0 && histogram[iBand][i].getMin() < min[showBandCounter]) |
|
445 |
min[showBandCounter] = histogram[iBand][i].getMin(); |
|
446 |
|
|
447 |
// Calculo del m?ximo |
|
448 |
if (histogram[iBand][i].getValue() != 0 && histogram[iBand][i].getMax() > max[showBandCounter]) |
|
449 |
max[showBandCounter] = histogram[iBand][i].getMin(); |
|
450 |
|
|
451 | 437 |
// Calculo del n?mero de pixeles |
452 | 438 |
nPixelsBand[showBandCounter] += histogram[iBand][i].getValue(); |
453 |
|
|
454 | 439 |
average[showBandCounter] += histogram[iBand][i].getValue() * ((histogram[iBand][i].getMax() + histogram[iBand][i].getMin())/2); |
455 | 440 |
} |
456 | 441 |
// Calculo de la media |
... | ... | |
462 | 447 |
|
463 | 448 |
// Calculo de mediana |
464 | 449 |
double stopPos = nPixelsBand[showBandCounter] / 2; |
465 |
int aux = 0;
|
|
450 |
double aux = 0;
|
|
466 | 451 |
int i = beginPos; |
467 | 452 |
for (i = beginPos; aux <= stopPos; i++) { |
468 | 453 |
if (i >= histogram[iBand].length) |
... | ... | |
474 | 459 |
} |
475 | 460 |
} |
476 | 461 |
middle[showBandCounter] = (histogram[iBand][i - 1].getMax() + histogram[iBand][i - 1].getMin()) / 2; |
477 |
|
|
478 | 462 |
showBandCounter++; |
479 | 463 |
} |
480 | 464 |
} |
org.gvsig.raster/trunk/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.impl/src/main/java/org/gvsig/raster/impl/grid/render/DefaultRender.java | ||
---|---|---|
351 | 351 |
return; |
352 | 352 |
} |
353 | 353 |
|
354 |
/* |
|
355 |
* (non-Javadoc) |
|
356 |
* @see org.gvsig.fmap.dal.coverage.grid.render.Render#draw(java.awt.Graphics2D, org.cresques.geo.ViewPortData) |
|
357 |
*/ |
|
358 |
public synchronized void draw(Graphics2D g, ViewPortData vp, TaskStatus taskStatus) |
|
354 |
public synchronized Buffer getLastRenderBuffer() |
|
359 | 355 |
throws RasterDriverException, InvalidSetViewException, ProcessInterruptedException { |
356 |
return draw(null, lastViewPortData, null); |
|
357 |
} |
|
358 |
|
|
359 |
public synchronized Buffer draw(Graphics2D g, ViewPortData vp, TaskStatus taskStatus) |
|
360 |
throws RasterDriverException, InvalidSetViewException, ProcessInterruptedException { |
|
360 | 361 |
lastGraphics = g; |
361 | 362 |
lastViewPortData = vp; |
362 | 363 |
|
363 | 364 |
if(util.isOutside(vp.getExtent(), dataStore.getExtent())) { |
364 | 365 |
endReading(); |
365 |
return; |
|
366 |
return null;
|
|
366 | 367 |
} |
367 | 368 |
|
368 | 369 |
Extent adjustedRotedRequest = request(vp, dataStore); |
369 | 370 |
|
370 | 371 |
if ((widthImage <= 0) || (heightImage <= 0)) { |
371 | 372 |
endReading(); |
372 |
return; |
|
373 |
return null;
|
|
373 | 374 |
} |
374 | 375 |
|
375 | 376 |
if (dataStore == null) |
376 |
return; |
|
377 |
return null;
|
|
377 | 378 |
|
378 | 379 |
Buffer buf = null; |
379 | 380 |
double[] step = null; |
... | ... | |
388 | 389 |
} else { |
389 | 390 |
// Asignamos la banda de transparencia si existe esta |
390 | 391 |
RasterQuery query = DefaultRasterManager.getInstance().createQuery(); |
392 |
//query.setReadOnly(true); |
|
391 | 393 |
query.setTaskStatus(taskStatus); |
392 | 394 |
query.setTime(vp.getTime()); |
393 | 395 |
query.setSupersamplingLoadingBuffer(false); // Desactivamos el supersampleo en la carga del buffer. |
... | ... | |
411 | 413 |
init(); |
412 | 414 |
} |
413 | 415 |
|
414 |
drawBufferOnImage(lastGraphics, |
|
415 |
lastViewPortData, |
|
416 |
buf, |
|
417 |
step, |
|
418 |
dataStore.getAffineTransform(), |
|
419 |
adjustedRotedRequest); |
|
416 |
return drawBufferOnImage(lastGraphics,
|
|
417 |
lastViewPortData,
|
|
418 |
buf,
|
|
419 |
step,
|
|
420 |
dataStore.getAffineTransform(),
|
|
421 |
adjustedRotedRequest);
|
|
420 | 422 |
} |
421 | 423 |
|
422 | 424 |
/* |
423 | 425 |
* (non-Javadoc) |
424 | 426 |
* @see org.gvsig.fmap.dal.coverage.grid.render.Render#draw(java.awt.Graphics2D, org.cresques.geo.ViewPortData) |
425 | 427 |
*/ |
426 |
private synchronized void drawBufferOnImage(Graphics2D g, ViewPortData vp, Buffer buf, double[] step, AffineTransform transf, Extent adjustedRotedRequest)
|
|
428 |
private synchronized Buffer drawBufferOnImage(Graphics2D g, ViewPortData vp, Buffer buf, double[] step, AffineTransform transf, Extent adjustedRotedRequest)
|
|
427 | 429 |
throws RasterDriverException, InvalidSetViewException, ProcessInterruptedException { |
428 | 430 |
|
429 | 431 |
grid = bufferPreprocessing(buf, lastTransparency); |
430 | 432 |
|
431 | 433 |
//Buffer filtrado para renderizar |
432 | 434 |
buf = grid.getRasterBuf(); |
435 |
if(g == null) |
|
436 |
return buf; |
|
433 | 437 |
drawer.setBuffer(buf); // Buffer de datos a renderizar |
434 | 438 |
drawer.setSupersamplingOn(step); // Desplazamiento para supersampleo |
435 | 439 |
drawer.setOutputSize((int)Math.round(widthImage), (int)Math.round(heightImage)); // Ancho y alto del buffer |
... | ... | |
448 | 452 |
Point2D lastGraphicOffset = new Point2D.Double(adjustedRotedRequest.getULX(), adjustedRotedRequest.getULY()); |
449 | 453 |
((DefaultViewPortData)vp).mat.transform(lastGraphicOffset, lastGraphicOffset); |
450 | 454 |
g.drawImage(geoImage, (int) Math.round(lastGraphicOffset.getX()), (int) Math.round(lastGraphicOffset.getY()), null); |
451 |
return; |
|
455 |
return buf;
|
|
452 | 456 |
} |
453 | 457 |
|
454 | 458 |
/* |
... | ... | |
485 | 489 |
LoggerFactory.getLogger(getClass()).debug("Transformation error", e); |
486 | 490 |
} |
487 | 491 |
|
488 |
return; |
|
492 |
return buf;
|
|
489 | 493 |
// long t2 = new Date().getTime(); |
490 | 494 |
// System.out.println("Renderizando Raster: " + ((t2 - t1) / 1000D) + ", secs."); |
491 | 495 |
} |
Also available in: Unified diff