Revision 6385

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/AbstractTiledBand.java
91 91
            if(firstColumnOfTile + columnsPerTile > this.columns){
92 92
                columnsInTile = this.columns - firstColumnOfTile;
93 93
            }
94
            this.tileManager.load(data,
95
                firstRowOfTile, rowsInTile,
96
                firstColumnOfTile, columnsInTile,
94
            Band loadedBand = this.tileManager.load(firstRowOfTile,
95
                firstColumnOfTile,
97 96
                this.getDataType());
97

  
98

  
99
            Object rowBuffer = loadedBand.createRowBuffer();
100
            for(int loadedRow=0; loadedRow<loadedBand.getRows(); loadedRow++){
101
                loadedBand.fetchRow(loadedRow, rowBuffer);
102
                int pos = loadedRow*loadedBand.getColumns();
103
                System.arraycopy(rowBuffer, 0, data.array(), pos, loadedBand.getColumns());
104
            }
98 105
            loaded=true;
99 106
        } catch (IOException e) {
100 107
            throw new RuntimeException("Can't save current tile", e);
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
10 10
import java.nio.IntBuffer;
11 11
import java.nio.ShortBuffer;
12 12

  
13
import org.gvsig.raster.lib.buffer.api.Band;
13 14
import org.gvsig.raster.lib.buffer.api.BandInfo;
14 15
import org.gvsig.raster.lib.buffer.api.BandTileManager;
15 16
import org.gvsig.raster.lib.buffer.api.BufferLocator;
......
52 53
        this.columnsPerTile=256;
53 54
    }
54 55

  
55
    public void load(Buffer buffer, int row, int rows, int col, int cols, int dataType) throws IOException {
56
        //TODO review (un)used params
57
        int pos = row*this.columns+col;
58
        raf.seek(pos);
59
        BufferManager bufferManager = BufferLocator.getBufferManager();
60
        int dataTypeSize = bufferManager.getDataTypeSize(dataType);
61
        byte[] byteArray = new byte[buffer.capacity() * dataTypeSize];
62
        raf.read(byteArray);
63
        buffer.rewind();
56
    public Band load(int row, int col, int dataType) throws IOException {
57
        //FIXME: Comentarizado para que me deje compilar (no s? si es necesaria esta clase
64 58

  
65
        switch (dataType) {
66
        case BufferManager.TYPE_BYTE:
67
            //FIXME: Elegir cual de las dos siguientes maneras de hacerlo es la id?nea
59
//        //TODO review (un)used params
60
//        int pos = row*this.columns+col;
61
//        raf.seek(pos);
62
//        BufferManager bufferManager = BufferLocator.getBufferManager();
63
//        int dataTypeSize = bufferManager.getDataTypeSize(dataType);
64
//        byte[] byteArray = new byte[buffer.capacity() * dataTypeSize];
65
//        raf.read(byteArray);
66
//        buffer.rewind();
67
//
68
//        switch (dataType) {
69
//        case BufferManager.TYPE_BYTE:
70
//            //FIXME: Elegir cual de las dos siguientes maneras de hacerlo es la id?nea
71
//
72
//            ((ByteBuffer) buffer).put(byteArray, 0, byteArray.length);
73
////            System.arraycopy(byteArray, 0, ((ByteBuffer) buffer).array(), 0, byteArray.length);
74
//            break;
75
//        case BufferManager.TYPE_SHORT:
76
//        case BufferManager.TYPE_USHORT:
77
//            for( int cell =0 ; cell<byteArray.length ; cell++ ) {
78
//                ((ShortBuffer) buffer).put((int)(cell/dataTypeSize), byteArray[cell]);
79
//            }
80
//            break;
81
//        case BufferManager.TYPE_INT:
82
//            for( int cell =0 ; cell<byteArray.length ; cell++ ) {
83
//                ((IntBuffer) buffer).put((int)(cell/dataTypeSize), byteArray[cell]);
84
//            }
85
//            break;
86
//        case BufferManager.TYPE_FLOAT:
87
//            for( int cell =0 ; cell<byteArray.length ; cell++ ) {
88
//                ((FloatBuffer) buffer).put((int)(cell/dataTypeSize), byteArray[cell]);
89
//            }
90
//            break;
91
//
92
//        case BufferManager.TYPE_DOUBLE:
93
//            for( int cell =0 ; cell<byteArray.length ; cell++ ) {
94
//                ((DoubleBuffer) buffer).put((int)(cell/dataTypeSize), byteArray[cell]);
95
//            }
96
//            break;
97
//
98
//        default:
99
//            throw new IllegalArgumentException("Data Type " + dataType + " not supported.");
100
//        }
101
        return null;
68 102

  
69
            ((ByteBuffer) buffer).put(byteArray, 0, byteArray.length);
70
//            System.arraycopy(byteArray, 0, ((ByteBuffer) buffer).array(), 0, byteArray.length);
71
            break;
72
        case BufferManager.TYPE_SHORT:
73
        case BufferManager.TYPE_USHORT:
74
            for( int cell =0 ; cell<byteArray.length ; cell++ ) {
75
                ((ShortBuffer) buffer).put((int)(cell/dataTypeSize), byteArray[cell]);
76
            }
77
            break;
78
        case BufferManager.TYPE_INT:
79
            for( int cell =0 ; cell<byteArray.length ; cell++ ) {
80
                ((IntBuffer) buffer).put((int)(cell/dataTypeSize), byteArray[cell]);
81
            }
82
            break;
83
        case BufferManager.TYPE_FLOAT:
84
            for( int cell =0 ; cell<byteArray.length ; cell++ ) {
85
                ((FloatBuffer) buffer).put((int)(cell/dataTypeSize), byteArray[cell]);
86
            }
87
            break;
88

  
89
        case BufferManager.TYPE_DOUBLE:
90
            for( int cell =0 ; cell<byteArray.length ; cell++ ) {
91
                ((DoubleBuffer) buffer).put((int)(cell/dataTypeSize), byteArray[cell]);
92
            }
93
            break;
94

  
95
        default:
96
            throw new IllegalArgumentException("Data Type " + dataType + " not supported.");
97
        }
98

  
99 103
    }
100 104

  
101 105
    public void save(Buffer buffer, int row, int rows, int col, int cols, int dataType) throws IOException {
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/DefaultBufferManager.java
7 7
import java.util.Map.Entry;
8 8

  
9 9
import org.cresques.cts.IProjection;
10

  
10 11
import org.gvsig.fmap.geom.primitive.Envelope;
11 12
import org.gvsig.raster.lib.buffer.api.Band;
12 13
import org.gvsig.raster.lib.buffer.api.BandInfo;
......
16 17
import org.gvsig.raster.lib.buffer.api.BufferManager;
17 18
import org.gvsig.raster.lib.buffer.api.NoData;
18 19
import org.gvsig.raster.lib.buffer.api.PageManager;
20
import org.gvsig.raster.lib.buffer.api.exceptions.BandException;
19 21
import org.gvsig.raster.lib.buffer.api.exceptions.BufferException;
20 22
import org.gvsig.raster.lib.buffer.impl.exceptions.CreateBandTypeException;
21 23
import org.gvsig.raster.lib.buffer.impl.exceptions.CreateBufferException;
......
187 189
        List<Entry<Object, Object>> values) {
188 190
        return new DefaultBandInfo(band, name, description, dataType, values);
189 191
    }
192

  
193
    @Override
194
    public Buffer createBuffer(Buffer buffer, boolean paginated) throws BufferException {
195
        List<PageManager> pageManagers = null;
196
        try {
197
            if (paginated) {
198
                pageManagers = new ArrayList<PageManager>();
199
                File file;
200
                file = File.createTempFile("gvsig-raster-temp-file", "tmp");
201
                for (int i = 0; i < buffer.getBandCount(); i++) {
202
                    PageManager pageManager =
203
                        createSimpleBandPageManager(file, buffer.getRows(), buffer.getColumns(),
204
                            buffer.getBandTypes()[i]);
205
                    pageManagers.add(pageManager);
206
                }
207
            }
208
            Buffer newBuffer =
209
                createBuffer(buffer.getRows(), buffer.getColumns(), buffer.getBandTypes(), buffer.getBandNoData(),
210
                    buffer.getProjection(), buffer.getEnvelope(), pageManagers);
211
            for (int i = 0; i < newBuffer.getBandCount(); i++) {
212
                newBuffer.getBand(i).copyFrom(buffer.getBand(i));
213
            }
214
            return newBuffer;
215
        } catch (IOException | BandException e) {
216
            throw new CreateBufferException(e);
217
        }
218
    }
190 219
}
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/MemoryBandByte.java
72 72

  
73 73
    @Override
