Statistics
| Revision:

gvsig-raster / 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 / AbstractTileCacheStructImage.java @ 8699

History | View | Annotate | Download (9.23 KB)

1
package org.gvsig.raster.tilecache.provider;
2

    
3
import java.util.Collection;
4
import java.util.Collections;
5
import java.util.Iterator;
6
import java.util.Map;
7
import java.util.Set;
8
import java.util.SortedSet;
9
import java.util.TreeSet;
10

    
11
import org.slf4j.Logger;
12
import org.slf4j.LoggerFactory;
13

    
14
import org.gvsig.fmap.dal.exception.DataException;
15
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
16
import org.gvsig.fmap.dal.raster.api.RasterQuery;
17
import org.gvsig.fmap.dal.raster.api.RasterStore;
18
import org.gvsig.fmap.dal.raster.spi.RasterStoreProvider;
19
import org.gvsig.fmap.geom.Geometry.DIMENSIONS;
20
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
21
import org.gvsig.fmap.geom.primitive.Envelope;
22
import org.gvsig.raster.lib.buffer.api.TileStruct;
23
import org.gvsig.raster.lib.buffer.api.exceptions.BufferException;
24
import org.gvsig.tools.ToolsLocator;
25
import org.gvsig.tools.dispose.DisposeUtils;
26
import org.gvsig.tools.dispose.impl.AbstractDisposable;
27
import org.gvsig.tools.dynobject.exception.DynMethodException;
28
import org.gvsig.tools.exception.BaseException;
29

    
30
/**
31
 * @author fdiaz
32
 *
33
 */
