Revision 6509

View differences:

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/SimpleBandTileManager.java
15 15
import org.gvsig.raster.lib.buffer.api.BandTileManager;
16 16
import org.gvsig.raster.lib.buffer.api.BufferLocator;
17 17
import org.gvsig.raster.lib.buffer.api.BufferManager;
18
import org.gvsig.raster.lib.buffer.api.TileStruct;
18 19

  
19 20

  
21
/**
22
 * @author fdiaz
23
 *
24
 */
25
@Deprecated
20 26
public class SimpleBandTileManager implements BandTileManager {
21 27

  
22 28
    private RandomAccessFile  raf;
......
157 163
        return columnsPerTile;
158 164
    }
159 165

  
166
    @Override
167
    public TileStruct getTileStruct() {
168
        // TODO Auto-generated method stub
169
        return null;
170
    }
171

  
160 172
}
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.api/src/main/java/org/gvsig/raster/lib/buffer/api/TileStruct.java
1
/* gvSIG. Desktop Geographic Information System.
2
 *
3
 * Copyright ? 2007-2016 gvSIG Association
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18
 * MA  02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us
21
 * at info AT gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.raster.lib.buffer.api;
24

  
25
import java.util.Map;
26
import java.util.SortedMap;
27

  
28
import org.gvsig.fmap.geom.primitive.Envelope;
29

  
30

  
31

  
32
/**
33
 * @author fdiaz
34
 *
35
 */
36
public interface TileStruct {
37

  
38
    /**
39
     * @return the rowsPerTile
40
     */
41
    public int getRowsPerTile();
42

  
43
    /**
44
     * @param rowsPerTile
45
     *            the rowsPerTile to set
46
     */
47
    public void setRowsPerTile(int rowsPerTile);
48

  
49
    /**
50
     * @return the columnsPerTile
51
     */
52
    public int getColumnsPerTile();
53

  
54
    /**
55
     * @param columnsPerTile
56
     *            the columnsPerTile to set
57
     */
58
    public void setColumnsPerTile(int columnsPerTile);
59

  
60
    /**
61
     * @return the providerName
62
     */
63
    public String getProviderName();
64

  
65
    /**
66
     * @param providerName
67
     *            the providerName to set
68
     */
69
    public void setProviderName(String providerName);
70

  
71
    /**
72
     * @return the pixelSizePerZoomLevel
73
     */
74
    public Map<Integer, Double> getPixelSizePerZoomLevel();
75

  
76
    /**
77
     * @param pixelSizePerZoomLevel
78
     *            the pixelSizePerZoomLevel to set
79
     */
80
    public void setPixelSizePerZoomLevel(SortedMap<Integer, Double> pixelSizePerZoomLevel);
81

  
82
    /**
83
     * @return the envelope
84
     */
85
    public Envelope getEnvelope();
86

  
87
    /**
88
     * @param envelope
89
     *            the envelope to set
90
     */
91
    public void setEnvelope(Envelope envelope);
92

  
93
}
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.api/src/main/java/org/gvsig/raster/lib/buffer/api/BandTileManager.java
23 23
     * @return
24 24
     */
25 25
    public int getColumnsPerTile();
26

  
27
    public TileStruct getTileStruct();
26 28
}
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.spi/src/main/java/org/gvsig/raster/lib/buffer/spi/DefaultTileStruct.java
1
/* gvSIG. Desktop Geographic Information System.
2
 *
3
 * Copyright ? 2007-2016 gvSIG Association
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18
 * MA  02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us
21
 * at info AT gvsig.com, or visit our website www.gvsig.com.
22
 */
23

  
24
package org.gvsig.raster.lib.buffer.spi;
25

  
26
import java.util.Iterator;
27
import java.util.Set;
28
import java.util.SortedMap;
29
import java.util.Map.Entry;
30

  
31
import org.gvsig.fmap.geom.primitive.Envelope;
32
import org.gvsig.raster.lib.buffer.api.TileStruct;
33
import org.gvsig.tools.dispose.Disposable;
34
import org.gvsig.tools.dispose.DisposeUtils;
35
import org.gvsig.tools.dispose.impl.AbstractDisposable;
36
import org.gvsig.tools.exception.BaseException;
37

  
38

  
39
/**
40
 * @author fdiaz
41
 *
42
 */