74 74
    protected void doCopyFrom(Band source) throws CopyFromBandException {
75
        if (this.getColumns() != source.getColumns() || this.getRows() != source.getRows()
76
            || !(source instanceof MemoryBandByte)) {
75
        if (this.getColumns() == source.getColumns() && this.getRows() == source.getRows()){
76
            if(source instanceof MemoryBandByte) {
77
                System.arraycopy(((MemoryBandByte) source).getData(), 0, this.data, 0, this.getRows()
78
                    * this.getColumns());
79
            } else {
80
                Object rowBuffer = source.createRowBuffer();
81
                for(int row=0; row<source.getRows(); row++){
82
                    source.fetchRow(row, rowBuffer);;
83
                    System.arraycopy(rowBuffer, 0, this.data, row*this.getColumns(), this.getColumns());
84
                }
85
            }
86
        } else {
77 87
            throw new CopyFromBandException(source, this);
78 88
        }
79
        System.arraycopy(((MemoryBandByte) source).getData(), 0, this.data, 0, this.getRows()
80
            * this.getColumns());
81 89
    }
82 90

  
83 91
    @Override
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
5 5

  
6 6
public interface BandTileManager extends PageManager{
7 7

  
8
    public void load(Buffer buffer, int row, int rows, int col, int cols, int dataType) throws IOException;
8
    public Band load(int row, int col, int dataType) throws IOException;
9 9

  
10 10
    public void save(Buffer buffer, int row, int rows, int col, int cols, int dataType) throws IOException;
11 11

  
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/BufferManager.java
59 59

  
60 60
    /**
61 61
     * Creates {@link BandInfo} with information about one band.
62
     * 
62
     *
63 63
     * @param band
64 64
     *            Band of this {@link BandInfo}
65 65
     * @param name
......
209 209
        throws BufferException;
210 210

  
211 211
    /**
212
     * Creates a buffer from another buffer.
213
     * If paginated parameter is false the buffer bands will be in memory.
214
     * If paginated parameter is true the buffer bands will be paginated using a simple band page manager.
215
     *
216
     * @param buffer
217
     * @param paginated
218
     * @return Buffer
219
     * @throws BufferException
220
     */
221
    public Buffer createBuffer(Buffer buffer, boolean paginated) throws BufferException;
222

  
223
    /**
212 224
     * Creates a clipping of a buffer. The returned clipping will be like a view
213 225
     * of the original buffer. It not reserve additional memory. It will only be
214 226
     * a walkway to access an area of the buffer.
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
52 52
    }
53 53

  
54 54
    @Override
55
    public void load(Buffer buffer, int row, int rows, int col, int cols, int dataType) throws IOException {
55
    public org.gvsig.raster.lib.buffer.api.Band load(int row, int col, int dataType) throws IOException {
56
        //FIXME:
57
        // Comentarizado para que me deje compilar.
58
        // Esta clase no va a ser necesaria porque gdal se va a a paginar a franjas en lugar de a tiles.
56 59

  
57
        int xOffset = col;
58
        int xSize = cols;
59
        int yOffset = row;
60
        int ySize = rows;
61
        buffer.rewind();
60
//        int xOffset = col;
61
//        int xSize = cols;
62
//        int yOffset = row;
63
//        int ySize = rows;
64
//        buffer.rewind();
65
//
66
//        switch (dataType) {
67
//        case BufferManager.TYPE_INT:
68
//            gdalBand.ReadRaster(xOffset, yOffset, xSize, ySize, ((IntBuffer) buffer).array());
69
//            break;
70
//        case BufferManager.TYPE_BYTE:
71
//            gdalBand.ReadRaster(xOffset, yOffset, xSize, ySize, ((ByteBuffer) buffer).array());
72
//            break;
73
//        case BufferManager.TYPE_DOUBLE:
74
//            gdalBand.ReadRaster(xOffset, yOffset, xSize, ySize, ((DoubleBuffer) buffer).array());
75
//            break;
76
//        case BufferManager.TYPE_FLOAT:
77
//            gdalBand.ReadRaster(xOffset, yOffset, xSize, ySize, ((FloatBuffer) buffer).array());
78
//            break;
79
//        case BufferManager.TYPE_SHORT:
80
//        case BufferManager.TYPE_USHORT:
81
//            gdalBand.ReadRaster(xOffset, yOffset, xSize, ySize, ((ShortBuffer) buffer).array());
82
//            break;
83
//        }
62 84

  
63
        switch (dataType) {
64
        case BufferManager.TYPE_INT:
65
            gdalBand.ReadRaster(xOffset, yOffset, xSize, ySize, ((IntBuffer) buffer).array());
66
            break;
67
        case BufferManager.TYPE_BYTE:
68
            gdalBand.ReadRaster(xOffset, yOffset, xSize, ySize, ((ByteBuffer) buffer).array());
69
            break;
70
        case BufferManager.TYPE_DOUBLE:
71
            gdalBand.ReadRaster(xOffset, yOffset, xSize, ySize, ((DoubleBuffer) buffer).array());
72
            break;
73
        case BufferManager.TYPE_FLOAT:
74
            gdalBand.ReadRaster(xOffset, yOffset, xSize, ySize, ((FloatBuffer) buffer).array());
75
            break;
76
        case BufferManager.TYPE_SHORT:
77
        case BufferManager.TYPE_USHORT:
78
            gdalBand.ReadRaster(xOffset, yOffset, xSize, ySize, ((ShortBuffer) buffer).array());
79
            break;
80
        }
85
        return null;
81 86
    }
82 87

  
83 88
    @Override
org.gvsig.raster/branches/org.gvsig.raster.2.4/org.gvsig.raster/org.gvsig.raster.tilecache/org.gvsig.raster.tilecache.provider.legend/src/main/java/org/gvsig/raster/tilecache/provider/legend/TileCacheGetColorInterpretation.java
1 1
package org.gvsig.raster.tilecache.provider.legend;
2 2

  
3
import org.gvsig.fmap.dal.exception.InitializeException;
4
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
5
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
3 6
import org.gvsig.fmap.dal.raster.api.RasterStore;
4 7
import org.gvsig.raster.lib.buffer.api.Band;
5 8
import org.gvsig.raster.lib.legend.api.ColorInterpretation;
......
14 17
import org.gvsig.tools.dynobject.DynObject;
15 18
import org.gvsig.tools.dynobject.exception.DynMethodException;
16 19
import org.gvsig.tools.dynobject.exception.DynMethodNotSupportedException;
20

  
17 21
import org.slf4j.LoggerFactory;
18 22

  
19 23
/**
......
60 64

  
61 65
        RasterLegendManager legendManager =
62 66
            RasterLegendLocator.getRasterLegendManager();
67

  
68
//        colorInterpretation =
69
//            legendManager.createColorInterpretation(ColorInterpretation.ARGB);
70

  
63 71
        TileStructImage tileStructImage = tileCacheStoreProvider.getTileStructImage();
64
        RasterStore tileStore=tileStructImage.getTileStore();
72

  
73
        RasterStore tileStore = null;
65 74
        try {
75
            tileStore = tileStructImage.getDelegatedRasterStore();
66 76
            colorInterpretation = (ColorInterpretation) tileStore
67 77
                .invokeDynMethod(RasterStore.DYNMETHOD_GETCOLORINTERPRETATION_NAME, null);
68 78
        } catch (DynMethodNotSupportedException e) {
69
            logger.debug("This store {} does not provide a legend.",
79
            logger.debug("This store {} does not provide a color interpretation.",
70 80
                tileStore.getName());
71 81
        } catch (DynMethodException e) {
72 82
            logger.error(
73
                "Can't load the specific legend provided for the store {}.",
83
                "Can't load the specific color interpretation provided for the store {}.",
74 84
                tileStore.getName(), e);
85
        } catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
86
            logger.error(
87
                "Can't get delegated store {}.",
88
                tileStructImage.getProviderName(), e);
89
        } finally {
90
            if(tileStore!=null){
91
                tileStore.dispose();
92
            }
75 93
        }
76 94

  
95

  
77 96
        return colorInterpretation;
78 97
    }
79 98

  
org.gvsig.raster/branches/org.gvsig.raster.2.4/org.gvsig.raster/org.gvsig.raster.tilecache/org.gvsig.raster.tilecache.provider.legend/src/main/java/org/gvsig/raster/tilecache/provider/legend/TileCacheGetColorTable.java
1 1
package org.gvsig.raster.tilecache.provider.legend;
2 2

  
3
import org.gvsig.fmap.dal.exception.InitializeException;
4
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
5
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
3 6
import org.gvsig.fmap.dal.raster.api.RasterStore;
7
import org.gvsig.raster.lib.legend.api.ColorInterpretation;
4 8
import org.gvsig.raster.lib.legend.api.ColorTable;
5 9
import org.gvsig.raster.lib.legend.api.RasterLegendLocator;
6 10
import org.gvsig.raster.lib.legend.api.RasterLegendManager;
......
12 16
import org.gvsig.tools.dynobject.DynObject;
13 17
import org.gvsig.tools.dynobject.exception.DynMethodException;
14 18
import org.gvsig.tools.dynobject.exception.DynMethodNotSupportedException;
19

  
15 20
import org.slf4j.LoggerFactory;
16 21

  
17 22
/**
......
60 65
        RasterLegendManager legendManager =
61 66
            RasterLegendLocator.getRasterLegendManager();
62 67
        TileStructImage tileStructImage = tileCacheStoreProvider.getTileStructImage();
63
        RasterStore tileStore=tileStructImage.getTileStore();
68

  
69
        RasterStore tileStore = null;
64 70
        try {
71
            tileStore = tileStructImage.getDelegatedRasterStore();
65 72
            colorTable = (ColorTable) tileStore
66 73
                .invokeDynMethod(RasterStore.DYNMETHOD_GETCOLORTABLE_NAME, null);
67 74
        } catch (DynMethodNotSupportedException e) {
......
71 78
            logger.error(
72 79
                "Can't load the specific color table provided for the store {}.",
73 80
                tileStore.getName(), e);
81
        } catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
82
            logger.error(
83
                "Can't get delegated store {}.",
84
                tileStructImage.getProviderName(), e);
85
        } finally {
86
            if(tileStore!=null){
87
                tileStore.dispose();
88
            }
74 89
        }
75 90

  
76 91
        return colorTable;
org.gvsig.raster/branches/org.gvsig.raster.2.4/org.gvsig.raster/org.gvsig.raster.tilecache/org.gvsig.raster.tilecache.provider.legend/src/main/java/org/gvsig/raster/tilecache/provider/legend/TileCacheGetLegend.java
1 1
package org.gvsig.raster.tilecache.provider.legend;
2 2

  
3
import org.slf4j.LoggerFactory;
4

  
5
import org.gvsig.fmap.dal.exception.InitializeException;
6
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
7
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
3 8
import org.gvsig.fmap.dal.raster.api.RasterStore;
4 9
import org.gvsig.raster.lib.legend.api.RasterLegend;
5 10
import org.gvsig.raster.lib.legend.api.RasterLegendLocator;
......
12 17
import org.gvsig.tools.dynobject.DynObject;
13 18
import org.gvsig.tools.dynobject.exception.DynMethodException;
14 19
import org.gvsig.tools.dynobject.exception.DynMethodNotSupportedException;
15
import org.slf4j.LoggerFactory;
16 20

  
17 21
/**
18 22
 * Dynamic method to add a get Legend funcionality
......
60 64

  
61 65
        RasterLegendManager legendManager =
62 66
            RasterLegendLocator.getRasterLegendManager();
67

  
68

  
69
//        TileCacheStoreProvider provider=(TileCacheStoreProvider)self;
70
//
71
//        ColorInterpretation colorInterpretation =(ColorInterpretation)provider.
72
//            invokeDynMethod(RasterStore.DYNMETHOD_GETCOLORINTERPRETATION_NAME, null);
73
//
74
//        legend= legendManager.createLegend(colorInterpretation);
75
//        if ( !( colorInterpretation.isBGR() || colorInterpretation.isRGB() || colorInterpretation.isRGBA() ) ){
76
//            ColorTable colorTable=(ColorTable)provider.
77
//                invokeDynMethod(RasterStore.DYNMETHOD_GETCOLORTABLE_NAME, null);
78
//            legend.setColorTable(colorTable);
79
//        }
80

  
63 81
        TileStructImage tileStructImage = tileCacheStoreProvider.getTileStructImage();
64
        RasterStore tileStore=tileStructImage.getTileStore();
82
        RasterStore tileStore = null;
65 83
        try {
84
            tileStore = tileStructImage.getDelegatedRasterStore();
66 85
            legend = (RasterLegend) tileStore
67 86
                .invokeDynMethod(RasterStore.DYNMETHOD_GETLEGEND_NAME, null);
68 87
        } catch (DynMethodNotSupportedException e) {
69
            logger.debug("This store {} does not provide a color table.",
88
            logger.debug("This store {} does not provide a legend.",
70 89
                tileStore.getName());
71 90
        } catch (DynMethodException e) {
72 91
            logger.error(
73
                "Can't load the specific color table provided for the store {}.",
92
                "Can't load the specific legend provided for the store {}.",
74 93
                tileStore.getName(), e);
94
        } catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
95
            logger.error(
96
                "Can't get delegated store {}.",
97
                tileStructImage.getProviderName(), e);
98
        } finally {
99
            if(tileStore!=null){
100
                tileStore.dispose();
101
            }
75 102
        }
76 103

  
77 104
        return legend;
org.gvsig.raster/branches/org.gvsig.raster.2.4/org.gvsig.raster/org.gvsig.raster.tilecache/org.gvsig.raster.tilecache.provider/pom.xml
19 19
   <artifactId>org.gvsig.tools.lib</artifactId>
20 20
  </dependency>
21 21

  
22
 </dependencies>
22
  <dependency>
23
    <groupId>org.gvsig</groupId>
24
    <artifactId>org.gvsig.fmap.dal.raster.api</artifactId>
25
  </dependency>
26

  
27
  <dependency>
28
   <groupId>com.sun</groupId>
29
   <artifactId>jimi</artifactId>
30
  </dependency>
31
</dependencies>
23 32
</project>
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.nio.Buffer;
27
import java.util.ArrayList;
28
import java.util.Collections;
29
import java.util.HashSet;
26
import java.util.HashMap;
30 27
import java.util.Iterator;
31
import java.util.List;
32
import java.util.Set;
28
import java.util.Map;
33 29
import java.util.SortedMap;
34 30
import java.util.TreeMap;
35 31

  
36 32
import javax.xml.parsers.DocumentBuilder;
37 33
import javax.xml.parsers.DocumentBuilderFactory;
38 34

  
39
import org.apache.commons.io.FileUtils;
40 35
import org.apache.commons.io.FilenameUtils;
41 36
import org.cresques.cts.IProjection;
37
import org.slf4j.Logger;
38
import org.slf4j.LoggerFactory;
39
import org.w3c.dom.Document;
40
import org.w3c.dom.Element;
41
import org.w3c.dom.NamedNodeMap;
42
import org.w3c.dom.Node;
43
import org.w3c.dom.NodeList;
42 44

  
43 45
import org.gvsig.fmap.dal.DALFileLocator;
44 46
import org.gvsig.fmap.dal.DataStoreProviderFactory;
45 47
import org.gvsig.fmap.dal.exception.DataException;
48
import org.gvsig.fmap.dal.exception.InitializeException;
49
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
46 50
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
47 51
import org.gvsig.fmap.dal.raster.api.RasterStore;
48 52
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerManager;
......
53 57
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
54 58
import org.gvsig.fmap.geom.GeometryLocator;
55 59
import org.gvsig.fmap.geom.GeometryManager;
56
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
57 60
import org.gvsig.fmap.geom.primitive.Envelope;
58 61
import org.gvsig.raster.lib.buffer.api.Band;
62
import org.gvsig.raster.lib.buffer.api.Buffer;
63
import org.gvsig.raster.lib.buffer.api.BufferLocator;
64
import org.gvsig.raster.lib.buffer.api.BufferManager;
65
import org.gvsig.raster.lib.buffer.api.exceptions.BufferException;
59 66
import org.gvsig.tools.dynobject.DynObject;
60 67
import org.gvsig.tools.extensionpoint.ExtensionPoint.Extension;
68
import org.gvsig.tools.task.SimpleTaskStatus;
61 69

  
62
import org.slf4j.Logger;
63
import org.slf4j.LoggerFactory;
64
import org.w3c.dom.Document;
65
import org.w3c.dom.Element;
66
import org.w3c.dom.NamedNodeMap;
67
import org.w3c.dom.Node;
68
import org.w3c.dom.NodeList;
69

  
70 70
/**
71 71
 * Represents a tiled image
72 72
 * @author dmartinezizquierdo
73 73
 *
74 74
 */
75
public class TileStructImage{
75
public class TileStructImage {
76 76

  
77 77
    private static final Logger logger = LoggerFactory.getLogger(TileStructImage.class);
78
    private static final int MAX_RECENT_ACCEDED_TILES_NUMBER = 200;
78 79

  
79 80
    private int rowsPerTile;
80 81
    private int columnsPerTile;
......
82 83
    private String providerName;
83 84
    private String extension;
84 85
    private SortedMap<Integer,Double> pixelSizePerZoomLevel;
85
    private SortedMap<Integer,List<Integer>> rowsInZoomLevel;
86
    private SortedMap<Integer,List<Integer>> columnsInZoomLevel;
87 86
    private SortedMap<Integer,Envelope> envelopePerZoomLevel;
88 87
    private File tilesFolder;
88
    private Map<String, Tile> recentAccededTiles;
89 89

  
90
    private int bandNumber;
90
    private Integer bandNumber=null;
91 91

  
92 92
    private int[] dataTypes;
93 93

  
94
    private RasterStore tileStore;
95 94
    private IProjection crs;
95
    private SimpleTaskStatus taskStatus;
96
    private Envelope structExtent;
97
    //Este envelope sirve para calcular el nombre de las fila y columna del tile en la estructura de cach?
96 98

  
97 99
    /**
98 100
     * @param folder
99 101
     * @param crs
100 102
     */
101 103
    public TileStructImage(File folder, IProjection crs){
104
//        builder = new StringBuilder();
105
//        builder.append("*********************");
102 106

  
107
      GeometryManager geoManager=GeometryLocator.getGeometryManager();
108

  
103 109
        this.crs=crs;
104 110

  
105
        rowsInZoomLevel=new TreeMap<Integer,List<Integer>>();
106
        columnsInZoomLevel=new TreeMap<Integer,List<Integer>>();
107 111
        envelopePerZoomLevel=new TreeMap<Integer,Envelope>();
108 112
        pixelSizePerZoomLevel=new TreeMap<Integer,Double>();
113
        recentAccededTiles = new HashMap<String, Tile>();
109 114

  
115

  
110 116
        //FIXME
111 117
        File tilePropertiesFile=new File(folder, "tileCacheStruct.xml");
112 118
        tilesFolder=new File (folder,"V"+File.separatorChar+"Z"+File.separatorChar+"T");
......
134 140
                    NodeList elementsByTagName = eElement.getElementsByTagName("format");
135 141
                    providerName=elementsByTagName.item(0).getTextContent();
136 142

  
143
                    NodeList structExtentList = eElement.getElementsByTagName("structExtent");
144
                    if(structExtentList.getLength()>0){
145
                        Element structExtentNode=(Element) structExtentList.item(0);
146
                        if(structExtentNode!=null){
147
                            Double minX = Double.valueOf(structExtentNode.getElementsByTagName("minX").item(0).getTextContent());
148
                            Double minY = Double.valueOf(structExtentNode.getElementsByTagName("minY").item(0).getTextContent());
149
                            Double maxX = Double.valueOf(structExtentNode.getElementsByTagName("maxX").item(0).getTextContent());
150
                            Double maxY = Double.valueOf(structExtentNode.getElementsByTagName("maxY").item(0).getTextContent());
151
                            structExtent = geoManager.createEnvelope(
152
                              minX,
153
                              minY,
154
                              maxX,
155
                              maxY,
156
                              SUBTYPES.GEOM2D);
157
                        }
158
                    }
159

  
137 160
                    FilesystemServerExplorerManager explorerManager = DALFileLocator.getFilesystemServerExplorerManager();
138 161
                    @SuppressWarnings("unchecked")
139 162
                    Iterator<Extension> it = explorerManager.getRegisteredProviders();
......
157 180
                    NodeList levelList=levels.getElementsByTagName("level");
158 181
                    for (int i = 0; i < levelList.getLength(); i++) {
159 182
                        Element level = (Element)levelList.item(i);
160
                        int zoomLevel=Integer.valueOf(level.getElementsByTagName("index").item(0).getTextContent());
161
                        double pixelSize=Double.valueOf(level.getElementsByTagName("pixelSize").item(0).getTextContent());
183

  
184
                        NamedNodeMap levelAttributes = level.getAttributes();
185
                        int zoomLevel=Integer.valueOf(levelAttributes.getNamedItem("index").getNodeValue());
186
                        double pixelSize=Double.valueOf(levelAttributes.getNamedItem("pixelSize").getNodeValue());
187

  
162 188
                        pixelSizePerZoomLevel.put(zoomLevel, pixelSize);
163
                        readFolderTileStructure(zoomLevel);
189

  
190
                        NodeList extentList = level.getElementsByTagName("extent");
191
                        if(extentList.getLength()>0){
192
                            Element extentNode=(Element) extentList.item(0);
193
                            if(extentNode!=null){
194
                                Double minX = Double.valueOf(extentNode.getElementsByTagName("minX").item(0).getTextContent());
195
                                Double minY = Double.valueOf(extentNode.getElementsByTagName("minY").item(0).getTextContent());
196
                                Double maxX = Double.valueOf(extentNode.getElementsByTagName("maxX").item(0).getTextContent());
197
                                Double maxY = Double.valueOf(extentNode.getElementsByTagName("maxY").item(0).getTextContent());
198
                                Envelope extent = geoManager.createEnvelope(
199
                                  minX,
200
                                  minY,
201
                                  maxX,
202
                                  maxY,
203
                                  SUBTYPES.GEOM2D);
204
                                envelopePerZoomLevel.put(zoomLevel, extent);
205
                            }
206
                        }
164 207
                    }
165 208

  
166 209
                }
167 210
            }
168 211

  
212
//            this.extension="tif";
213

  
169 214
        } catch (Exception e) {
170 215
            throw new RuntimeException();
171 216
        }
217
//        System.out.println(builder.toString());
218
//        builder.append("*********************");
172 219

  
220

  
173 221
    }
174 222

  
175
    /**
176
     * @param zoomLevel
177
     */
178
    private void readFolderTileStructure(int zoomLevel){
179
        File zoomFolder=new File(tilesFolder,String.valueOf(zoomLevel));
180
        String[] columnsNames = zoomFolder.list();
181
        Set<Integer> columns = new HashSet<Integer>();
182
        for (int i = 0; i < columnsNames.length; i++) {
183
            columns.add(Integer.valueOf(FilenameUtils.getBaseName(columnsNames[i])));
184
        }
185
        ArrayList<Integer> columnsList = new ArrayList<Integer>();
186
        columnsList.addAll(columns);
187
        Collections.sort(columnsList);
188
        this.columnsInZoomLevel.put(zoomLevel, columnsList);
223
//    /**
224
//     * @param zoomLevel
225
//     */
226
//    private void readFolderTileStructure(int zoomLevel){
227
//        File zoomFolder=new File(tilesFolder,String.valueOf(zoomLevel));
228
//        String[] columnsNames = zoomFolder.list();
229
//        Set<Integer> columns = new HashSet<Integer>();
230
//        for (int i = 0; i < columnsNames.length; i++) {
231
//            columns.add(Integer.valueOf(FilenameUtils.getBaseName(columnsNames[i])));
232
//        }
233
//        ArrayList<Integer> columnsList = new ArrayList<Integer>();
234
//        columnsList.addAll(columns);
235
//        Collections.sort(columnsList);
236
//        this.columnsInZoomLevel.put(zoomLevel, columnsList);
237
//
238
//        int maxRows=0;
239
//        Integer firstColumn=columnsList.get(0);
240
//        Integer firstRow=null;
241
//        for (String columnName:columnsNames){
242
//            File columnFolder=new File(zoomFolder,columnName);
243
//            String[] filenames = columnFolder.list();
244
//            Set<Integer> rows = new HashSet<Integer>();
245
//            for (int i = 0; i < filenames.length; i++) {
246
//                rows.add(Integer.valueOf(FilenameUtils.getBaseName(filenames[i])));
247
//            }
248
//            if (rows.size()>maxRows){
249
//                maxRows=rows.size();
250
//            }
251
//            if (firstRow==null){
252
//                ArrayList<Integer> rowsList = new ArrayList<Integer>();
253
//                rowsList.addAll(rows);
254
//                Collections.sort(rowsList);
255
//                this.rowsInZoomLevel.put(zoomLevel, rowsList);
256
//                firstRow=rowsList.get(0);
257
//            }
258
//        }
259
//
260
//        //Leemos el primer tile para obtener el upperLeftPoint
261
//        File firstRowFile=null;
262
//        File firstColumnFolder=new File(zoomFolder,String.valueOf(firstColumn));
263
//        String rowBaseName = String.valueOf(firstRow);
264
//        File[] providerAcceptedFiles = firstColumnFolder.listFiles(factory);
265
//        for (int i = 0; i < providerAcceptedFiles.length; i++) {
266
//            File providerAcceptedFile = providerAcceptedFiles[i];
267
//            if(FilenameUtils.getBaseName(providerAcceptedFile.getAbsolutePath()).equalsIgnoreCase(rowBaseName)){
268
//                firstRowFile = providerAcceptedFile;
269
//            }
270
//        }
271
//        if ( firstRowFile!=null ){
272
//            DataManagerProviderServices manager =  DALSPILocator.getDataManagerProviderServices();
273
//            DataStoreProviderFactory providerFactory = manager.getStoreProviderFactory(providerName);
274
//            DynObject params = providerFactory.createParameters();
275
//            if (params.getDynClass().getDynField("file")!=null){
276
//                params.setDynValue("file", firstRowFile);
277
//            }
278
//            if (params.getDynClass().getDynField("crs")!=null){
279
//                params.setDynValue("crs", this.crs);
280
//            }
281
//            try {
282
//                if(this.tileStore!=null){
283
//                    this.tileStore.dispose();
284
//                }
285
//                this.tileStore = (RasterStore) manager.openStore(providerName,params);
286
//                this.bandNumber=this.tileStore.getBands();
287
//                this.dataTypes=new int[this.bandNumber];
288
//                for (int i=0;i<this.bandNumber;i++){
289
//                    dataTypes[i]=this.tileStore.getBandInfo(i).getDataType();
290
//                }
291
//                Envelope firstTileEnvelope=this.tileStore.getEnvelope();
292
//                GeometryManager geoManager=GeometryLocator.getGeometryManager();
293
//                double minX = firstTileEnvelope.getMinimum(DIMENSIONS.X);
294
//                double maxY = firstTileEnvelope.getMaximum(DIMENSIONS.Y);
295
//                Envelope levelEnvelope=geoManager.createEnvelope(
296
//                    minX,
297
//                    maxY - ( getRows(zoomLevel)*pixelSizePerZoomLevel.get(zoomLevel) ),
298
//                    minX + ( getColumns(zoomLevel)*pixelSizePerZoomLevel.get(zoomLevel) ),
299
//                    maxY,
300
//                    SUBTYPES.GEOM2D);
301
////                builder.append("<level>\n");
302
////                builder.append("<index>");
303
////                builder.append(zoomLevel);
304
////                builder.append("</index>\n");
305
////                builder.append("<pixelSize>");
306
////                builder.append(pixelSizePerZoomLevel.get(zoomLevel));
307
////                builder.append("</pixelSize>\n");
308
////                builder.append("<extent>\n");
309
////                builder.append("<minX>");
310
////                builder.append(minX);
311
////                builder.append("</minX>\n");
312
////                builder.append("<minY>");
313
////                builder.append(maxY - ( getRows(zoomLevel)*pixelSizePerZoomLevel.get(zoomLevel) ));
314
////                builder.append("</minY>\n");
315
////                builder.append("<maxX>");
316
////                builder.append(minX + ( getColumns(zoomLevel)*pixelSizePerZoomLevel.get(zoomLevel) ));
317
////                builder.append("</maxX>\n");
318
////                builder.append("<maxY>");
319
////                builder.append(maxY);
320
////                builder.append("</maxY>\n");
321
////                builder.append("</extent>\n");
322
////                builder.append("</level>\n");
323
//
324
//                envelopePerZoomLevel.put(zoomLevel, levelEnvelope);
325
//
326
//
327
//            } catch (ValidateDataParametersException |
328
//                  CreateEnvelopeException | DataException e) {
329
//                logger.info("Can't read tile", e);
330
//                // TODO exception
331
//
332
//            }
333
//            this.extension = FilenameUtils.getExtension(firstRowFile.getAbsolutePath());
334
//        }else{
335
//            logger.info("Can't read tile structure");
336
//
337
//        }
338
//    }
189 339

  
190
        int maxRows=0;
191
        Integer firstColumn=columnsList.get(0);
192
        Integer firstRow=null;
193
        for (String columnName:columnsNames){
194
            File columnFolder=new File(zoomFolder,columnName);
195
            String[] filenames = columnFolder.list();
196
            Set<Integer> rows = new HashSet<Integer>();
197
            for (int i = 0; i < filenames.length; i++) {
198
                rows.add(Integer.valueOf(FilenameUtils.getBaseName(filenames[i])));
199
            }
200
            if (rows.size()>maxRows){
201
                maxRows=rows.size();
202
            }
203
            if (firstRow==null){
204
                ArrayList<Integer> rowsList = new ArrayList<Integer>();
205
                rowsList.addAll(rows);
206
                Collections.sort(rowsList);
207
                this.rowsInZoomLevel.put(zoomLevel, rowsList);
208
                firstRow=rowsList.get(0);
209
            }
210
        }
211

  
212
        //Leemos el primer tile para obtener el upperLeftPoint
213
        File firstRowFile=null;
214
        File firstColumnFolder=new File(zoomFolder,String.valueOf(firstColumn));
215
        String rowBaseName = String.valueOf(firstRow);
216
        File[] providerAcceptedFiles = firstColumnFolder.listFiles(factory);
217
        for (int i = 0; i < providerAcceptedFiles.length; i++) {
218
            File providerAcceptedFile = providerAcceptedFiles[i];
219
            if(FilenameUtils.getBaseName(providerAcceptedFile.getAbsolutePath()).equalsIgnoreCase(rowBaseName)){
220
                firstRowFile = providerAcceptedFile;
221
            }
222
        }
223
        if ( firstRowFile!=null ){
224
            DataManagerProviderServices manager =  DALSPILocator.getDataManagerProviderServices();
225
            DataStoreProviderFactory providerFactory = manager.getStoreProviderFactory(providerName);
226
            DynObject params = providerFactory.createParameters();
227
            if (params.getDynClass().getDynField("file")!=null){
228
                params.setDynValue("file", firstRowFile);
229
            }
230
            if (params.getDynClass().getDynField("crs")!=null){
231
                params.setDynValue("crs", this.crs);
232
            }
233
            try {
234
                this.tileStore = (RasterStore) manager.openStore(providerName,params);
235
                this.bandNumber=this.tileStore.getBands();
236
                this.dataTypes=new int[this.bandNumber];
237
                for (int i=0;i<this.bandNumber;i++){
238
                    dataTypes[i]=this.tileStore.getBandInfo(i).getDataType();
239
                }
240
                Envelope firstTileEnvelope=this.tileStore.getEnvelope();
241
                GeometryManager geoManager=GeometryLocator.getGeometryManager();
242
                double minX = firstTileEnvelope.getMinimum(DIMENSIONS.X);
243
                double maxY = firstTileEnvelope.getMaximum(DIMENSIONS.Y);
244
                Envelope levelEnvelope=geoManager.createEnvelope(
245
                    minX,
246
                    maxY - ( getRows(zoomLevel)*pixelSizePerZoomLevel.get(zoomLevel) ),
247
                    minX + ( getColumns(zoomLevel)*pixelSizePerZoomLevel.get(zoomLevel) ),
248
                    maxY,
249
                    SUBTYPES.GEOM2D);
250

  
251
                envelopePerZoomLevel.put(zoomLevel, levelEnvelope);
252

  
253

  
254
            } catch (ValidateDataParametersException |
255
                  CreateEnvelopeException | DataException e) {
256
                logger.info("Can't read tile", e);
257
                // TODO exception
258

  
259
            }
260
            this.extension = FilenameUtils.getExtension(firstRowFile.getAbsolutePath());
261
        }else{
262
            logger.info("Can't read tile structure");
263

  
264
        }
265
    }
266

  
267 340
    /**
268 341
     * @param pixelSize
269 342
     * @return The appropiate zoom level for the pizelSize
......
280 353
        return zoom;
281 354
    }
282 355

  
356
    private int[] calculateStructRowCol(int zoomLevel, int tileRow, int tileCol){
357
        //index 0 structRow, index 1 structCol
358
        int[] structRowCol = new int[2];
359

  
360
        if(envelopePerZoomLevel.isEmpty()){
361
            structRowCol[0] = tileRow;
362
            structRowCol[1] = tileCol;
363
        } else {
364
            Envelope envelopeInZoomLevel = envelopePerZoomLevel.get(zoomLevel);
365
            structRowCol[0] = (int)(-(envelopeInZoomLevel.getMaximum(DIMENSIONS.Y)-structExtent.getMaximum(DIMENSIONS.Y))/(pixelSizePerZoomLevel.get(zoomLevel)*rowsPerTile))+tileRow;
366
            structRowCol[1] = (int)((envelopeInZoomLevel.getMinimum(DIMENSIONS.X)-structExtent.getMinimum(DIMENSIONS.X))/(pixelSizePerZoomLevel.get(zoomLevel)*columnsPerTile))+tileCol;
367
        }
368

  
369
        return structRowCol;
370

  
371
    }
372

  
283 373
    /**
284 374
     * @param buffer
285 375
     * @param band
286 376
     * @param zoomLevel
287 377
     * @param tileRow
288 378
     * @param tileCol
379
     * @return Band
289 380
     */
290
    public void fetchTile(Buffer buffer, int band, int zoomLevel, int tileRow, int tileCol){
381
    public Band fetchTile(int band, int zoomLevel, int tileRow, int tileCol) {
291 382

  
292
        Integer structCol = columnsInZoomLevel.get(zoomLevel).get(tileCol);
293
        Integer structRow = rowsInZoomLevel.get(zoomLevel).get(tileRow);
383
        BufferManager bufferManager = BufferLocator.getBufferManager();
384
        int[] structRowCol = calculateStructRowCol(zoomLevel, tileRow, tileCol);
385
        int structRow = structRowCol[0];
386
        int structCol = structRowCol[1];
294 387

  
295
        File tileFile=null;
388
        String keyTile = composeKeyForRecentTiles(zoomLevel, structRow, structCol);
389
        Tile tile = recentAccededTiles.get(keyTile);
296 390

  
297
        File zoomFolder=new File(tilesFolder,String.valueOf(zoomLevel));
298
        File firstColumnFolder=new File(zoomFolder,String.valueOf(structCol));
299
        String rowBaseName = String.valueOf(structRow);
300
        tileFile = new File(firstColumnFolder.getAbsolutePath()+File.separatorChar+rowBaseName+"."+this.extension);
391
        if (tile != null) {
392
            // Devolver la banda del buffer del tile
393
            return tile.getBuffer().getBand(band);
394
        } else {
395
            // Cargar un tile nuevo
396
            Buffer rasterSet = null;
397
            File tileFile = null;
398
            RasterStore tileStore = null;
399
            try {
400
                tileStore = createTileStore(zoomLevel, structRow, structCol);
401
                rasterSet = bufferManager.createBuffer(tileStore.getRasterSet(),false);
301 402

  
302
        if ( tileFile!=null ){
303
            try {
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);
403
                if (recentAccededTiles.size() > MAX_RECENT_ACCEDED_TILES_NUMBER) {
404
                    removeOlderTile();
405
                }
406
                recentAccededTiles.put(keyTile, new Tile(rasterSet, keyTile));
407

  
408
                return rasterSet.getBand(band);
409
            } catch (DataException | ValidateDataParametersException | BufferException e) {
410
                logger.warn("Can't fetch tile: zoomLevel = " + zoomLevel + ", tileRow = " + tileRow + ", tileColumn = "
411
                    + tileCol + ", band = " + band + ".", e);
412
                return null;
413
            } finally {
414
                if (tileStore != null) {
415
                    tileStore.dispose();
416
                }
417
            }
418
        }
419
    }
420

  
421
    private RasterStore createTileStore(int zoomLevel, int structRow, int structCol) throws ValidateDataParametersException, InitializeException, ProviderNotRegisteredException{
422

  
423
        File tileFile = null;
424
        File zoomFolder = new File(tilesFolder, String.valueOf(zoomLevel));
425
        if (zoomFolder.exists()) {
426
            File firstColumnFolder = new File(zoomFolder, String.valueOf(structCol));
427
            if (firstColumnFolder.exists()) {
428
                String rowBaseName = String.valueOf(structRow);
429

  
430
                if (this.extension == null) {
431
                    File[] providerAcceptedFiles = firstColumnFolder.listFiles(factory);
432
                    for (int i = 0; i < providerAcceptedFiles.length; i++) {
433
                        File providerAcceptedFile = providerAcceptedFiles[i];
434
                        if (FilenameUtils.getBaseName(providerAcceptedFile.getAbsolutePath()).equalsIgnoreCase(
435
                            rowBaseName)) {
436
                            tileFile = providerAcceptedFile;
437
                        }
311 438
                    }
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);
439
                    this.extension = FilenameUtils.getExtension(tileFile.getAbsolutePath());
440
                } else {
441

  
442
                    tileFile =
443
                        new File(firstColumnFolder.getAbsolutePath() + File.separatorChar + rowBaseName + "."
444
                            + this.extension);
320 445
                }
321
                Band tileBand = tileStore.getRasterSet().getBand(band);
322
                Object rowBuffer = tileBand.createRowBuffer();
323
                for (int r = 0; r < tileBand.getRows(); r++) {
324
                    tileBand.fetchRow(r, rowBuffer);
325
                    System.arraycopy(rowBuffer, 0, buffer.array(), r * tileBand.getColumns(), tileBand.getColumns());
446
                if (tileFile.exists()) {
447
                    RasterStore tileStore = null;
448
                        DataManagerProviderServices manager = DALSPILocator.getDataManagerProviderServices();
449
                        DataStoreProviderFactory providerFactory = manager.getStoreProviderFactory(providerName);
450

  
451
                        DynObject params = providerFactory.createParameters();
452
                        if (params.getDynClass().getDynField("file") != null) {
453
                            params.setDynValue("file", tileFile);
454
                        }
455
                        if (params.getDynClass().getDynField("crs") != null) {
456
                            params.setDynValue("crs", this.crs);
457
                        }
458

  
459
                        tileStore = (RasterStore) manager.openStore(providerName, params);
460
                        return tileStore;
326 461
                }
327
            } catch (ValidateDataParametersException | DataException e) {
328
                logger.warn("Can't fetch tile: zoomLevel = "+zoomLevel+", tileRow = "+tileRow+", tileColumn = "+tileCol+", band = "+band+".", e);
329 462
            }
330 463
        }
464
        return null;
331 465
    }
332 466

  
333 467
    /**
468
     * @return delegatedRasterStore
469
     * @throws ProviderNotRegisteredException
470
     * @throws InitializeException
471
     * @throws ValidateDataParametersException
472
     */
473
    public RasterStore getDelegatedRasterStore() throws ValidateDataParametersException, InitializeException, ProviderNotRegisteredException{
474
        int[] structRowCol = calculateStructRowCol(0, 0, 0);
475
        return createTileStore(0, structRowCol[0], structRowCol[1]);
476
    }
477

  
478

  
479
    /**
334 480
     * @return the band number
335 481
     */
336 482
    public int getBandNumber(){
483
        if(this.bandNumber == null){
484
            fillBandsInfo();
485
        }
337 486
        return this.bandNumber;
338 487
    }
339 488

  
......
341 490
     * @return the data types
342 491
     */
343 492
    public int[] getDataTypes(){
493
        if(this.dataTypes == null){
494
            fillBandsInfo();
495
        }
344 496
        return this.dataTypes;
345 497
    }
346 498

  
347 499
    /**
500
     *
501
     */
502
    private void fillBandsInfo() {
503
        RasterStore rasterStore = null;
504
        try {
505
            rasterStore = getDelegatedRasterStore();
506
            this.bandNumber = rasterStore.getBands();
507
            this.dataTypes=new int[this.bandNumber];
508
            for (int i=0;i<this.bandNumber;i++){
509
                dataTypes[i]=rasterStore.getBandInfo(i).getDataType();
510
            }
511
        } catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
512
            logger.warn("Can't get the delegated raster store", e);
513
        } finally {
514
            if(rasterStore != null){
515
                rasterStore.dispose();
516
            }
517
        }
518
    }
519

  
520

  
521
    /**
348 522
     * @param zoomLevel
349 523
     * @return rows per zoom level
350 524
     */
351 525
    public int getRows(int zoomLevel){
352
        return rowsInZoomLevel.get(zoomLevel).size()*rowsPerTile;
353
        //rowsPerZoomLevel.get(zoomLevel);
526
        return (int)(getEnvelopePerZoomLevel(zoomLevel).getLength(DIMENSIONS.Y)/pixelSizePerZoomLevel.get(zoomLevel));
354 527
    }
355 528

  
356 529
    /**
......
358 531
     * @return columns per zoom level
359 532
     */
360 533
    public int getColumns(int zoomLevel){
361
        return columnsInZoomLevel.get(zoomLevel).size()*columnsPerTile;
534
        return (int)(getEnvelopePerZoomLevel(zoomLevel).getLength(DIMENSIONS.X)/pixelSizePerZoomLevel.get(zoomLevel));
362 535
    }
363 536

  
364 537
    /**
......
366 539
     * @return envelope por zoom level
367 540
     */
368 541
    public Envelope getEnvelopePerZoomLevel(int zoomLevel){
542
        if(envelopePerZoomLevel.isEmpty()){
543
            return structExtent;
544
        }
369 545
        return envelopePerZoomLevel.get(zoomLevel);
370 546
    }
371 547

  
......
390 566
        return providerName;
391 567
    }
392 568

  
569
    private String composeKeyForRecentTiles(int zoomLevel, int structRow, int structCol){
570
        StringBuilder builder = new StringBuilder();
571
        builder.append(zoomLevel);
572
        builder.append(":");
573
        builder.append(structRow);
574
        builder.append(":");
575
        builder.append(structCol);
576
        return builder.toString();
577
    }
393 578

  
394
    /**
395
     * @return the store of the loaded tile
396
     */
397
    public RasterStore getTileStore() {
398
        return tileStore;
579
    private void removeOlderTile(){
580

  
581
        Tile olderTile = null;
582
        for (Iterator iterator = recentAccededTiles.values().iterator(); iterator.hasNext();) {
583
            Tile tile = (Tile) iterator.next();
584
            if(olderTile == null || tile.getLastAccess()<olderTile.getLastAccess()){
585
                olderTile = tile;
586
            }
587
        }
588
        if(olderTile!=null){
589
            recentAccededTiles.remove(olderTile.getKey());
590
        }
399 591
    }
592

  
593
    private class Tile {
594

  
595
        org.gvsig.raster.lib.buffer.api.Buffer buffer;
596
        long lastAccess;
597
        String key;
598

  
599
        public Tile(org.gvsig.raster.lib.buffer.api.Buffer buffer, String key) {
600
            this.buffer = buffer;
601
            this.key = key;
602
            lastAccess = System.currentTimeMillis();
603
        }
604

  
605
        public String getKey() {
606
            return key;
607
        }
608

  
609
        public org.gvsig.raster.lib.buffer.api.Buffer getBuffer(){
610
            lastAccess = System.currentTimeMillis();
611
            return buffer;
612
        }
613

  
614
        public long getLastAccess() {
615
            return lastAccess;
616
        }
617
    }
618

  
400 619
}
401 620

  
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/TileCacheStoreProvider.java
135 135
            throw new InitializeException(
136 136
                new NullPointerException("params is null"));
137 137
        }