34
public abstract class AbstractTileCacheStructImage extends AbstractDisposable implements TileCacheStructImage {
35

    
36
    private static final Logger logger = LoggerFactory.getLogger(AbstractTileCacheStructImage.class);
37

    
38
    protected RasterStoreProvider innerProvider;
39
    protected RasterQuery query;
40
    protected TileStruct tileStruct;
41

    
42
    protected Object colorInterpretation;
43
    protected Object legend;
44
    protected Object colorTable;
45

    
46
    protected Map<String, Tile> recentAccededTiles;
47

    
48
    protected Integer bandNumber = null;
49

    
50
    protected int[] dataTypes;
51

    
52
    /**
53
     * @param innerProvider
54
     * @param query
55
     */
56
    public AbstractTileCacheStructImage(RasterStoreProvider innerProvider, RasterQuery query) {
57
        super();
58
        this.innerProvider = innerProvider;
59
        this.query = query;
60
    }
61

    
62
    /**
63
     * @param pixelSize
64
     * @return The appropriate zoom level for the pizelSize
65
     */
66
    public int getZoomLvlForPixelSize(double pixelSize) {
67
        //FIXME: Elegir el c?digo id?neo
68
        // Este trozo de c?digo selecciona un zoom superior con lo que,
69
        // al hacer la interpolaci?n se generar?n p?xeles m?s grandes
70
        // (y l?neas m?s gruesas)
71
        int zoom = 0;
72
        Map<Integer, Double> pixelSizePerZoomLevel = tileStruct.getPixelSizePerZoomLevel();
73

    
74
        SortedSet<Integer> keySet = new TreeSet<>(Collections.reverseOrder());
75
        keySet.addAll(pixelSizePerZoomLevel.keySet());
76
        Iterator<Integer> iterator = keySet.iterator();
77
        while(iterator.hasNext()){
78
            zoom = iterator.next();
79
            double levelPixelSize = pixelSizePerZoomLevel.get(zoom);
80
            if (pixelSize <= levelPixelSize) {
81
                return zoom;
82
            }
83
        }
84

    
85
        return zoom;
86

    
87
        // Este trozo de c?digo selecciona un zoom inferior con lo que,
88
        // al hacer la interpolaci?n se perder?n p?xeles
89
        // repercutiendo en la legibilidad de las leyendas
90
        // (y las l?neas se podr?n ver entrecortadas)
91
        /*
92
        int zoom = 0;
93
        Map<Integer, Double> pixelSizePerZoomLevel = getTileStruct().getPixelSizePerZoomLevel();
94
        for (int i : pixelSizePerZoomLevel.keySet()) {
95
            zoom = i;
96
            double levelPixelSize = pixelSizePerZoomLevel.get(zoom);
97
            if (pixelSize >= levelPixelSize) {
98
                return zoom;
99
            }
100
        }
101
        return zoom;
102
        */
103
    }
104

    
105
    /**
106
     * @throws CloneNotSupportedException
107
     * @throws ValidateDataParametersException
108
     * @throws DynMethodException
109
     * @throws DataException
110
     * @throws BufferException
111
     * @throws CreateEnvelopeException
112
     *
113
     */
114
    protected void fillStoreInfo() {
115
        this.bandNumber = this.innerProvider.getBands();
116
        this.dataTypes = new int[this.bandNumber];
117
        for (int i = 0; i < this.bandNumber; i++) {
118
            dataTypes[i] = this.innerProvider.getBandDescriptor(i).getDataType();
119
        }
120
        try {
121
            this.colorInterpretation =
122
                this.innerProvider.invokeDynMethod(RasterStore.DYNMETHOD_GETCOLORINTERPRETATION_NAME, null);
123
            this.colorTable = this.innerProvider.invokeDynMethod(RasterStore.DYNMETHOD_GETCOLORTABLE_NAME, null);
124
            this.legend = this.innerProvider.invokeDynMethod(RasterStore.DYNMETHOD_GETLEGEND_NAME, null);
125
        } catch (DynMethodException e) {
126
            logger.warn("Can't fill legend info from store.");
127
        }
128
    }
129

    
130
    /* (non-Javadoc)
131
     * @see org.gvsig.raster.tilecache.provider.ITileStructImage#getBandNumber()
132
     */
133
    @Override
134
    public int getBandNumber() {
135
        if (this.bandNumber == null) {
136
            fillStoreInfo();
137
        }
138
        return this.bandNumber;
139
    }
140

    
141

    
142
    /* (non-Javadoc)
143
     * @see org.gvsig.raster.tilecache.provider.ITileStructImage#getDataTypes()
144
     */
145
    @Override
146
    public int[] getDataTypes() {
147
        if (this.dataTypes == null) {
148
            fillStoreInfo();
149
        }
150
        return this.dataTypes;
151
    }
152

    
153
    /* (non-Javadoc)
154
     * @see org.gvsig.raster.tilecache.provider.ITileStructImage#getRows(int)
155
     */
156
    @Override
157
    public int getRows(int zoomLevel) {
158
        return (int) (Math.round(getEnvelope().getLength(DIMENSIONS.Y) / this.tileStruct.getPixelSizePerZoomLevel().get(zoomLevel)));
159
    }
160

    
161
    /* (non-Javadoc)
162
     * @see org.gvsig.raster.tilecache.provider.ITileStructImage#getColumns(int)
163
     */
164
    @Override
165
    public int getColumns(int zoomLevel) {
166
        return (int) (Math.round(this.getEnvelope().getLength(DIMENSIONS.X) / this.tileStruct.getPixelSizePerZoomLevel().get(zoomLevel)));
167
    }
168

    
169
    /* (non-Javadoc)
170
     * @see org.gvsig.raster.tilecache.provider.ITileStructImage#getEnvelope()
171
     */
172
    @Override
173
    public Envelope getEnvelope() {
174
        return this.tileStruct.getEnvelope();
175
    }
176

    
177
    /* (non-Javadoc)
178
     * @see org.gvsig.raster.tilecache.provider.ITileStructImage#getRowsPerTile()
179
     */
180
    @Override
181
    public int getRowsPerTile() {
182
        return this.tileStruct.getRowsPerTile();
183
    }
184

    
185
    /* (non-Javadoc)
186
     * @see org.gvsig.raster.tilecache.provider.ITileStructImage#getColumnsPerTile()
187
     */
188
    @Override
189
    public int getColumnsPerTile() {
190
        return this.tileStruct.getColumnsPerTile();
191
    }
192

    
193
    /* (non-Javadoc)
194
     * @see org.gvsig.raster.tilecache.provider.ITileStructImage#getProviderName()
195
     */
196
    @Override
197
    public String getProviderName() {
198
        return this.tileStruct.getProviderName();
199
    }
200

    
201
    protected String composeKeyForRecentTiles(int zoomLevel, int structRow, int structCol) {
202
        StringBuilder builder = new StringBuilder();
203
        builder.append(zoomLevel);
204
        builder.append(":");
205
        builder.append(structCol);
206
        builder.append(":");
207
        builder.append(structRow);
208
        return builder.toString();
209
    }
210

    
211
    protected void removeOlderTile() {
212
        Tile olderTile = null;
213
        for (Iterator<Tile> iterator = recentAccededTiles.values().iterator(); iterator.hasNext();) {
214
            Tile tile = (Tile) iterator.next();
215
            if (olderTile == null || tile.getLastAccess() < olderTile.getLastAccess()) {
216
                olderTile = tile;
217
            }
218
        }
219
        if (olderTile != null) {
220
            recentAccededTiles.remove(olderTile.getKey());
221
            DisposeUtils.dispose(olderTile);
222
        }
223
    }
224

    
225
    /* (non-Javadoc)
226
     * @see org.gvsig.raster.tilecache.provider.ITileStructImage#getColorInterpretation()
227
     */
228
    @Override
229
    public Object getColorInterpretation() {
230
        if (this.colorInterpretation == null) {
231
            fillStoreInfo();
232
        }
233
        return this.colorInterpretation;
234
    }
235

    
236
    /* (non-Javadoc)
237
     * @see org.gvsig.raster.tilecache.provider.ITileStructImage#getColorTable()
238
     */
239
    @Override
240
    public Object getColorTable() {
241
        if (this.colorTable == null) {
242
            fillStoreInfo();
243
        }
244
        return this.colorTable;
245
    }
246

    
247
    /* (non-Javadoc)
248
     * @see org.gvsig.raster.tilecache.provider.ITileStructImage#getLegend()
249
     */
250
    @Override
251
    public Object getLegend() {
252
        if (this.legend == null) {
253
            fillStoreInfo();
254
        }
255
        return this.legend;
256
    }
257

    
258
    /**
259
     *
260
     */
261
    public void forgetCache(){
262
        this.recentAccededTiles.clear();
263
    }
264

    
265

    
266
    protected class Tile extends AbstractDisposable {
267

    
268
        org.gvsig.raster.lib.buffer.api.Buffer buffer;
269
        long lastAccess;
270
        String key;
271

    
272
        public Tile(org.gvsig.raster.lib.buffer.api.Buffer buffer, String key) {
273
            ToolsLocator.getDisposableManager().bind(buffer);
274
            this.buffer = buffer;
275
            this.key = key;
276
            lastAccess = System.currentTimeMillis();
277
        }
278

    
279
        public String getKey() {
280
            return key;
281
        }
282

    
283
        public org.gvsig.raster.lib.buffer.api.Buffer getBuffer() {
284
            lastAccess = System.currentTimeMillis();
285
            return buffer;
286
        }
287

    
288
        public long getLastAccess() {
289
            return lastAccess;
290
        }
291

    
292
        @Override
293
        protected void finalize() throws Throwable {
294
            super.finalize();
295
        }
296

    
297
        @Override
298
        protected void doDispose() throws BaseException {
299
            DisposeUtils.dispose(buffer);
300
            buffer = null;
301
        }
302
    }
303
}