Statistics
| Revision:

svn-gvsig-desktop / branches / org.gvsig.desktop-2018a / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.tilecache / org.gvsig.fmap.dal.tilecache.raster / src / main / java / org / gvsig / raster / tilecache / provider / AbstractTileCacheStructImage.java @ 43876

History | View | Annotate | Download (8.81 KB)

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

    
3
import java.util.Iterator;
4
import java.util.Map;
5
import java.util.Set;
6
import java.util.Map.Entry;
7

    
8
import org.slf4j.Logger;
9
import org.slf4j.LoggerFactory;
10

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

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

    
34
    private static final Logger logger = LoggerFactory.getLogger(AbstractTileCacheStructImage.class);
35

    
36
    protected RasterStoreProvider innerProvider;
37
    protected RasterQuery query;
38
    protected TileStruct tileStruct;
39

    
40
    protected Object colorInterpretation;
41
    protected Object legend;
42
    protected Object colorTable;
43

    
44
    protected Map<String, Tile> recentAccededTiles;
45

    
46
    protected Integer bandNumber = null;
47

    
48
    protected int[] dataTypes;
49

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

    
60
    /**
61
     * @param pixelSize
62
     * @return The appropriate zoom level for the pizelSize
63
     */
64
    @Override
65
    public int getZoomLvlForPixelSize(double pixelSize) {
66
        //FIXME: Elegir el c?digo id?neo
67
        // Este trozo de c?digo selecciona un zoom superior con lo que,
68
        // al hacer la interpolaci?n se generar?n p?xeles m?s grandes
69
        // (y l?neas m?s gruesas)
70
//        int zoom = 0;
71
//        Map<Integer, Double> pixelSizePerZoomLevel = tileStruct.getPixelSizePerZoomLevel();
72
//
73
//        SortedSet<Integer> keySet = new TreeSet<>(Collections.reverseOrder());
74
//        keySet.addAll(pixelSizePerZoomLevel.keySet());
75
//        Iterator<Integer> iterator = keySet.iterator();
76
//        while(iterator.hasNext()){
77
//            zoom = iterator.next();
78
//            double levelPixelSize = pixelSizePerZoomLevel.get(zoom);
79
//            if (pixelSize <= levelPixelSize) {
80
//                return zoom;
81
//            }
82
//        }
83
//
84
//        return zoom;
85

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

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

    
127
    @Override
128
    public int getBandNumber() {
129
        if (this.bandNumber == null) {
130
            fillStoreInfo();
131
        }
132
        return this.bandNumber;
133
    }
134

    
135
    @Override
136
    public int[] getDataTypes() {
137
        if (this.dataTypes == null) {
138
            fillStoreInfo();
139
        }
140
        return this.dataTypes;
141
    }
142

    
143
    @Override
144
    public int getRows(int zoomLevel) {
145
        return (int) (Math.round(getEnvelope().getLength(DIMENSIONS.Y) / this.tileStruct.getPixelSizePerZoomLevel().get(zoomLevel)));
146
    }
147

    
148
    @Override
149
    public int getColumns(int zoomLevel) {
150
        return (int) (Math.round(this.getEnvelope().getLength(DIMENSIONS.X) / this.tileStruct.getPixelSizePerZoomLevel().get(zoomLevel)));
151
    }
152

    
153
    @Override
154
    public Envelope getEnvelope() {
155
        return this.tileStruct.getEnvelope();
156
    }
157

    
158
    @Override
159
    public int getRowsPerTile() {
160
        return this.tileStruct.getRowsPerTile();
161
    }
162

    
163
    @Override
164
    public int getColumnsPerTile() {
165
        return this.tileStruct.getColumnsPerTile();
166
    }
167

    
168
    @Override
169
    public String getProviderName() {
170
        return this.tileStruct.getProviderName();
171
    }
172

    
173
    protected String composeKeyForRecentTiles(int zoomLevel, int structRow, int structCol) {
174
        StringBuilder builder = new StringBuilder();
175
        builder.append(zoomLevel);
176
        builder.append(":");
177
        builder.append(structCol);
178
        builder.append(":");
179
        builder.append(structRow);
180
        return builder.toString();
181
    }
182

    
183
    protected void removeOlderTile() {
184
        Tile olderTile = null;
185
        for (Iterator<Tile> iterator = recentAccededTiles.values().iterator(); iterator.hasNext();) {
186
            Tile tile = (Tile) iterator.next();
187
            if (olderTile == null || tile.getLastAccess() < olderTile.getLastAccess()) {
188
                olderTile = tile;
189
            }
190
        }
191
        if (olderTile != null) {
192
            recentAccededTiles.remove(olderTile.getKey());
193
            DisposeUtils.dispose(olderTile);
194
        }
195
    }
196

    
197
    @Override
198
    public Object getColorInterpretation() {
199
        if (this.colorInterpretation == null) {
200
            fillStoreInfo();
201
        }
202
        return this.colorInterpretation;
203
    }
204

    
205
    @Override
206
    public Object getColorTable() {
207
        if (this.colorTable == null) {
208
            fillStoreInfo();
209
        }
210
        return this.colorTable;
211
    }
212

    
213
    @Override
214
    public Object getLegend() {
215
        if (this.legend == null) {
216
            fillStoreInfo();
217
        }
218
        return this.legend;
219
    }
220

    
221
    /**
222
     *
223
     */
224
    @Override
225
    public void forgetCache(){
226
        this.recentAccededTiles.clear();
227
    }
228

    
229
    @Override
230
    protected void doDispose() throws BaseException {
231
        if (recentAccededTiles != null) {
232
            Set<Entry<String, Tile>> entrySet = recentAccededTiles.entrySet();
233
            for (Iterator<Entry<String, Tile>> iterator = entrySet.iterator(); iterator.hasNext();) {
234
                Entry<String, Tile> entry = (Entry<String, Tile>) iterator.next();
235
                DisposeUtils.dispose(entry.getValue());
236
            }
237
            recentAccededTiles.clear();
238
        }
239
        DisposeUtils.dispose(innerProvider);
240
        innerProvider = null;
241
        DisposeUtils.dispose((Disposable) tileStruct);
242
        tileStruct = null;
243

    
244
        query = null;
245
        colorInterpretation = null;
246
        legend = null;
247
        colorTable = null;
248
    }
249

    
250

    
251
    protected class Tile extends AbstractDisposable {
252

    
253
        org.gvsig.raster.lib.buffer.api.Buffer buffer;
254
        long lastAccess;
255
        String key;
256

    
257
        public Tile(org.gvsig.raster.lib.buffer.api.Buffer buffer, String key) {
258
            ToolsLocator.getDisposableManager().bind(buffer);
259
            this.buffer = buffer;
260
            this.key = key;
261
            lastAccess = System.currentTimeMillis();
262
        }
263

    
264
        public String getKey() {
265
            return key;
266
        }
267

    
268
        public org.gvsig.raster.lib.buffer.api.Buffer getBuffer() {
269
            lastAccess = System.currentTimeMillis();
270
            return buffer;
271
        }
272

    
273
        public long getLastAccess() {
274
            return lastAccess;
275
        }
276

    
277
        @Override
278
        protected void finalize() throws Throwable {
279
            super.finalize();
280
        }
281

    
282
        @Override
283
        public void doDispose() throws BaseException {
284
            DisposeUtils.dispose(buffer);
285
            buffer = null;
286
        }
287
    }
288
}