43
public class DefaultTileStruct extends AbstractDisposable implements TileStruct{
44

  
45
    private int rowsPerTile;
46
    private int columnsPerTile;
47
    private String providerName;
48
    private SortedMap<Integer, Double> pixelSizePerZoomLevel;
49
    private Envelope envelope;
50

  
51
    public int getRowsPerTile() {
52
        return rowsPerTile;
53
    }
54

  
55
    public void setRowsPerTile(int rowsPerTile) {
56
        this.rowsPerTile = rowsPerTile;
57
    }
58

  
59
    public int getColumnsPerTile() {
60
        return columnsPerTile;
61
    }
62

  
63
    public void setColumnsPerTile(int columnsPerTile) {
64
        this.columnsPerTile = columnsPerTile;
65
    }
66

  
67
    public String getProviderName() {
68
        return providerName;
69
    }
70

  
71
    public void setProviderName(String providerName) {
72
        this.providerName = providerName;
73
    }
74

  
75
    public SortedMap<Integer, Double> getPixelSizePerZoomLevel() {
76
        return pixelSizePerZoomLevel;
77
    }
78

  
79
    public void setPixelSizePerZoomLevel(SortedMap<Integer, Double> pixelSizePerZoomLevel) {
80
        this.pixelSizePerZoomLevel = pixelSizePerZoomLevel;
81
    }
82

  
83
    public Envelope getEnvelope() {
84
        return envelope;
85
    }
86

  
87
    public void setEnvelope(Envelope envelope) {
88
        this.envelope = envelope;
89
    }
90

  
91
    @Override
92
    protected void doDispose() throws BaseException {
93

  
94
        if (pixelSizePerZoomLevel != null) {
95
            pixelSizePerZoomLevel.clear();
96
        }
97
        pixelSizePerZoomLevel = null;
98
        envelope = null;
99

  
100
    }
101

  
102
}
org.gvsig.raster/branches/org.gvsig.raster.2.4/org.gvsig.raster/org.gvsig.raster.gdal/org.gvsig.raster.gdal.provider/src/main/java/org/gvsig/raster/gdal/provider/RasterGdalBandTileManager.java
15 15

  
16 16
import org.gdal.gdal.Band;
17 17
import org.gdal.gdal.Dataset;
18

  
18 19
import org.gvsig.raster.lib.buffer.api.BandInfo;
19 20
import org.gvsig.raster.lib.buffer.api.BandPageManager;
20 21
import org.gvsig.raster.lib.buffer.api.BandTileManager;
21 22
import org.gvsig.raster.lib.buffer.api.BufferLocator;
22 23
import org.gvsig.raster.lib.buffer.api.BufferManager;
24
import org.gvsig.raster.lib.buffer.api.TileStruct;
23 25

  
24 26
/**
25 27
 * Band Page Manager for a Memory Image
......
27 29
 * @author dmartinezizquierdo
28 30
 *
29 31
 */
32
@Deprecated
30 33
public class RasterGdalBandTileManager implements BandTileManager {
31 34

  
32 35
    private Band gdalBand;
......
133 136
        return this.columnsPerTile;
134 137
    }
135 138

  
139
    @Override
140
    public TileStruct getTileStruct() {
141
        // TODO Auto-generated method stub
142
        return null;
143
    }
144

  
136 145
}
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
23 23
package org.gvsig.raster.tilecache.provider;
24 24

  
25 25
import java.io.File;
26
import java.io.IOException;
27
import java.util.ArrayList;
26 28
import java.util.HashMap;
27 29
import java.util.Iterator;
30
import java.util.List;
28 31
import java.util.Map;
29 32
import java.util.Map.Entry;
30 33
import java.util.Set;
......
33 36

  
34 37
import javax.xml.parsers.DocumentBuilder;
35 38
import javax.xml.parsers.DocumentBuilderFactory;
39
import javax.xml.parsers.ParserConfigurationException;
40
import javax.xml.transform.OutputKeys;
41
import javax.xml.transform.Transformer;
42
import javax.xml.transform.TransformerException;
43
import javax.xml.transform.TransformerFactory;
44
import javax.xml.transform.dom.DOMSource;
45
import javax.xml.transform.stream.StreamResult;
36 46

  
37 47
import org.apache.commons.io.FilenameUtils;
38 48
import org.cresques.cts.IProjection;
39 49
import org.slf4j.Logger;
40 50
import org.slf4j.LoggerFactory;
51
import org.w3c.dom.Attr;
41 52
import org.w3c.dom.Document;
42 53
import org.w3c.dom.Element;
43 54
import org.w3c.dom.NamedNodeMap;
......
47 58
import org.gvsig.fmap.dal.DALFileLocator;
48 59
import org.gvsig.fmap.dal.DataServerExplorer;
49 60
import org.gvsig.fmap.dal.DataServerExplorerParameters;
61
import org.gvsig.fmap.dal.DataStore;
50 62
import org.gvsig.fmap.dal.DataStoreProviderFactory;
51 63
import org.gvsig.fmap.dal.exception.DataException;
52 64
import org.gvsig.fmap.dal.exception.InitializeException;
......
71 83
import org.gvsig.raster.lib.buffer.api.Buffer;
72 84
import org.gvsig.raster.lib.buffer.api.BufferLocator;
73 85
import org.gvsig.raster.lib.buffer.api.BufferManager;
86
import org.gvsig.raster.lib.buffer.api.TileStruct;
74 87
import org.gvsig.raster.lib.buffer.api.exceptions.BufferException;
88
import org.gvsig.raster.lib.buffer.spi.DefaultTileStruct;
75 89
import org.gvsig.tools.ToolsLocator;
90
import org.gvsig.tools.dispose.Disposable;
76 91
import org.gvsig.tools.dispose.DisposeUtils;
77 92
import org.gvsig.tools.dispose.impl.AbstractDisposable;
78 93
import org.gvsig.tools.dynobject.DynObject;
......
91 106
    private static final Logger logger = LoggerFactory.getLogger(TileStructImage.class);
92 107
    private static final int MAX_RECENT_ACCEDED_TILES_NUMBER = 50;
93 108

  
94
    private int rowsPerTile;
95
    private int columnsPerTile;
96 109
    private FilesystemServerExplorerProviderFactory factory;
97
    private String providerName;
98 110
    private String extension;
99
    private SortedMap<Integer, Double> pixelSizePerZoomLevel;
100
    // private SortedMap<Integer,Envelope> envelopePerZoomLevel;
101 111
    private File tilesFolder;
102 112
    private Map<String, Tile> recentAccededTiles;
103 113

  
......
106 116
    private int[] dataTypes;
107 117

  
108 118
    private IProjection crs;
109
    private Envelope structExtent;
110 119
    private Object colorInterpretation;
111 120
    private Object legend;
112 121
    private Object colorTable;
113 122

  
114 123
    private RasterStoreProvider innerProvider;
115 124
    private RasterQuery query;
125
    private TileStruct tileStruct;
