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 / AbstractTileCacheStoreProvider.java @ 8691

History | View | Annotate | Download (8.18 KB)

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.tilecache.provider;
24

    
25
import java.util.ArrayList;
26
import java.util.HashMap;
27
import java.util.List;
28
import java.util.Map;
29

    
30
import org.cresques.cts.IProjection;
31

    
32
import org.gvsig.fmap.dal.DataServerExplorer;
33
import org.gvsig.fmap.dal.DataStore;
34
import org.gvsig.fmap.dal.DataStoreParameters;
35
import org.gvsig.fmap.dal.exception.CloseException;
36
import org.gvsig.fmap.dal.exception.DataException;
37
import org.gvsig.fmap.dal.exception.InitializeException;
38
import org.gvsig.fmap.dal.exception.OpenException;
39
import org.gvsig.fmap.dal.exception.ReadException;
40
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
41
import org.gvsig.fmap.dal.raster.api.BandAttributeDescriptor;
42
import org.gvsig.fmap.dal.raster.api.BandDescriptor;
43
import org.gvsig.fmap.dal.raster.api.RasterQuery;
44
import org.gvsig.fmap.dal.raster.spi.AbstractRasterStoreProvider;
45
import org.gvsig.fmap.dal.raster.spi.RasterCacheStoreProvider;
46
import org.gvsig.fmap.dal.raster.spi.RasterStoreProvider;
47
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
48
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
49
import org.gvsig.fmap.geom.primitive.Envelope;
50
import org.gvsig.raster.lib.buffer.api.BandInfo;
51
import org.gvsig.raster.lib.buffer.api.Buffer;
52
import org.gvsig.raster.lib.buffer.api.BufferDimensions;
53
import org.gvsig.raster.lib.buffer.api.BufferLocator;
54
import org.gvsig.raster.lib.buffer.api.BufferManager;
55
import org.gvsig.raster.lib.buffer.api.NoData;
56
import org.gvsig.raster.lib.buffer.api.PageManager;
57
import org.gvsig.raster.lib.buffer.api.TileStruct;
58
import org.gvsig.raster.lib.buffer.api.exceptions.BufferException;
59
import org.gvsig.tools.ToolsLocator;
60
import org.gvsig.tools.dispose.DisposeUtils;
61
import org.gvsig.tools.dispose.impl.AbstractDisposable;
62
import org.gvsig.tools.dynobject.DynObject;
63
import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException;
64
import org.gvsig.tools.exception.BaseException;
65
import org.gvsig.tools.i18n.I18nManager;
66

    
67

    
68
/**
69
 * @author fdiaz
70
 *
71
 */