138
//        File file = getTileCacheParameters().getFile();
139
//        if (file == null) {
140
//            throw new InitializeException(
141
//                new NullPointerException("Jimi file is null"));
142
//        }
143
//
138

  
144 139
        this.projection=params.getCRS();
145 140

  
146
        //FIXME
147
        File file = new File("/home/paco/data/cartography/raster/tile-valencia1980");
141
        File cacheFolder=null;
148 142

  
143
        //FIXME: Get appropriate folder to cache tiles
144
        cacheFolder = new File("/home/paco/data/cartography/raster/tile-valencia1980");
145

  
149 146
        resource = this.createResource(
150 147
            FileResource.NAME,
151
            new Object[] { file.getAbsolutePath() }
148
            new Object[] { cacheFolder.getAbsolutePath() }
152 149
        );
153 150

  
154 151
        resource.addConsumer(this);
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
3 3
import java.io.IOException;
4 4
import java.nio.Buffer;
5 5

  
6
import org.gvsig.raster.lib.buffer.api.Band;
6 7
import org.gvsig.raster.lib.buffer.api.BandInfo;
7 8
import org.gvsig.raster.lib.buffer.api.BandTileManager;
8 9

  
......
14 15
public class TileCacheBandPageManager implements BandTileManager{
15 16

  
16 17
    private TileStructImage tileStructImage;
17
    private int band;
18
    private int bandNumber;
18 19
    private int zoomLevel;
19 20

  
20 21
    /**
......
24 25
     */
25 26
    public TileCacheBandPageManager(TileStructImage tileStructImage, int zoomLevel, int band){
26 27
        this.tileStructImage=tileStructImage;
27
        this.band=band;
28
        this.bandNumber=band;
28 29
        this.zoomLevel=zoomLevel;
29 30
    }
30 31

  
......
34 35
    }
35 36

  
36 37
    @Override
37
    public void load(Buffer buffer, int row, int rows, int col, int cols, int dataType) throws IOException {
38
        buffer.rewind();
38
    public Band load(int row, int col, int dataType) throws IOException {
39 39

  
40 40
        int tileRow=(int)row/getRowsPerTile();
41 41
        int tileCol=(int)col/getColumnsPerTile();
42 42

  
43
        tileStructImage.fetchTile(buffer, band, this.zoomLevel,tileRow,tileCol);
43
        return tileStructImage.fetchTile(bandNumber, this.zoomLevel, tileRow, tileCol);
44 44

  
45 45
    }
46 46

  

Also available in: Unified diff