116 126

  
117 127
    /**
118 128
     * @param folder
......
125 135
        this.innerProvider = innerProvider;
126 136
        this.query = query;
127 137
        GeometryManager geoManager = GeometryLocator.getGeometryManager();
138
        tileStruct = new DefaultTileStruct();
128 139

  
129
        // envelopePerZoomLevel = new TreeMap<Integer, Envelope>();
130
        pixelSizePerZoomLevel = new TreeMap<Integer, Double>();
140
        // FIXME
141
        File tilePropertiesFile = new File(folder, "tileCacheStruct.xml");
142
        if (!tilePropertiesFile.exists()) {
143
            createTileCacheStructXMLFile(folder);
144
        }
145

  
146
        TreeMap<Integer, Double> pixelSizePerZoomLevel = new TreeMap<Integer, Double>();
131 147
        recentAccededTiles = new HashMap<String, Tile>();
132 148

  
133
        // FIXME
134
        File tilePropertiesFile = new File(folder, "tileCacheStruct.xml");
135 149
        tilesFolder = new File(folder, "V" + File.separatorChar + "Z" + File.separatorChar + "T");
136 150
        if (!tilesFolder.exists()) {
137 151
            tilesFolder.mkdirs();
......
153 167
                    Element eElement = (Element) nNode;
154 168

  
155 169
                    NamedNodeMap tileSizeAttributes = eElement.getElementsByTagName("tileSize").item(0).getAttributes();
156
                    rowsPerTile = Integer.valueOf(tileSizeAttributes.getNamedItem("rows").getNodeValue());
157
                    columnsPerTile = Integer.valueOf(tileSizeAttributes.getNamedItem("columns").getNodeValue());
170
                    tileStruct.setRowsPerTile(Integer.valueOf(tileSizeAttributes.getNamedItem("rows").getNodeValue()));
171
                    tileStruct.setColumnsPerTile(Integer.valueOf(tileSizeAttributes.getNamedItem("columns").getNodeValue()));
158 172

  
159 173
                    NodeList elementsByTagName = eElement.getElementsByTagName("format");
160
                    providerName = elementsByTagName.item(0).getTextContent();
174
                    tileStruct.setProviderName(elementsByTagName.item(0).getTextContent());
161 175

  
162 176
                    NodeList structExtentList = eElement.getElementsByTagName("structExtent");
163 177
                    if (structExtentList.getLength() > 0) {
......
171 185
                                Double.valueOf(structExtentNode.getElementsByTagName("maxX").item(0).getTextContent());
172 186
                            Double maxY =
173 187
                                Double.valueOf(structExtentNode.getElementsByTagName("maxY").item(0).getTextContent());
174
                            structExtent = geoManager.createEnvelope(minX, minY, maxX, maxY, SUBTYPES.GEOM2D);
175
                        }
188
                            tileStruct.setEnvelope(geoManager.createEnvelope(minX, minY, maxX, maxY, SUBTYPES.GEOM2D));                        }
176 189
                    }
177 190

  
178 191
                    FilesystemServerExplorerManager explorerManager =
......
185 198
                        FilesystemServerExplorerProviderFactory providerFactory;
186 199
                        try {
187 200
                            providerFactory = (FilesystemServerExplorerProviderFactory) ext.create();
188
                            if (providerFactory.getName().equalsIgnoreCase(providerName)) {
201
                            if (providerFactory.getName().equalsIgnoreCase(tileStruct.getProviderName())) {
189 202
                                this.factory = providerFactory;
190 203
                                break;
191 204
                            }
......
207 220
                        pixelSizePerZoomLevel.put(zoomLevel, pixelSize);
208 221

  
209 222
                    }
223
                    this.tileStruct.setPixelSizePerZoomLevel(pixelSizePerZoomLevel);
210 224
                }
211 225
            }
212 226
        } catch (Exception e) {
......
220 234
     */
221 235
    public int getZoomLvlForPixelSize(double pixelSize) {
222 236
        int zoom = 0;
237
        Map<Integer, Double> pixelSizePerZoomLevel = tileStruct.getPixelSizePerZoomLevel();
223 238
        for (int i : pixelSizePerZoomLevel.keySet()) {
224 239
            zoom = i;
225 240
            double levelPixelSize = pixelSizePerZoomLevel.get(zoom);
......
271 286
                ToolsLocator.getDisposableManager().bind(band);
272 287
                return band;
273 288
            } catch (DataException | BufferException e) {
274
                logger.warn("Can't fetch tile: zoomLevel = " + zoomLevel + ", tileRow = " + structRow + ", tileColumn = "
275
                    + structCol + ", band = " + bandNumber + ".", e);
289
                logger.warn("Can't fetch tile: zoomLevel = " + zoomLevel + ", tileRow = " + structRow
290
                    + ", tileColumn = " + structCol + ", band = " + bandNumber + ".", e);
276 291
                return null;
277 292
            } finally {
278
                if (tileStore != null) {
279
                    DisposeUtils.dispose(tileStore);
280
                    tileStore = null;
281
                }
282
                if (tileStoreRasterSet != null) {
283
                    DisposeUtils.dispose(tileStoreRasterSet);
284
                    tileStoreRasterSet = null;
285
                }
286
                if (rasterSet != null) {
287
                    DisposeUtils.dispose(rasterSet);
288
                    rasterSet = null;
289
                }
293
                DisposeUtils.dispose(tileStore);
294
                tileStore = null;
295
                DisposeUtils.dispose(tileStoreRasterSet);
296
                tileStoreRasterSet = null;
297
                DisposeUtils.dispose(rasterSet);
298
                rasterSet = null;
290 299
            }
291 300
        }
292 301
    }
