Revision 11082 trunk/libraries/libRaster/src/org/gvsig/raster/buffer/RasterBuffer.java
RasterBuffer.java | ||
---|---|---|
45 | 45 |
private static int multicacheMemorySize = 100; |
46 | 46 |
|
47 | 47 |
public double noDataValue = -99999; |
48 |
protected int percent = 0; |
|
48 |
|
|
49 |
protected int percent = 0; |
|
50 |
protected boolean canceled = false; |
|
49 | 51 |
|
50 |
protected int width;
|
|
51 |
protected int height;
|
|
52 |
protected int nBands;
|
|
53 |
protected int dataType;
|
|
54 |
|
|
55 |
/**
|
|
56 |
* Variable est?tica que si est? a false desactiva el uso de cach?. Puede ser usada por un cliente
|
|
57 |
* para cargar siempre los datos en memoria. independientemente de su tama?o.
|
|
58 |
*/
|
|
59 |
public static boolean cacheOn = true;
|
|
60 |
/**
|
|
61 |
* Fuerza la carga de los datos en cach? independientemente de su tama?o. Su
|
|
62 |
* uso suele ser util solo para depuraci?n. Su valor por defecto y recomendado
|
|
63 |
* es siempre false.
|
|
64 |
*/
|
|
65 |
public static boolean forceToLoadInCache = false;
|
|
66 |
/**
|
|
67 |
* Fuerza la carga de los datos en cach? de solo lectura independientemente de su tama?o. Su
|
|
68 |
* uso suele ser util solo para depuraci?n. Su valor por defecto y recomendado
|
|
69 |
* es siempre false.
|
|
70 |
*/
|
|
71 |
public static boolean forceToLoadInReadOnlyCache = false;
|
|
72 |
/**
|
|
73 |
* Valor con el que se rellena una banda no valida del buffer. Una banda no valida es la que
|
|
74 |
* no tiene datos asignados y tampoco puede ser null. Todas las bandas no validas de un buffer
|
|
75 |
* apuntan por referencia a la misma banda.
|
|
76 |
*/
|
|
77 |
protected double notValidValue = 0D;
|
|
52 |
protected int width; |
|
53 |
protected int height; |
|
54 |
protected int nBands; |
|
55 |
protected int dataType; |
|
56 |
|
|
57 |
/** |
|
58 |
* Variable est?tica que si est? a false desactiva el uso de cach?. Puede ser usada por un cliente |
|
59 |
* para cargar siempre los datos en memoria. independientemente de su tama?o. |
|
60 |
*/ |
|
61 |
public static boolean cacheOn = true; |
|
62 |
/** |
|
63 |
* Fuerza la carga de los datos en cach? independientemente de su tama?o. Su |
|
64 |
* uso suele ser util solo para depuraci?n. Su valor por defecto y recomendado |
|
65 |
* es siempre false. |
|
66 |
*/ |
|
67 |
public static boolean forceToLoadInCache = false; |
|
68 |
/** |
|
69 |
* Fuerza la carga de los datos en cach? de solo lectura independientemente de su tama?o. Su |
|
70 |
* uso suele ser util solo para depuraci?n. Su valor por defecto y recomendado |
|
71 |
* es siempre false. |
|
72 |
*/ |
|
73 |
public static boolean forceToLoadInReadOnlyCache = false; |
|
74 |
/** |
|
75 |
* Valor con el que se rellena una banda no valida del buffer. Una banda no valida es la que |
|
76 |
* no tiene datos asignados y tampoco puede ser null. Todas las bandas no validas de un buffer |
|
77 |
* apuntan por referencia a la misma banda. |
|
78 |
*/ |
|
79 |
protected double notValidValue = 0D; |
|
78 | 80 |
|
79 |
/** |
|
80 |
* Genera instancias del buffer de datos adecuado al tama?o del raster. Si no hay muchos datos |
|
81 |
* (menos de cacheMemorySize) crear? un buffer en memoria. Si hay m?s de esta cantidad |
|
82 |
* entonces crearemos un buffer cacheado (RasterCache). A partir de la cantidad se?alada |
|
83 |
* por multicacheMemorySize haremos un buffer cacheado donde cada p?gina no ocupa todo |
|
84 |
* el ancho del raster ya que este ser? muy grande. La gesti?n de una cache donde cada |
|
85 |
* pagina ha de partir una l?nea lleva una complejidad a?adida. |
|
86 |
* |
|
87 |
* @param dataType Tipo de dato |
|
88 |
* @param width Ancho |
|
89 |
* @param height Alto |
|
90 |
* @param bandNr Banda |
|
91 |
* @param malloc |
|
92 |
* @return |
|
93 |
* @throws RasterDriverException |
|
94 |
* @throws NotSupportedExtensionException |
|
95 |
* @throws FileNotFoundException |
|
96 |
*/ |
|
97 |
public static RasterBuffer getBuffer(int dataType, int width, int height, int bandNr, boolean malloc, String filePath) |
|
98 |
/*throws FileNotFoundException, NotSupportedExtensionException, RasterDriverException*/{ |
|
99 |
//Opci?n de cachear siempre activada (Solo DEBUG) |
|
100 |
if(forceToLoadInCache) |
|
101 |
return new RasterCache(dataType, width, height, bandNr); |
|
102 |
if(forceToLoadInReadOnlyCache && filePath != null){ |
|
103 |
try { |
|
104 |
return new RasterReadOnlyHugeBuffer(dataType, width, height, bandNr, filePath); |
|
105 |
} catch (FileNotFoundException e) { |
|
106 |
//TODO: EXCEPTION: Modificar el lanzamiento de excepciones del RasterBuffer |
|
107 |
e.printStackTrace(); |
|
108 |
} catch (NotSupportedExtensionException e) { |
|
109 |
e.printStackTrace(); |
|
110 |
} catch (RasterDriverException e) { |
|
111 |
e.printStackTrace(); |
|
112 |
} |
|
113 |
} |
|
114 |
|
|
115 |
if(cacheOn){ |
|
116 |
long size = (RasterUtilities.getBytesFromRasterBufType(dataType) * width * height * bandNr) / 1024; |
|
117 |
long ms1 = cacheMemorySize * 1024; |
|
118 |
long ms2 = multicacheMemorySize * 1024; |
|
119 |
if(size <= ms1) |
|
120 |
return new RasterMemoryBuffer(dataType, width, height, bandNr, malloc); |
|
121 |
else{ |
|
122 |
//if(filePath == null) |
|
123 |
return new RasterCache(dataType, width, height, bandNr); |
|
124 |
/*else |
|
125 |
return new RasterReadOnlyHugeBuffer(dataType, width, height, bandNr, filePath);*/ |
|
126 |
} |
|
127 |
}else |
|
81 |
/** |
|
82 |
* Genera instancias del buffer de datos adecuado al tama?o del raster. Si no hay muchos datos |
|
83 |
* (menos de cacheMemorySize) crear? un buffer en memoria. Si hay m?s de esta cantidad |
|
84 |
* entonces crearemos un buffer cacheado (RasterCache). A partir de la cantidad se?alada |
|
85 |
* por multicacheMemorySize haremos un buffer cacheado donde cada p?gina no ocupa todo |
|
86 |
* el ancho del raster ya que este ser? muy grande. La gesti?n de una cache donde cada |
|
87 |
* pagina ha de partir una l?nea lleva una complejidad a?adida. |
|
88 |
* |
|
89 |
* @param dataType Tipo de dato |
|
90 |
* @param width Ancho |
|
91 |
* @param height Alto |
|
92 |
* @param bandNr Banda |
|
93 |
* @param malloc |
|
94 |
* @return |
|
95 |
* @throws RasterDriverException |
|
96 |
* @throws NotSupportedExtensionException |
|
97 |
* @throws FileNotFoundException |
|
98 |
*/ |
|
99 |
public static RasterBuffer getBuffer(int dataType, int width, int height, int bandNr, boolean malloc, String filePath) |
|
100 |
/*throws FileNotFoundException, NotSupportedExtensionException, RasterDriverException*/{ |
|
101 |
//Opci?n de cachear siempre activada (Solo DEBUG) |
|
102 |
if(forceToLoadInCache) |
|
103 |
return new RasterCache(dataType, width, height, bandNr); |
|
104 |
if(forceToLoadInReadOnlyCache && filePath != null){ |
|
105 |
try { |
|
106 |
return new RasterReadOnlyHugeBuffer(dataType, width, height, bandNr, filePath); |
|
107 |
} catch (FileNotFoundException e) { |
|
108 |
//TODO: EXCEPTION: Modificar el lanzamiento de excepciones del RasterBuffer |
|
109 |
e.printStackTrace(); |
|
110 |
} catch (NotSupportedExtensionException e) { |
|
111 |
e.printStackTrace(); |
|
112 |
} catch (RasterDriverException e) { |
|
113 |
e.printStackTrace(); |
|
114 |
} |
|
115 |
} |
|
116 |
|
|
117 |
if(cacheOn){ |
|
118 |
long size = (RasterUtilities.getBytesFromRasterBufType(dataType) * width * height * bandNr) / 1024; |
|
119 |
long ms1 = cacheMemorySize * 1024; |
|
120 |
long ms2 = multicacheMemorySize * 1024; |
|
121 |
if(size <= ms1) |
|
128 | 122 |
return new RasterMemoryBuffer(dataType, width, height, bandNr, malloc); |
129 |
} |
|
130 |
|
|
131 |
/** |
|
132 |
* Reserva de memoria para el rasterbuf |
|
133 |
* @param dataType Tipo de dato |
|
134 |
* @param width Ancho |
|
135 |
* @param height Alto |
|
136 |
* @param bandNr Numero de bandas |
|
137 |
* @param orig |
|
138 |
*/ |
|
139 |
public abstract void malloc(int dataType, int width, int height, int bandNr); |
|
140 |
|
|
141 |
/* |
|
142 |
* (non-Javadoc) |
|
143 |
* @see org.gvsig.fmap.driver.IBuffer#getWidth() |
|
144 |
*/ |
|
145 |
public int getWidth() { |
|
146 |
return width; |
|
147 |
} |
|
123 |
else{ |
|
124 |
//if(filePath == null) |
|
125 |
return new RasterCache(dataType, width, height, bandNr); |
|
126 |
/*else |
|
127 |
return new RasterReadOnlyHugeBuffer(dataType, width, height, bandNr, filePath);*/ |
|
128 |
} |
|
129 |
}else |
|
130 |
return new RasterMemoryBuffer(dataType, width, height, bandNr, malloc); |
|
131 |
} |
|
132 |
|
|
133 |
/** |
|
134 |
* Reserva de memoria para el rasterbuf |
|
135 |
* @param dataType Tipo de dato |
|
136 |
* @param width Ancho |
|
137 |
* @param height Alto |
|
138 |
* @param bandNr Numero de bandas |
|
139 |
* @param orig |
|
140 |
*/ |
|
141 |
public abstract void malloc(int dataType, int width, int height, int bandNr); |
|
142 |
|
|
143 |
/* |
|
144 |
* (non-Javadoc) |
|
145 |
* @see org.gvsig.fmap.driver.IBuffer#getWidth() |
|
146 |
*/ |
|
147 |
public int getWidth() { |
|
148 |
return width; |
|
149 |
} |
|
148 | 150 |
|
149 |
/*
|
|
150 |
* (non-Javadoc)
|
|
151 |
* @see org.gvsig.fmap.driver.IBuffer#getHeight()
|
|
152 |
*/
|
|
153 |
public int getHeight() {
|
|
154 |
return height;
|
|
155 |
}
|
|
151 |
/* |
|
152 |
* (non-Javadoc) |
|
153 |
* @see org.gvsig.fmap.driver.IBuffer#getHeight() |
|
154 |
*/ |
|
155 |
public int getHeight() { |
|
156 |
return height; |
|
157 |
} |
|
156 | 158 |
|
157 |
/*
|
|
158 |
* (non-Javadoc)
|
|
159 |
* @see org.gvsig.fmap.driver.IBuffer#getBandCount()
|
|
160 |
*/
|
|
161 |
public int getBandCount() {
|
|
162 |
return nBands;
|
|
163 |
}
|
|
159 |
/* |
|
160 |
* (non-Javadoc) |
|
161 |
* @see org.gvsig.fmap.driver.IBuffer#getBandCount() |
|
162 |
*/ |
|
163 |
public int getBandCount() { |
|
164 |
return nBands; |
|
165 |
} |
|
164 | 166 |
|
165 |
/**
|
|
166 |
* Obtiene el tipo de dato. Los tipos de dato posibles est?n definidos en IRaster.
|
|
167 |
* @return tipo de datos
|
|
168 |
*/
|
|
167 |
/** |
|
168 |
* Obtiene el tipo de dato. Los tipos de dato posibles est?n definidos en IRaster. |
|
169 |
* @return tipo de datos |
|
170 |
*/ |
|
169 | 171 |
public int getDataType() { |
170 | 172 |
return dataType; |
171 | 173 |
} |
... | ... | |
381 | 383 |
return null; |
382 | 384 |
Histogram hist = new Histogram(getBandCount(), 256); |
383 | 385 |
for (int iBand = 0; iBand < getBandCount(); iBand++) |
384 |
for (int row = 0; row < getHeight(); row++) |
|
386 |
for (int row = 0; row < getHeight(); row++) {
|
|
385 | 387 |
for (int col = 0; col < getWidth(); col++) |
386 | 388 |
hist.incrementPxValue(iBand, (getElemByte(row, col, iBand) & 0xff)); |
389 |
if (isCanceled()) return null; |
|
390 |
percent = ((iBand*getHeight() + row) * 100) /(getHeight() * getBandCount()); |
|
391 |
} |
|
387 | 392 |
percent = 100; |
388 | 393 |
return hist; |
389 | 394 |
} |
... | ... | |
393 | 398 |
* @see org.gvsig.raster.driver.datasetproperties.IHistogramable#getHistogramUsingClasses(org.gvsig.raster.shared.DataClassList) |
394 | 399 |
*/ |
395 | 400 |
public Histogram getHistogramUsingClasses(DataClassList classes) throws HistogramException { |
401 |
percent = 0; |
|
396 | 402 |
Histogram hist = new Histogram(getBandCount(), classes.length()); |
397 | 403 |
for (int iBand = 0; iBand < getBandCount(); iBand++) { |
398 | 404 |
for (int col = 0; col < getHeight(); col++) { |
... | ... | |
407 | 413 |
} |
408 | 414 |
if(pixelValue >= 0) |
409 | 415 |
hist.incrementPxValue(iBand, pixelValue); |
410 |
} |
|
416 |
} |
|
417 |
if (isCanceled()) return null; |
|
418 |
percent = ((iBand*getHeight() + col) * 100) / (getHeight() * getBandCount()); |
|
411 | 419 |
} |
412 | 420 |
} |
421 |
percent = 100; |
|
413 | 422 |
return hist; |
414 | 423 |
} |
424 |
|
|
425 |
/* |
|
426 |
* (non-Javadoc) |
|
427 |
* @see org.gvsig.raster.util.IHistogramable#resetPercent() |
|
428 |
*/ |
|
429 |
public void resetPercent() { |
|
430 |
percent = 0; |
|
431 |
} |
|
432 |
|
|
433 |
/* |
|
434 |
* (non-Javadoc) |
|
435 |
* @see org.gvsig.raster.util.IHistogramable#getPercent() |
|
436 |
*/ |
|
437 |
public int getPercent() { |
|
438 |
return percent; |
|
439 |
} |
|
440 |
|
|
441 |
/* |
|
442 |
* (non-Javadoc) |
|
443 |
* @see org.gvsig.raster.util.ICancellable#isCanceled() |
|
444 |
*/ |
|
445 |
public boolean isCanceled() { |
|
446 |
return canceled; |
|
447 |
} |
|
448 |
|
|
449 |
/* |
|
450 |
* (non-Javadoc) |
|
451 |
* @see org.gvsig.raster.util.ICancellable#setCanceled(boolean) |
|
452 |
*/ |
|
453 |
public void setCanceled(boolean value) { |
|
454 |
canceled = value; |
|
455 |
} |
|
415 | 456 |
} |
Also available in: Unified diff