Revision 5525 org.gvsig.raster/branches/org.gvsig.raster.2.4/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.buffer/org.gvsig.raster.lib.buffer.impl/src/main/java/org/gvsig/raster/lib/buffer/impl/DefaultBuffer.java
DefaultBuffer.java | ||
---|---|---|
1 | 1 |
package org.gvsig.raster.lib.buffer.impl; |
2 | 2 |
|
3 |
import java.awt.geom.AffineTransform; |
|
3 | 4 |
import java.util.ArrayList; |
4 | 5 |
import java.util.Iterator; |
5 | 6 |
import java.util.List; |
6 | 7 |
|
7 | 8 |
import org.cresques.cts.ICoordTrans; |
8 | 9 |
import org.cresques.cts.IProjection; |
9 |
import org.slf4j.Logger; |
|
10 |
import org.slf4j.LoggerFactory; |
|
11 |
|
|
12 | 10 |
import org.gvsig.fmap.geom.Geometry; |
13 | 11 |
import org.gvsig.fmap.geom.GeometryLocator; |
14 | 12 |
import org.gvsig.fmap.geom.operation.GeometryOperationException; |
... | ... | |
28 | 26 |
import org.gvsig.raster.lib.buffer.api.NoData; |
29 | 27 |
import org.gvsig.raster.lib.buffer.api.PageManager; |
30 | 28 |
import org.gvsig.raster.lib.buffer.api.exceptions.BandException; |
29 |
import org.gvsig.raster.lib.buffer.api.exceptions.BufferException; |
|
31 | 30 |
import org.gvsig.raster.lib.buffer.api.statistics.Statistics; |
32 | 31 |
import org.gvsig.raster.lib.buffer.impl.exceptions.CreateBufferException; |
33 | 32 |
import org.gvsig.raster.lib.buffer.impl.statistics.DefaultStatistics; |
34 | 33 |
import org.gvsig.tools.task.SimpleTaskStatus; |
34 |
import org.slf4j.Logger; |
|
35 |
import org.slf4j.LoggerFactory; |
|
35 | 36 |
|
36 | 37 |
/** |
37 | 38 |
* @author fdiaz |
... | ... | |
67 | 68 |
* Projection of buffer |
68 | 69 |
* @param envelope |
69 | 70 |
* Envelope of buffer |
70 |
* @param pageManager |
|
71 |
* @param pageManagers
|
|
71 | 72 |
* Page manager to paginate this buffer. If page manager is null, |
72 | 73 |
* buffer will be loaded in memory. |
73 | 74 |
* @throws CreateBufferException |
74 | 75 |
* If there are some problems creating buffer. |
75 | 76 |
*/ |
76 | 77 |
public DefaultBuffer(int rows, int columns, int[] bandDataTypes, NoData[] bandNoData, |
77 |
IProjection projection, Envelope envelope, PageManager pageManager)
|
|
78 |
IProjection projection, Envelope envelope, List<PageManager> pageManagers)
|
|
78 | 79 |
throws CreateBufferException { |
79 | 80 |
this.bands = new ArrayList<Band>(); |
80 | 81 |
this.rows = rows; |
... | ... | |
84 | 85 |
try { |
85 | 86 |
if (envelope == null) { |
86 | 87 |
this.envelope = |
87 |
GeometryLocator.getGeometryManager().createEnvelope(0, 0, columns, rows, Geometry.SUBTYPES.GEOM2D); |
|
88 |
GeometryLocator.getGeometryManager().createEnvelope(0, 0, columns, rows, |
|
89 |
Geometry.SUBTYPES.GEOM2D); |
|
88 | 90 |
} |
89 |
this.bandPageManager = pageManager;
|
|
90 |
createBands(bandDataTypes, bandNoData); |
|
91 |
// this.bandPageManager = pageManagers;
|
|
92 |
createBands(bandDataTypes, bandNoData, pageManagers);
|
|
91 | 93 |
} catch (Exception e) { |
92 | 94 |
throw new CreateBufferException(e); |
93 | 95 |
} |
94 | 96 |
} |
95 | 97 |
|
96 |
private void createBands(int[] bandDataTypes, NoData[] bandNoData) throws BandException { |
|
97 |
|
|
98 |
private void createBands(int[] bandDataTypes, NoData[] bandNoData, |
|
99 |
List<PageManager> pageManagers) throws BandException { |
|
100 |
|
|
98 | 101 |
BufferManager bufferManager = BufferLocator.getBufferManager(); |
99 | 102 |
|
100 | 103 |
for (int i = 0; i < bandDataTypes.length; i++) { |
... | ... | |
103 | 106 |
if (bandNoData != null && i < bandNoData.length) { |
104 | 107 |
noDataBand = bandNoData[i]; |
105 | 108 |
} |
109 |
|
|
110 |
PageManager pageManager = null; |
|
111 |
if (pageManagers != null && i < pageManagers.size()) { |
|
112 |
pageManager = pageManagers.get(i); |
|
113 |
} |
|
106 | 114 |
|
107 | 115 |
bands.add(bufferManager.createBand(bandDataTypes[i], this.rows, this.columns, |
108 |
noDataBand, this.bandPageManager));
|
|
116 |
noDataBand, pageManager));
|
|
109 | 117 |
} |
110 | 118 |
} |
111 | 119 |
|
... | ... | |
184 | 192 |
@Override |
185 | 193 |
public void addBand(Band band) { |
186 | 194 |
|
187 |
if(band.getColumns() != this.getColumns() || band.getRows() != this.getRows()){
|
|
195 |
if (band.getColumns() != this.getColumns() || band.getRows() != this.getRows()) {
|
|
188 | 196 |
throw new IllegalArgumentException( |
189 | 197 |
"Can not add band to buffer. Band must have the same rows and columns as buffer."); |
190 | 198 |
} |
... | ... | |
274 | 282 |
} |
275 | 283 |
|
276 | 284 |
List<Band> auxBands = new ArrayList<Band>(bands.size()); |
277 |
for(int i=0; i < visited.size(); i++){
|
|
285 |
for (int i = 0; i < visited.size(); i++) {
|
|
278 | 286 |
auxBands.add(bands.get(visited.get(i))); |
279 | 287 |
} |
280 | 288 |
bands = auxBands; |
... | ... | |
295 | 303 |
} |
296 | 304 |
|
297 | 305 |
@Override |
298 |
public Buffer convert(ICoordTrans ct, SimpleTaskStatus status) { |
|
306 |
public Buffer convert(ICoordTrans ct, SimpleTaskStatus status) throws BufferException {
|
|
299 | 307 |
|
300 |
// for (Band band : bands) { |
|
301 |
// band.convert(ct); |
|
302 |
// |
|
303 |
// } |
|
308 |
if (this.getEnvelope() == null) { |
|
309 |
throw new IllegalStateException( |
|
310 |
"Buffer envelope is null. A buffer allways has to have envelope"); |
|
311 |
} |
|
312 |
|
|
313 |
Envelope projectedBufferEnvelope = this.getEnvelope().convert(ct); |
|
314 |
double projectedBufferCellSizeX = projectedBufferEnvelope.getLength(0) / this.columns; |
|
315 |
double projectedBufferCellSizeY = projectedBufferEnvelope.getLength(1) / this.rows; |
|
316 |
int projectedBufferRows = |
|
317 |
(int) Math.ceil(projectedBufferEnvelope.getLength(0) / projectedBufferCellSizeX); |
|
318 |
int projectedBufferColumns = |
|
319 |
(int) Math.ceil(projectedBufferEnvelope.getLength(1) / projectedBufferCellSizeY); |
|
320 |
|
|
321 |
int[] bandDataTypes = this.getBandTypes(); |
|
322 |
NoData[] bandNoData = this.getBandNoData(); |
|
323 |
List<PageManager> pageManagers = |
|
324 |
BufferLocator.getBufferManager().createSimpleBandPageManagerList(null, |
|
325 |
projectedBufferRows, projectedBufferColumns, bandDataTypes); |
|
326 |
|
|
327 |
Buffer projectedBuffer = |
|
328 |
BufferLocator.getBufferManager().createBuffer(projectedBufferRows, |
|
329 |
projectedBufferColumns, bandDataTypes, bandNoData, ct.getPDest(), |
|
330 |
projectedBufferEnvelope, pageManagers); |
|
331 |
|
|
332 |
// This affine transform allow us to convert pixel to coordinate and |
|
333 |
// inverse |
|
334 |
AffineTransform projectedBufferAf = |
|
335 |
calculateAffineTransform(projectedBufferEnvelope, projectedBufferRows, |
|
336 |
projectedBufferColumns); |
|
337 |
|
|
338 |
for (int row = 0; row < projectedBuffer.getRows(); row++) { |
|
339 |
for (int col = 0; col < projectedBuffer.getColumns(); col++) { |
|
340 |
|
|
341 |
// Point worldPoint = new Poin2: |
|
342 |
|
|
343 |
} |
|
344 |
} |
|
345 |
|
|
346 |
return null; |
|
347 |
} |
|
348 |
|
|
349 |
private AffineTransform calculateAffineTransform(Envelope projectedBufferEnvelope, |
|
350 |
int projectedBufferRows, int projectedBufferColumns) { |
|
304 | 351 |
// TODO Auto-generated method stub |
305 | 352 |
return null; |
306 | 353 |
} |
307 | 354 |
|
355 |
public int[] getBandTypes() { |
|
356 |
int[] bandDataTypes = new int[this.getBandCount()]; |
|
357 |
for (int i = 0; i < this.bands.size(); i++) { |
|
358 |
bandDataTypes[i] = this.bands.get(i).getDataType(); |
|
359 |
} |
|
360 |
return bandDataTypes; |
|
361 |
} |
|
362 |
|
|
363 |
public NoData[] getBandNoData() { |
|
364 |
NoData[] bandNoData = new NoData[this.getBandCount()]; |
|
365 |
for (int i = 0; i < this.bands.size(); i++) { |
|
366 |
bandNoData[i] = this.bands.get(i).getNoData(); |
|
367 |
} |
|
368 |
return bandNoData; |
|
369 |
} |
|
370 |
|
|
308 | 371 |
@Override |
309 | 372 |
public boolean isPaginated() { |
310 | 373 |
return bandPageManager != null; |
... | ... | |
312 | 375 |
|
313 | 376 |
@Override |
314 | 377 |
public boolean isReadOnly() { |
315 |
if(this.bandPageManager==null){
|
|
378 |
if (this.bandPageManager == null) {
|
|
316 | 379 |
return false; |
317 | 380 |
} |
318 | 381 |
return !this.bandPageManager.isSupportedSave(); |
Also available in: Unified diff