......
330 339
        }
331 340
        RasterStore tileStore = null;
332 341
        DataManagerProviderServices manager = DALSPILocator.getDataManagerProviderServices();
333
        DataStoreProviderFactory providerFactory = manager.getStoreProviderFactory(providerName);
342
        DataStoreProviderFactory providerFactory = manager.getStoreProviderFactory(this.tileStruct.getProviderName());
334 343

  
335 344
        DynObject params = providerFactory.createParameters();
336 345
        if (params.getDynClass().getDynField("file") != null) {
......
340 349
            params.setDynValue("crs", this.crs);
341 350
        }
342 351

  
343
        tileStore = (RasterStore) manager.openStore(providerName, params);
352
        tileStore = (RasterStore) manager.openStore(this.tileStruct.getProviderName(), params);
344 353
        return tileStore;
345 354
    }
346 355

  
347
    private File requestTileFile(int zoomLevel, int structRow, int structCol) throws CreateEnvelopeException, CloneNotSupportedException, BufferException, ValidateDataParametersException, DataException {
356
    private File requestTileFile(int zoomLevel, int structRow, int structCol) throws CreateEnvelopeException,
357
        CloneNotSupportedException, BufferException, ValidateDataParametersException, DataException {
348 358

  
349 359
        RasterQuery rasterQuery = (RasterQuery) this.query.clone();
350 360

  
351
        Double pixelSize = this.pixelSizePerZoomLevel.get(zoomLevel);
361
        Double pixelSize = this.tileStruct.getPixelSizePerZoomLevel().get(zoomLevel);
352 362
        rasterQuery.setPixelSize(pixelSize);
353 363

  
354 364
        GeometryManager geomManager = GeometryLocator.getGeometryManager();
355 365

  
366
        Envelope structExtent = this.tileStruct.getEnvelope();
367
        int rowsPerTile = this.tileStruct.getRowsPerTile();
368
        int columnsPerTile = this.tileStruct.getColumnsPerTile();
356 369
        double minX = structExtent.getMinimum(DIMENSIONS.X) + structCol * (pixelSize * columnsPerTile);
357 370
        double minY = structExtent.getMaximum(DIMENSIONS.Y) - ((structRow + 1) * (pixelSize * rowsPerTile));
358 371
        double maxX = minX + pixelSize * columnsPerTile;
......
405 418
            params.setDynValue("compress", "NONE");
406 419
            params.setDynValue("tfw", false);
407 420

  
408
            //FIXME: Ver de coger estos dos valores del inner provider para que los tiles sean homog?neos con el raster original
409
            params.setDynValue("photometric", "RGB");
410
            params.setDynValue("alpha", "NON-PREMULTIPLIED");
421
            // FIXME: Ver de coger estos dos valores del inner provider para que
422
            // los tiles sean homog?neos con el raster original
423
            int bands = innerProvider.getBands();
424
            switch (bands) {
425
            case 3:
426
                params.setDynValue("photometric", "RGB");
427
                break;
428
            case 4:
429
                params.setDynValue("photometric", "RGB");
430
                params.setDynValue("alpha", "NON-PREMULTIPLIED");
431
                break;
432
            default:
433
                params.setDynValue("photometric", "MIN_IS_BLACK");
434
                break;
435
            }
411 436

  
412 437
            params.setBuffer(interpolatedBuffer);
413 438
            serverExplorer.add(providerName, params, true);
414 439
        } finally {
415
            if (buffer!=null){
416
                DisposeUtils.dispose(buffer);
417
            }
418
            if (clippedBuffer!=null){
419
                DisposeUtils.dispose(clippedBuffer);
420
            }
421
            if (interpolatedBuffer!=null){
422
                DisposeUtils.dispose(interpolatedBuffer);
423
            }
440
            DisposeUtils.dispose(buffer);
441
            DisposeUtils.dispose(clippedBuffer);
442
            DisposeUtils.dispose(interpolatedBuffer);
424 443
        }
425 444

  
426 445
        return destFile;
......
491 510
     * @return rows per zoom level
492 511
     */
493 512
    public int getRows(int zoomLevel) {
494
        return (int) (Math.round(getEnvelope().getLength(DIMENSIONS.Y) / pixelSizePerZoomLevel.get(zoomLevel)));
513
        return (int) (Math.round(getEnvelope().getLength(DIMENSIONS.Y) / this.tileStruct.getPixelSizePerZoomLevel().get(zoomLevel)));
495 514
    }
496 515

  
497 516
    /**
......
499 518
     * @return columns per zoom level
500 519
     */
501 520
    public int getColumns(int zoomLevel) {
502
        return (int) (Math.round(this.getEnvelope().getLength(DIMENSIONS.X) / pixelSizePerZoomLevel.get(zoomLevel)));
521
        return (int) (Math.round(this.getEnvelope().getLength(DIMENSIONS.X) / this.tileStruct.getPixelSizePerZoomLevel().get(zoomLevel)));
503 522
    }
504 523

  
505 524
    /**
506 525
     * @return envelope per zoom level
507 526
     */
508 527
    public Envelope getEnvelope() {
509
        return structExtent;
528
        return this.tileStruct.getEnvelope();
510 529
    }
511 530

  
512 531
    /**
513 532
     * @return the rows number per tile
514 533
     */
515 534
    public int getRowsPerTile() {
516
        return rowsPerTile;
535
        return this.tileStruct.getRowsPerTile();
517 536
    }
518 537

  
519 538
    /**
520 539
     * @return the columns number per tile
521 540
     */
522 541
    public int getColumnsPerTile() {
523
        return columnsPerTile;
542
        return this.tileStruct.getColumnsPerTile();
524 543
    }
525 544

  
526 545
    /**
527 546
     * @return the provider name
528 547
     */
529 548
    public String getProviderName() {
530
        return providerName;
549
        return this.tileStruct.getProviderName();
531 550
    }
532 551

  
533 552
    private String composeKeyForRecentTiles(int zoomLevel, int structRow, int structCol) {
......
616 635
        String key;
617 636

  
618 637
        public Tile(org.gvsig.raster.lib.buffer.api.Buffer buffer, String key) {
619
            logger.info("CONSTRUCTOR hashCode = "+this.hashCode()+ " className = "+this.getClass().getSimpleName());
638
            logger
639
                .info("CONSTRUCTOR hashCode = " + this.hashCode() + " className = " + this.getClass().getSimpleName());
620 640
            ToolsLocator.getDisposableManager().bind(buffer);
621 641
            this.buffer = buffer;
622 642
            this.key = key;
......
639 659
        @Override
640 660
        protected void finalize() throws Throwable {
641 661
            super.finalize();
642
            logger.info("CLEANED key " + this.key +" hashCode = "+this.hashCode());
662
            logger.info("CLEANED key " + this.key + " hashCode = " + this.hashCode());
643 663
        }
644 664

  
645 665
        @Override
......
651 671

  
652 672
    @Override
653 673
    protected void doDispose() throws BaseException {
654
        if(recentAccededTiles!=null){
674
        if (recentAccededTiles != null) {
655 675
            Set<Entry<String, Tile>> entrySet = recentAccededTiles.entrySet();
656 676
            for (Iterator iterator = entrySet.iterator(); iterator.hasNext();) {
657 677
                Entry<String, Tile> entry = (Entry<String, Tile>) iterator.next();
......
659 679
            }
660 680
            recentAccededTiles.clear();
661 681
        }
662
        if(innerProvider!=null){
663
            DisposeUtils.dispose(innerProvider);
664
            innerProvider=null;
682
        DisposeUtils.dispose(innerProvider);
683
        innerProvider = null;
684
        DisposeUtils.dispose((Disposable) tileStruct);
685
        tileStruct = null;
686

  
687
        query = null;
688
        factory = null;
689
        crs = null;
690
        colorInterpretation = null;
691
        legend = null;
692
        colorTable = null;
693
    }
694

  
695
    private void createTileCacheStructXMLFile(File folder) {
696
        // FIXME: ?Coger estos valores de alguna constante o de una preferencia?
697
        int tileSizeX = 256;
698
        int tileSizeY = 256;
699

  
700
        File file = new File(folder, "tileCacheStruct.xml");
701

  
702
        if (!file.exists()) {
703
            Buffer auxBuffer = null;
704
            try {
705
                DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
706
                DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
707

  
708
                // root elements
709
                Document doc = (Document) docBuilder.newDocument();
710
                Element rootElement = doc.createElement("TileCacheStruct");
711
                doc.appendChild(rootElement);
712

  
713
                // tileSize
714
                Element tileSize = doc.createElement("tileSize");
715
                rootElement.appendChild(tileSize);
716

  
717
                // tileSize Rows
718
                Attr rows = doc.createAttribute("rows");
719
                rows.setValue(String.valueOf(tileSizeY));
720
                tileSize.setAttributeNode(rows);
721

  
722
                // tileSize Columns
723
                Attr columns = doc.createAttribute("columns");
724
                columns.setValue(String.valueOf(tileSizeX));
725
                tileSize.setAttributeNode(columns);
726

  
727
                // format
728
                Element format = doc.createElement("format");
729
                format.setTextContent("GTiff");
730
                rootElement.appendChild(format);
731

  
732
                // structExtent
733
                Element structExtent = doc.createElement("structExtent");
734
                rootElement.appendChild(structExtent);
735

  
736
                Envelope envelope = (Envelope) innerProvider.getDynValue(DataStore.METADATA_ENVELOPE);
737

  
738
                // structExtent minX
739
                Element minX = doc.createElement("minX");
740
                minX.setTextContent(String.valueOf(envelope.getMinimum(DIMENSIONS.X)));
741
                structExtent.appendChild(minX);
742

  
743
                // structExtent minY
744
                Element minY = doc.createElement("minY");
745
                minY.setTextContent(String.valueOf(envelope.getMinimum(DIMENSIONS.Y)));
746
                structExtent.appendChild(minY);
747

  
748
                // structExtent maxX
749
                Element maxX = doc.createElement("maxX");
750
                maxX.setTextContent(String.valueOf(envelope.getMaximum(DIMENSIONS.X)));
751
                structExtent.appendChild(maxX);
752

  
753
                // structExtent maxY
754
                Element maxY = doc.createElement("maxY");
755
                maxY.setTextContent(String.valueOf(envelope.getMaximum(DIMENSIONS.Y)));
756
                structExtent.appendChild(maxY);
757

  
758
                Element levels = doc.createElement("levels");
759
                rootElement.appendChild(levels);
760

  
761
                // FIXME: ?alguna otra forma de obtener el pixelSize del store
762
                // completo?
763
                auxBuffer = innerProvider.createBuffer(null);
764
                int completeRows = auxBuffer.getRows();
765
                int completeColumns = auxBuffer.getColumns();
766
                double completePixelSizeX = auxBuffer.getPixelSizeX();
767
                double completePixelSizeY = auxBuffer.getPixelSizeY();
768

  
769
                int maximumLength = completeColumns;
770
                int tileMaximumLength = tileSizeX;
771
                double maximumPixelSize = completePixelSizeX;
772

  
773
                if (completeRows * tileSizeY > completeColumns * tileSizeX) {
774
                    maximumLength = completeRows;
775
                    tileMaximumLength = tileSizeY;
776
                    maximumPixelSize = completePixelSizeY;
777
                }
778

  
779
                List<Double> pixelSizes = new ArrayList<Double>();
780
                Map<Integer, Double> zoomLevels = new HashMap<Integer, Double>();
781

  
782
                double pixelSize = maximumPixelSize;
783
                while (maximumLength * maximumPixelSize / pixelSize > tileMaximumLength) {
784
                    pixelSizes.add(pixelSize);
785
                    pixelSize = pixelSize * 2;
786
                }
787
                pixelSizes.add(pixelSize);
788

  
789
                int i = 0;
790
                for (int zoomLevel = pixelSizes.size() - 1; zoomLevel >= 0; zoomLevel--) {
791
                    zoomLevels.put(i, pixelSizes.get(zoomLevel));
792
                    appendZoomLevel(doc, levels, i, pixelSizes.get(zoomLevel));
793
                    i++;
794
                }
795

  
796
                // write the content into xml file
797

  
798
                DOMSource source = new DOMSource(doc);
799
                File parent = file.getParentFile();
800
                if (!parent.exists()) {
801
                    parent.mkdirs();
802
                }
803
                file.createNewFile();
804
                StreamResult result = new StreamResult(file.toURI().getPath());
805

  
806
                TransformerFactory transformerFactory = TransformerFactory.newInstance();
807
                Transformer transformer = transformerFactory.newTransformer();
808
                transformer.setOutputProperty(OutputKeys.INDENT, "yes");
809
                transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
810
                transformer.transform(source, result);
811

  
812
            } catch (ParserConfigurationException | TransformerException | IOException | BufferException e) {
813
                logger.warn("Can't create tileCacheStruct.xml file", e);
814
            } finally {
815
                DisposeUtils.dispose(auxBuffer);
816
                auxBuffer = null;
817
            }
665 818
        }
666
        query=null;
667
        factory=null;
668
        crs=null;
669
        structExtent=null;
670
        colorInterpretation=null;
671
        legend=null;
672
        colorTable=null;
673 819
    }
674 820

  
821
    /**
822
     * @param doc
823
     * @param rootElement
824
     * @param levels
825
     * @param zoomLevel
826
     * @param pixelSize
827
     */
828
    private void appendZoomLevel(Document doc, Element levels, int zoomLevel, double pixelSize) {
829
        Element level = doc.createElement("level");
830
        levels.appendChild(level);
831

  
832
        // level zoomLevel
833
        Attr index = doc.createAttribute("index");
834
        index.setValue(String.valueOf(zoomLevel));
835
        level.setAttributeNode(index);
836

  
837
        // level pixelSize
838
        Attr pxSize = doc.createAttribute("pixelSize");
839
        pxSize.setValue(String.valueOf(pixelSize));
840
        level.setAttributeNode(pxSize);
841
    }
842

  
843
    public TileStruct getTileStruct() {
844
        if(this.tileStruct==null){
845
            this.tileStruct = new DefaultTileStruct();
846
        }
847
        return this.tileStruct;
848
    }
675 849
}
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/TileCacheBandPageManager.java
8 8
import org.gvsig.raster.lib.buffer.api.Band;
9 9
import org.gvsig.raster.lib.buffer.api.BandInfo;
10 10
import org.gvsig.raster.lib.buffer.api.BandTileManager;
11
import org.gvsig.raster.lib.buffer.api.TileStruct;
11 12

  
12 13
/**
13 14
 * Band Page Managaer for a Memory Image
......
73 74
        return tileStructImage.getColumnsPerTile();
74 75
    }
75 76

  
77
    @Override
78
    public TileStruct getTileStruct() {
79
        return tileStructImage.getTileStruct();
80
    }
81

  
76 82
}
org.gvsig.raster/branches/org.gvsig.raster.2.4/org.gvsig.raster/org.gvsig.raster.tilecache/org.gvsig.raster.tilecache.provider/pom.xml
32 32
    <groupId>org.gvsig</groupId>
33 33
    <artifactId>org.gvsig.andami</artifactId>
34 34
  </dependency> -->
35
  <dependency>
36
    <groupId>org.gvsig</groupId>
37
    <artifactId>org.gvsig.raster.lib.buffer.spi</artifactId>
38
  </dependency>
35 39
</dependencies>
36 40
</project>
org.gvsig.raster/branches/org.gvsig.raster.2.4/org.gvsig.raster/org.gvsig.raster.tilecache/org.gvsig.raster.tilecache.app/org.gvsig.raster.tilecache.app.mainplugin/src/main/java/org/gvsig/raster/tilecache/app/mainplugin/AddTestRasterLayerExtension.java
1 1
package org.gvsig.raster.tilecache.app.mainplugin;
2 2

  
3 3
import java.io.File;
4
import java.io.IOException;
5 4
import java.security.MessageDigest;
6 5
import java.security.NoSuchAlgorithmException;
7
import java.util.ArrayList;
8
import java.util.HashMap;
9
import java.util.List;
10
import java.util.Map;
11 6

  
12
import javax.xml.parsers.DocumentBuilder;
13
import javax.xml.parsers.DocumentBuilderFactory;
14
import javax.xml.parsers.ParserConfigurationException;
15
import javax.xml.transform.Transformer;
16
import javax.xml.transform.TransformerException;
17
import javax.xml.transform.TransformerFactory;
18
import javax.xml.transform.dom.DOMSource;
19
import javax.xml.transform.stream.StreamResult;
20

  
21 7
import org.slf4j.Logger;
22 8
import org.slf4j.LoggerFactory;
23
import org.w3c.dom.Attr;
24
import org.w3c.dom.Document;
25
import org.w3c.dom.Element;
26 9

  
27 10
import org.gvsig.andami.IconThemeHelper;
28 11
import org.gvsig.andami.Launcher;
......
32 15
import org.gvsig.app.project.documents.view.ViewDocument;
33 16
import org.gvsig.app.project.documents.view.gui.IView;
34 17
import org.gvsig.fmap.crs.CRSFactory;
35
import org.gvsig.fmap.dal.DALLocator;
36
import org.gvsig.fmap.dal.DataManager;
37 18
import org.gvsig.fmap.dal.DataServerExplorer;
38 19
import org.gvsig.fmap.dal.DataServerExplorerParameters;
39 20
import org.gvsig.fmap.dal.DataStore;
......
43 24
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
44 25
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
45 26
import org.gvsig.fmap.dal.raster.RasterStoreProviderFactory;
46
import org.gvsig.fmap.dal.raster.api.RasterSet;
47 27
import org.gvsig.fmap.dal.raster.api.RasterStore;
48 28
import org.gvsig.fmap.dal.raster.spi.NewRasterStoreParameters;
49 29
import org.gvsig.fmap.dal.spi.DALSPILocator;
50 30
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
51
import org.gvsig.fmap.geom.Geometry.DIMENSIONS;
52
import org.gvsig.fmap.geom.primitive.Envelope;
53 31
import org.gvsig.fmap.mapcontext.MapContext;
54 32
import org.gvsig.fmap.mapcontext.MapContextLocator;
55 33
import org.gvsig.fmap.mapcontext.MapContextManager;
......
90 68

  
91 69
        final MapContextManager mapContextManager = MapContextLocator.getMapContextManager();
92 70
        FLayer layer = null;
93
        DataManager dataManager = DALLocator.getDataManager();
94 71
        DataStore dataStore = null;
95 72
        try {
96
//        dataStore = openFileCached(new File("/home/paco/data/cartography/raster/ecw/valencia_1980_tif.tif"));
97
        dataStore = openFileCached(new File("/home/paco/data/Testdata/raster/JPG/relieve_andalucia.png"));
73
        dataStore = openFileCached(new File("/home/paco/data/cartography/raster/ecw/valencia_1980_tif.tif"));
74
//        dataStore = openFileCached(new File("/home/paco/data/Testdata/raster/JPG/relieve_andalucia.png"));
98 75
        String layerName = dataStore.getName();
99 76
        try {
100 77
            layer = mapContextManager.createLayer(layerName, dataStore);
......
300 277

  
301 278
    private RasterStore openFileCached(File file){
302 279
        DataManagerProviderServices manager = DALSPILocator.getDataManagerProviderServices();
303
//        DataStoreProviderFactory providerFactory = manager.getStoreProviderFactory("GTiff");
304
        DataStoreProviderFactory providerFactory = manager.getStoreProviderFactory("PNG");
280
        DataStoreProviderFactory providerFactory = manager.getStoreProviderFactory("GTiff");
281
//        DataStoreProviderFactory providerFactory = manager.getStoreProviderFactory("PNG");
305 282
        DynObject params = providerFactory.createParameters();
306 283

  
307 284
        if (params.getDynClass().getDynField("file") != null) {
......
313 290

  
314 291
        RasterStore store = null;
315 292
        try {
316
//            store = (RasterStore) manager.openStore("GTiff", params);
317
            store = (RasterStore) manager.openStore("PNG", params);
293
            store = (RasterStore) manager.openStore("GTiff", params);
294
//            store = (RasterStore) manager.openStore("PNG", params);
318 295
        } catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
319 296
            logger.info("**** error opening store *****", e);
320 297
        }
......
358 335
        String rcacheDir = Launcher.getAppHomeDir() + File.separator + "gvsig_rcache";
359 336
        File folder = new File(rcacheDir + File.separator + name);
360 337

  
361
        createTileCacheStructXMLFile(store, folder);
362

  
363 338
        if (tileParameters.getDynClass().getDynField("cacheFolder") != null) {
364 339
            tileParameters.setDynValue("cacheFolder", folder);
365 340
        }
......
377 352
        return store;
378 353
    }
379 354

  
380
    private void createTileCacheStructXMLFile(RasterStore store, File folder) {
381
        // FIXME: ?Coger estos valores de alguna constante o de una preferencia?
382
        int tileSizeX = 256;
383
        int tileSizeY = 256;
384

  
385
        File file = new File(folder, "tileCacheStruct.xml");
386

  
387
        if (!file.exists()) {
388
            try {
389
                DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
390
                DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
391

  
392
                // root elements
393
                Document doc = (Document) docBuilder.newDocument();
394
                Element rootElement = doc.createElement("TileCacheStruct");
395
                doc.appendChild(rootElement);
396

  
397
                // tileSize
398
                Element tileSize = doc.createElement("tileSize");
399
                rootElement.appendChild(tileSize);
400

  
401
                // tileSize Rows
402
                Attr rows = doc.createAttribute("rows");
403
                rows.setValue(String.valueOf(tileSizeY));
404
                tileSize.setAttributeNode(rows);
405

  
406
                // tileSize Columns
407
                Attr columns = doc.createAttribute("columns");
408
                columns.setValue(String.valueOf(tileSizeX));
409
                tileSize.setAttributeNode(columns);
410

  
411
                // format
412
                Element format = doc.createElement("format");
413
                format.setTextContent("GTiff");
414
                rootElement.appendChild(format);
415

  
416
                // structExtent
417
                Element structExtent = doc.createElement("structExtent");
418
                rootElement.appendChild(structExtent);
419

  
420
                Envelope envelope = store.getEnvelope();//store.getRasterSet().getEnvelope();
421
                // structExtent minX
422
                Element minX = doc.createElement("minX");
423
                minX.setTextContent(String.valueOf(envelope.getMinimum(DIMENSIONS.X)));
424
                structExtent.appendChild(minX);
425

  
426
                // structExtent minY
427
                Element minY = doc.createElement("minY");
428
                minY.setTextContent(String.valueOf(envelope.getMinimum(DIMENSIONS.Y)));
429
                structExtent.appendChild(minY);
430

  
431
                // structExtent maxX
432
                Element maxX = doc.createElement("maxX");
433
                maxX.setTextContent(String.valueOf(envelope.getMaximum(DIMENSIONS.X)));
434
                structExtent.appendChild(maxX);
435

  
436
                // structExtent maxY
437
                Element maxY = doc.createElement("maxY");
438
                maxY.setTextContent(String.valueOf(envelope.getMaximum(DIMENSIONS.Y)));
439
                structExtent.appendChild(maxY);
440

  
441
                Element levels = doc.createElement("levels");
442
                rootElement.appendChild(levels);
443

  
444
                // FIXME: ?alguna otra forma de obtener el pixelSize del store completo?
445
                RasterSet rasterSet = store.getRasterSet();
446
                int storeRows = rasterSet.getRows();
447
                int storeColumns = rasterSet.getColumns();
448
                double storePixelSizeX = rasterSet.getPixelSizeX();
449
                double storePixelSizeY = rasterSet.getPixelSizeY();
450

  
451
                int storeLength = storeColumns;
452
                int tileLength = tileSizeX;
453
                double storePixelSize = storePixelSizeX;
454

  
455
                if (storeRows * tileSizeY > storeColumns * tileSizeX) {
456
                    storeLength = storeRows;
457
                    tileLength = tileSizeY;
458
                    storePixelSize = storePixelSizeY;
459
                }
460

  
461
                List<Double> pixelSizes = new ArrayList<Double>();
462
                Map<Integer, Double> zoomLevels = new HashMap<Integer, Double>();
463

  
464
                double pixelSize = storePixelSize;
465
                while(storeLength*storePixelSize/pixelSize>tileLength){
466
                    pixelSizes.add(pixelSize);
467
                    pixelSize = pixelSize*2;
468
                }
469
                pixelSizes.add(pixelSize);
470

  
471
                int i=0;
472
                for(int zoomLevel = pixelSizes.size()-1; zoomLevel >= 0; zoomLevel--){
473
                  zoomLevels.put(i, pixelSizes.get(zoomLevel));
474
                  appendZoomLevel(doc, levels, i, pixelSizes.get(zoomLevel));
475
                  i++;
476
                }
477

  
478
                // write the content into xml file
479
                TransformerFactory transformerFactory = TransformerFactory.newInstance();
480
                Transformer transformer = transformerFactory.newTransformer();
481
                DOMSource source = new DOMSource(doc);
482
                File parent = file.getParentFile();
483
                if(!parent.exists()){
484
                    parent.mkdirs();
485
                }
486
                file.createNewFile();
487
                StreamResult result = new StreamResult(file.toURI().getPath());
488

  
489
                transformer.transform(source, result);
490

  
491
            } catch (ParserConfigurationException | TransformerException | DataException | IOException e) {
492
                logger.warn("Can't create tileCacheStruct.xml file", e);
493
            }
494
        }
495
    }
496

  
497 355
    /**
498
     * @param doc
499
     * @param rootElement
500
     * @param levels
501
     * @param zoomLevel
502
     * @param pixelSize
503
     */
504
    private void appendZoomLevel(Document doc, Element levels, int zoomLevel, double pixelSize) {
505
        Element level = doc.createElement("level");
506
        levels.appendChild(level);
507

  
508
        // level zoomLevel
509
        Attr index = doc.createAttribute("index");
510
        index.setValue(String.valueOf(zoomLevel));
511
        level.setAttributeNode(index);
512

  
513
        // level pixelSize
514
        Attr pxSize = doc.createAttribute("pixelSize");
515
        pxSize.setValue(String.valueOf(pixelSize));
516
        level.setAttributeNode(pxSize);
517
    }
518

  
519
    /**
520 356
     * Converts an array of bytes to hexadecimal string
521 357
     *
522 358
     * @param data
......
540 376

  
541 377
    /**
542 378
     * TO TEST ONLY
543
     *
544
     * @return
545 379
     */
546 380
    private void exportPNG(RasterStore store) throws InitializeException, ProviderNotRegisteredException,
547 381
        ValidateDataParametersException, DataException, BufferException {
......
574 408

  
575 409
    /**
576 410
     * TO TEST ONLY
577
     *
578
     * @return
579 411
     */
580 412
    private void exportGTiff(RasterStore store) throws InitializeException, ProviderNotRegisteredException,
581 413
        ValidateDataParametersException, DataException, BufferException {
......
609 441

  
610 442
    /**
611 443
     * TO TEST ONLY
612
     *
613
     * @return
614 444
     */
615 445
    private void exportBMP(RasterStore store) throws InitializeException, ProviderNotRegisteredException,
616 446
        ValidateDataParametersException, DataException, BufferException {
......
642 472

  
643 473
    /**
644 474
     * TO TEST ONLY
645
     *
646
     * @return
647 475
     */
648 476
    private void exportNetCDF(RasterStore store) throws InitializeException, ProviderNotRegisteredException,
649 477
        ValidateDataParametersException, DataException, BufferException {

Also available in: Unified diff