72
public abstract class AbstractTileCacheStoreProvider extends AbstractRasterStoreProvider implements
73
    RasterCacheStoreProvider {
74

    
75
    private TileCacheStructImage tileStructImage = null;
76

    
77
    protected Envelope envelope = null;
78

    
79
    protected Map<Integer, List<PageManager>> pageManagersPerZoomLevel = null;
80

    
81
    protected RasterStoreProvider innerProvider;
82
    protected int bandsNumber;
83

    
84
    /**
85
     * @param params
86
     * @param storeServices
87
     * @param metadata
88
     */
89
    public AbstractTileCacheStoreProvider(DataStoreParameters params, DataStoreProviderServices storeServices,
90
        DynObject metadata) {
91
        super(params, storeServices, metadata);
92
    }
93

    
94
    @Override
95
    public Buffer createBuffer(RasterQuery rasterQuery) throws BufferException {
96
        BufferManager bufferManager = BufferLocator.getBufferManager();
97
        int[] bandDataTypes;
98
        List<PageManager> pageManagers = new ArrayList<PageManager>();
99
        NoData[] bandNoData;
100
        // FIXME: Ver qu? deber?amos hacer aqu? con la rasterQuery
101
        // if (rasterQuery != null) {
102
        // List<BandQuery> bands;
103
        // bands = rasterQuery.getBands();
104
        // }
105

    
106
        bandDataTypes = new int[bandsNumber];
107
        bandNoData = new NoData[bandsNumber];
108

    
109
        double pixelSize = rasterQuery.getPixelSize();
110
        int zoomLevel = 0;
111
        if (pixelSize != 0.0) {
112
            zoomLevel = tileStructImage.getZoomLvlForPixelSize(pixelSize);
113
        }
114
        List<PageManager> pageManagersInZoom;
115
        pageManagersInZoom = getPageManagersInZoom(zoomLevel);
116
        for (int i = 0; i < tileStructImage.getBandNumber(); i++) {
117
            bandDataTypes[i] = this.getBandDescriptor(i).getDataType();
118
            bandNoData[i] = this.getNoData(rasterQuery, i);
119
            pageManagers.add(pageManagersInZoom.get(i));
120
        }
121

    
122
        envelope = tileStructImage.getEnvelope();
123
        Buffer buffer =
124
            bufferManager.createBuffer(tileStructImage.getRows(zoomLevel), tileStructImage.getColumns(zoomLevel),
125
                bandDataTypes, bandNoData, (IProjection) innerProvider.getDynValue(DataStore.METADATA_CRS), envelope,
126
                pageManagers);
127

    
128
        return buffer;
129
    }
130

    
131
    // @Override
132
    // public BandInfo getBandInfo(int band) {
133
    // return innerProvider.getBandInfo(band);
134
    // }
135

    
136
    @Override
137
    public int getBands() {
138
        return bandsNumber;
139
    }
140

    
141
    @Override
142
    public DataServerExplorer getExplorer() throws ReadException, ValidateDataParametersException {
143
        return null;
144
    }
145

    
146
    @Override
147
    public void open() throws OpenException {
148
        if (this.tileStructImage != null) {
149
            return;
150
        }
151
    }
152

    
153
    protected List<PageManager> getPageManagersInZoom(int zoomLevel) {
154
        List<PageManager> pageManagersInZoom = this.pageManagersPerZoomLevel.get(zoomLevel);
155
        if (pageManagersInZoom == null) {
156
            pageManagersInZoom = new ArrayList<PageManager>();
157
            for (int i = 0; i < tileStructImage.getBandNumber(); i++) {
158
                pageManagersInZoom.add(new TileCacheBandPageManager(tileStructImage, zoomLevel, i));
159
            }
160
            this.pageManagersPerZoomLevel.put(zoomLevel, pageManagersInZoom);
161
        }
162
        return pageManagersInZoom;
163
    }
164

    
165
    @Override
166
    public Object getDynValue(String name) throws DynFieldNotFoundException {
167
        if (DataStore.METADATA_ENVELOPE.equalsIgnoreCase(name)) {
168
            return this.envelope;
169
        }
170
        if (DataStore.METADATA_CRS.equalsIgnoreCase(name)) {
171
            return this.innerProvider.getDynValue(name);
172
        }
173
        return super.getDynValue(name);
174
    }
175

    
176
    @Override
177
    public TileStruct getTileStruct() {
178
        return innerProvider.getTileStruct();
179
    }
180

    
181
    protected void setTileStructImage(TileCacheStructImage tileStructImage) {
182
        this.tileStructImage = tileStructImage;
183
        for (int i = 0; i < this.tileStructImage.getBandNumber(); i++) {
184
            this.getBandDescriptor(i).setDataType(this.tileStructImage.getDataTypes()[i]);
185
        }
186
    }
187

    
188
    /**
189
     * @return TileStructImage
190
     */
191
    public TileStructImage getTileStructImage() {
192
        return tileStructImage;
193
    }
194

    
195
    @Override
196
    public void deleteAll() {
197
        tileStructImage.forgetCache();
198
    }
199

    
200
    @Override
201
    public void close() throws CloseException {
202
        this.tileStructImage = null;
203
    }
204

    
205
    @Override
206
    public String getName() {
207
        return this.innerProvider.getName();
208
    }
209

    
210
    @Override
211
    public String getFullName() {
212
        return this.innerProvider.getFullName();
213
    }
214

    
215
    protected void doDispose() throws BaseException {
216
        super.doDispose();
217
        if (this.tileStructImage != null) {
218
            DisposeUtils.dispose((AbstractDisposable) tileStructImage);
219
            this.tileStructImage = null;
220
        }
221
    }
222

    
223
    @Override
224
    public void apply(RasterStoreProvider provider, IProjection crs, RasterQuery query) throws DataException {
225
        this.innerProvider = provider;
226
        pageManagersPerZoomLevel = new HashMap<Integer, List<PageManager>>();
227
    }
228

    
229
    @Override
230
    public RasterStoreProvider getInnerProvider() {
231
        return innerProvider;
232
    }
233

    
234
    @Override
235
    public BufferDimensions getDimensions() throws InitializeException {
236
        return innerProvider.getDimensions();
237
    }
238

    
239
    @Override
240
    public boolean isTiled() {
241
        return true;
242
    }
243
}