Revision 6342

View differences:

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