Revision 6342
org.gvsig.raster/branches/org.gvsig.raster.2.4/org.gvsig.raster/org.gvsig.raster.tilecache/org.gvsig.raster.tilecache.provider/src/main/java/org/gvsig/raster/tilecache/provider/TileStructImage.java | ||
---|---|---|
36 | 36 |
import javax.xml.parsers.DocumentBuilder; |
37 | 37 |
import javax.xml.parsers.DocumentBuilderFactory; |
38 | 38 |
|
39 |
import org.apache.commons.io.FileUtils; |
|
39 | 40 |
import org.apache.commons.io.FilenameUtils; |
40 | 41 |
import org.cresques.cts.IProjection; |
42 |
|
|
41 | 43 |
import org.gvsig.fmap.dal.DALFileLocator; |
42 | 44 |
import org.gvsig.fmap.dal.DataStoreProviderFactory; |
43 | 45 |
import org.gvsig.fmap.dal.exception.DataException; |
... | ... | |
56 | 58 |
import org.gvsig.raster.lib.buffer.api.Band; |
57 | 59 |
import org.gvsig.tools.dynobject.DynObject; |
58 | 60 |
import org.gvsig.tools.extensionpoint.ExtensionPoint.Extension; |
61 |
|
|
59 | 62 |
import org.slf4j.Logger; |
60 | 63 |
import org.slf4j.LoggerFactory; |
61 | 64 |
import org.w3c.dom.Document; |
... | ... | |
75 | 78 |
|
76 | 79 |
private int rowsPerTile; |
77 | 80 |
private int columnsPerTile; |
81 |
private FilesystemServerExplorerProviderFactory factory; |
|
78 | 82 |
private String providerName; |
79 |
private FilesystemServerExplorerProviderFactory factory;
|
|
83 |
private String extension;
|
|
80 | 84 |
private SortedMap<Integer,Double> pixelSizePerZoomLevel; |
81 |
// private SortedMap<Integer,Integer> rowsPerZoomLevel; |
|
82 |
// private SortedMap<Integer,Integer> columnsPerZoomLevel; |
|
83 | 85 |
private SortedMap<Integer,List<Integer>> rowsInZoomLevel; |
84 | 86 |
private SortedMap<Integer,List<Integer>> columnsInZoomLevel; |
85 | 87 |
private SortedMap<Integer,Envelope> envelopePerZoomLevel; |
86 |
// private SortedMap<Integer,Integer[][]> tileMatrixPerZoomLevel; |
|
87 | 88 |
private File tilesFolder; |
88 | 89 |
|
89 | 90 |
private int bandNumber; |
... | ... | |
93 | 94 |
private RasterStore tileStore; |
94 | 95 |
private IProjection crs; |
95 | 96 |
|
97 |
/** |
|
98 |
* @param folder |
|
99 |
* @param crs |
|
100 |
*/ |
|
96 | 101 |
public TileStructImage(File folder, IProjection crs){ |
97 | 102 |
|
98 | 103 |
this.crs=crs; |
... | ... | |
130 | 135 |
providerName=elementsByTagName.item(0).getTextContent(); |
131 | 136 |
|
132 | 137 |
FilesystemServerExplorerManager explorerManager = DALFileLocator.getFilesystemServerExplorerManager(); |
133 |
Iterator it = explorerManager.getRegisteredProviders(); |
|
138 |
@SuppressWarnings("unchecked") |
|
139 |
Iterator<Extension> it = explorerManager.getRegisteredProviders(); |
|
134 | 140 |
while(it.hasNext()){ |
135 | 141 |
|
136 |
Extension ext = (Extension) it.next();
|
|
142 |
Extension ext = it.next(); |
|
137 | 143 |
FilesystemServerExplorerProviderFactory providerFactory; |
138 | 144 |
try { |
139 | 145 |
providerFactory = (FilesystemServerExplorerProviderFactory) ext.create(); |
... | ... | |
181 | 187 |
Collections.sort(columnsList); |
182 | 188 |
this.columnsInZoomLevel.put(zoomLevel, columnsList); |
183 | 189 |
|
184 |
// columnsPerZoomLevel.put(zoomLevel, columnsNames.length*getColumnsPerTile()); |
|
185 | 190 |
int maxRows=0; |
186 | 191 |
Integer firstColumn=columnsList.get(0); |
187 | 192 |
Integer firstRow=null; |
... | ... | |
203 | 208 |
firstRow=rowsList.get(0); |
204 | 209 |
} |
205 | 210 |
} |
206 |
// rowsPerZoomLevel.put(zoomLevel, maxRows*getColumnsPerTile()); |
|
207 | 211 |
|
208 |
//FIXME: leer el primer tile para obtener el upperLeftPoint
|
|
212 |
//Leemos el primer tile para obtener el upperLeftPoint
|
|
209 | 213 |
File firstRowFile=null; |
210 | 214 |
File firstColumnFolder=new File(zoomFolder,String.valueOf(firstColumn)); |
211 | 215 |
String rowBaseName = String.valueOf(firstRow); |
... | ... | |
253 | 257 |
// TODO exception |
254 | 258 |
|
255 | 259 |
} |
260 |
this.extension = FilenameUtils.getExtension(firstRowFile.getAbsolutePath()); |
|
256 | 261 |
}else{ |
257 | 262 |
logger.info("Can't read tile structure"); |
258 | 263 |
|
259 | 264 |
} |
260 | 265 |
} |
261 | 266 |
|
267 |
/** |
|
268 |
* @param pixelSize |
|
269 |
* @return The appropiate zoom level for the pizelSize |
|
270 |
*/ |
|
262 | 271 |
public int getZoomLvlForPixelSize(double pixelSize){ |
263 | 272 |
int zoom=0; |
264 | 273 |
for (int i:pixelSizePerZoomLevel.keySet()){ |
... | ... | |
271 | 280 |
return zoom; |
272 | 281 |
} |
273 | 282 |
|
283 |
/** |
|
284 |
* @param buffer |
|
285 |
* @param band |
|
286 |
* @param zoomLevel |
|
287 |
* @param tileRow |
|
288 |
* @param tileCol |
|
289 |
*/ |
|
274 | 290 |
public void fetchTile(Buffer buffer, int band, int zoomLevel, int tileRow, int tileCol){ |
275 | 291 |
|
276 | 292 |
Integer structCol = columnsInZoomLevel.get(zoomLevel).get(tileCol); |
... | ... | |
281 | 297 |
File zoomFolder=new File(tilesFolder,String.valueOf(zoomLevel)); |
282 | 298 |
File firstColumnFolder=new File(zoomFolder,String.valueOf(structCol)); |
283 | 299 |
String rowBaseName = String.valueOf(structRow); |
284 |
File[] providerAcceptedFiles = firstColumnFolder.listFiles(factory); |
|
285 |
for (int i = 0; i < providerAcceptedFiles.length; i++) { |
|
286 |
File providerAcceptedFile = providerAcceptedFiles[i]; |
|
287 |
if(FilenameUtils.getBaseName(providerAcceptedFile.getAbsolutePath()).equalsIgnoreCase(rowBaseName)){ |
|
288 |
tileFile = providerAcceptedFile; |
|
289 |
} |
|
290 |
} |
|
300 |
tileFile = new File(firstColumnFolder.getAbsolutePath()+File.separatorChar+rowBaseName+"."+this.extension); |
|
301 |
|
|
291 | 302 |
if ( tileFile!=null ){ |
292 |
DataManagerProviderServices manager = DALSPILocator.getDataManagerProviderServices(); |
|
293 |
DataStoreProviderFactory providerFactory = manager.getStoreProviderFactory(providerName); |
|
294 |
DynObject params = providerFactory.createParameters(); |
|
295 |
if (params.getDynClass().getDynField("file")!=null){ |
|
296 |
params.setDynValue("file", tileFile); |
|
297 |
} |
|
298 |
if (params.getDynClass().getDynField("crs")!=null){ |
|
299 |
params.setDynValue("crs", this.crs); |
|
300 |
} |
|
301 |
// RasterStore store; |
|
302 | 303 |
try { |
303 |
this.tileStore = (RasterStore) manager.openStore(providerName,params); |
|
304 |
File fileParam = (File) tileStore.getParameters().getDynValue("file"); |
|
305 |
if (tileStore == null || (tileStore != null && (fileParam.compareTo(tileFile)!=0))) { |
|
306 |
DataManagerProviderServices manager = DALSPILocator.getDataManagerProviderServices(); |
|
307 |
DataStoreProviderFactory providerFactory = manager.getStoreProviderFactory(providerName); |
|
308 |
DynObject params = providerFactory.createParameters(); |
|
309 |
if (params.getDynClass().getDynField("file") != null) { |
|
310 |
params.setDynValue("file", tileFile); |
|
311 |
} |
|
312 |
if (params.getDynClass().getDynField("crs") != null) { |
|
313 |
params.setDynValue("crs", this.crs); |
|
314 |
} |
|
315 |
if(tileStore!=null){ |
|
316 |
// RasterStore store; |
|
317 |
tileStore.dispose(); |
|
318 |
} |
|
319 |
this.tileStore = (RasterStore) manager.openStore(providerName, params); |
|
320 |
} |
|
304 | 321 |
Band tileBand = tileStore.getRasterSet().getBand(band); |
305 | 322 |
Object rowBuffer = tileBand.createRowBuffer(); |
306 |
for(int r=0; r<tileBand.getRows(); r++){
|
|
323 |
for (int r = 0; r < tileBand.getRows(); r++) {
|
|
307 | 324 |
tileBand.fetchRow(r, rowBuffer); |
308 |
System.arraycopy(rowBuffer, 0, buffer.array(), r*tileBand.getColumns(), tileBand.getColumns());
|
|
325 |
System.arraycopy(rowBuffer, 0, buffer.array(), r * tileBand.getColumns(), tileBand.getColumns());
|
|
309 | 326 |
} |
310 | 327 |
} catch (ValidateDataParametersException | DataException e) { |
311 |
// TODO Auto-generated catch block |
|
312 |
e.printStackTrace(); |
|
328 |
logger.warn("Can't fetch tile: zoomLevel = "+zoomLevel+", tileRow = "+tileRow+", tileColumn = "+tileCol+", band = "+band+".", e); |
|
313 | 329 |
} |
314 | 330 |
} |
315 | 331 |
} |
316 | 332 |
|
333 |
/** |
|
334 |
* @return the band number |
|
335 |
*/ |
|
317 | 336 |
public int getBandNumber(){ |
318 | 337 |
return this.bandNumber; |
319 | 338 |
} |
320 | 339 |
|
340 |
/** |
|
341 |
* @return the data types |
|
342 |
*/ |
|
321 | 343 |
public int[] getDataTypes(){ |
322 | 344 |
return this.dataTypes; |
323 | 345 |
} |
324 | 346 |
|
347 |
/** |
|
348 |
* @param zoomLevel |
|
349 |
* @return rows per zoom level |
|
350 |
*/ |
|
325 | 351 |
public int getRows(int zoomLevel){ |
326 | 352 |
return rowsInZoomLevel.get(zoomLevel).size()*rowsPerTile; |
327 | 353 |
//rowsPerZoomLevel.get(zoomLevel); |
328 | 354 |
} |
329 | 355 |
|
356 |
/** |
|
357 |
* @param zoomLevel |
|
358 |
* @return columns per zoom level |
|
359 |
*/ |
|
330 | 360 |
public int getColumns(int zoomLevel){ |
331 | 361 |
return columnsInZoomLevel.get(zoomLevel).size()*columnsPerTile; |
332 |
|
|
333 |
// return columnsPerZoomLevel.get(zoomLevel); |
|
334 | 362 |
} |
335 | 363 |
|
364 |
/** |
|
365 |
* @param zoomLevel |
|
366 |
* @return envelope por zoom level |
|
367 |
*/ |
|
336 | 368 |
public Envelope getEnvelopePerZoomLevel(int zoomLevel){ |
337 | 369 |
return envelopePerZoomLevel.get(zoomLevel); |
338 | 370 |
} |
339 | 371 |
|
372 |
/** |
|
373 |
* @return the rows number per tile |
|
374 |
*/ |
|
340 | 375 |
public int getRowsPerTile() { |
341 | 376 |
return rowsPerTile; |
342 | 377 |
} |
343 | 378 |
|
379 |
/** |
|
380 |
* @return the columns number per tile |
|
381 |
*/ |
|
344 | 382 |
public int getColumnsPerTile() { |
345 | 383 |
return columnsPerTile; |
346 | 384 |
} |
347 | 385 |
|
386 |
/** |
|
387 |
* @return the provider name |
|
388 |
*/ |
|
348 | 389 |
public String getProviderName() { |
349 | 390 |
return providerName; |
350 | 391 |
} |
351 | 392 |
|
352 | 393 |
|
394 |
/** |
|
395 |
* @return the store of the loaded tile |
|
396 |
*/ |
|
353 | 397 |
public RasterStore getTileStore() { |
354 | 398 |
return tileStore; |
355 | 399 |
} |
Also available in: Unified diff