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 @ 8788

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
        int zoom = 0;
92
        Map<Integer, Double> pixelSizePerZoomLevel = getTileStruct().getPixelSizePerZoomLevel();
93
        for (int i : pixelSizePerZoomLevel.keySet()) {
94
            zoom = i;
95
            double levelPixelSize = pixelSizePerZoomLevel.get(zoom);
96
            if (pixelSize >= levelPixelSize) {
97
                return zoom;
98
            }
99
        }
100
        return zoom;
101
    }
102

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

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

    
139

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

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

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

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

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

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

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

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

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

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

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

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

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

    
263

    
264
    protected class Tile extends AbstractDisposable {
265

    
266
        org.gvsig.raster.lib.buffer.api.Buffer buffer;
267
        long lastAccess;
268
        String key;
269

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

    
277
        public String getKey() {
278
            return key;
279
        }
280

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

    
286
        public long getLastAccess() {
287
            return lastAccess;
288
        }
289

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

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