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 / AbstractTileCacheStoreProvider.java @ 43876
History | View | Annotate | Download (8.71 KB)
1 | 43803 | fdiaz | /* 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.Iterator; |
||
28 | import java.util.List; |
||
29 | import java.util.Map; |
||
30 | import java.util.Map.Entry; |
||
31 | import java.util.Set; |
||
32 | |||
33 | import org.cresques.cts.IProjection; |
||
34 | |||
35 | import org.gvsig.fmap.dal.DataServerExplorer; |
||
36 | import org.gvsig.fmap.dal.DataStore; |
||
37 | import org.gvsig.fmap.dal.DataStoreParameters; |
||
38 | import org.gvsig.fmap.dal.exception.CloseException; |
||
39 | import org.gvsig.fmap.dal.exception.DataException; |
||
40 | import org.gvsig.fmap.dal.exception.InitializeException; |
||
41 | import org.gvsig.fmap.dal.exception.OpenException; |
||
42 | import org.gvsig.fmap.dal.exception.ReadException; |
||
43 | import org.gvsig.fmap.dal.exception.ValidateDataParametersException; |
||
44 | 43876 | jjdelcerro | import org.gvsig.fmap.dal.raster.RasterQuery; |
45 | 43803 | fdiaz | import org.gvsig.fmap.dal.raster.spi.AbstractRasterStoreProvider; |
46 | import org.gvsig.fmap.dal.raster.spi.RasterCacheStoreProvider; |
||
47 | import org.gvsig.fmap.dal.raster.spi.RasterStoreProvider; |
||
48 | import org.gvsig.fmap.dal.spi.DataStoreProviderServices; |
||
49 | import org.gvsig.fmap.geom.primitive.Envelope; |
||
50 | import org.gvsig.raster.lib.buffer.api.BandPageManager; |
||
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.dispose.DisposeUtils; |
||
60 | import org.gvsig.tools.dispose.impl.AbstractDisposable; |
||
61 | import org.gvsig.tools.dynobject.DynObject; |
||
62 | import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException; |
||
63 | import org.gvsig.tools.exception.BaseException; |
||
64 | |||
65 | |||
66 | /**
|
||
67 | * @author fdiaz
|
||
68 | *
|
||
69 | */
|
||
70 | public abstract class AbstractTileCacheStoreProvider extends AbstractRasterStoreProvider implements |
||
71 | RasterCacheStoreProvider { |
||
72 | |||
73 | private TileCacheStructImage tileStructImage = null; |
||
74 | |||
75 | protected Envelope envelope = null; |
||
76 | |||
77 | protected Map<Integer, List<PageManager>> pageManagersPerZoomLevel = null; |
||
78 | |||
79 | protected RasterStoreProvider innerProvider;
|
||
80 | protected int bandsNumber; |
||
81 | |||
82 | /**
|
||
83 | * @param params
|
||
84 | * @param storeServices
|
||
85 | * @param metadata
|
||
86 | */
|
||
87 | public AbstractTileCacheStoreProvider(DataStoreParameters params, DataStoreProviderServices storeServices,
|
||
88 | DynObject metadata) { |
||
89 | super(params, storeServices, metadata);
|
||
90 | } |
||
91 | |||
92 | @Override
|
||
93 | public Buffer createBuffer(RasterQuery rasterQuery) throws BufferException { |
||
94 | BufferManager bufferManager = BufferLocator.getBufferManager(); |
||
95 | int[] bandDataTypes; |
||
96 | List<PageManager> pageManagers = new ArrayList<PageManager>(); |
||
97 | NoData[] bandNoData;
|
||
98 | // FIXME: Ver qu? deber?amos hacer aqu? con la rasterQuery
|
||
99 | // if (rasterQuery != null) {
|
||
100 | // List<BandQuery> bands;
|
||
101 | // bands = rasterQuery.getBands();
|
||
102 | // }
|
||
103 | |||
104 | bandDataTypes = new int[bandsNumber]; |
||
105 | bandNoData = new NoData[bandsNumber];
|
||
106 | |||
107 | double pixelSize = rasterQuery.getPixelSize();
|
||
108 | int zoomLevel = 0; |
||
109 | if (pixelSize != 0.0) { |
||
110 | zoomLevel = tileStructImage.getZoomLvlForPixelSize(pixelSize); |
||
111 | } |
||
112 | List<PageManager> pageManagersInZoom;
|
||
113 | pageManagersInZoom = getPageManagersInZoom(zoomLevel); |
||
114 | for (int i = 0; i < tileStructImage.getBandNumber(); i++) { |
||
115 | bandDataTypes[i] = this.getBandDescriptor(i).getDataType();
|
||
116 | bandNoData[i] = this.getNoData(rasterQuery, i);
|
||
117 | pageManagers.add(pageManagersInZoom.get(i)); |
||
118 | } |
||
119 | |||
120 | envelope = tileStructImage.getEnvelope(); |
||
121 | Buffer buffer =
|
||
122 | bufferManager.createBuffer(tileStructImage.getRows(zoomLevel), tileStructImage.getColumns(zoomLevel), |
||
123 | bandDataTypes, bandNoData, (IProjection) innerProvider.getDynValue(DataStore.METADATA_CRS), envelope, |
||
124 | pageManagers); |
||
125 | |||
126 | return buffer;
|
||
127 | } |
||
128 | |||
129 | // @Override
|
||
130 | // public BandInfo getBandInfo(int band) {
|
||
131 | // return innerProvider.getBandInfo(band);
|
||
132 | // }
|
||
133 | |||
134 | @Override
|
||
135 | public int getBands() { |
||
136 | return bandsNumber;
|
||
137 | } |
||
138 | |||
139 | @Override
|
||
140 | public DataServerExplorer getExplorer() throws ReadException, ValidateDataParametersException { |
||
141 | return null; |
||
142 | } |
||
143 | |||
144 | @Override
|
||
145 | public void open() throws OpenException { |
||
146 | if (this.tileStructImage != null) { |
||
147 | return;
|
||
148 | } |
||
149 | } |
||
150 | |||
151 | protected List<PageManager> getPageManagersInZoom(int zoomLevel) { |
||
152 | List<PageManager> pageManagersInZoom = this.pageManagersPerZoomLevel.get(zoomLevel); |
||
153 | if (pageManagersInZoom == null) { |
||
154 | pageManagersInZoom = new ArrayList<PageManager>(); |
||
155 | for (int i = 0; i < tileStructImage.getBandNumber(); i++) { |
||
156 | pageManagersInZoom.add(new TileCacheBandPageManager(tileStructImage, zoomLevel, i));
|
||
157 | } |
||
158 | this.pageManagersPerZoomLevel.put(zoomLevel, pageManagersInZoom);
|
||
159 | } |
||
160 | return pageManagersInZoom;
|
||
161 | } |
||
162 | |||
163 | @Override
|
||
164 | public Object getDynValue(String name) throws DynFieldNotFoundException { |
||
165 | if (DataStore.METADATA_ENVELOPE.equalsIgnoreCase(name)) {
|
||
166 | return this.envelope; |
||
167 | } |
||
168 | if (DataStore.METADATA_CRS.equalsIgnoreCase(name)) {
|
||
169 | return this.innerProvider.getDynValue(name); |
||
170 | } |
||
171 | return super.getDynValue(name); |
||
172 | } |
||
173 | |||
174 | @Override
|
||
175 | public TileStruct getTileStruct() {
|
||
176 | return innerProvider.getTileStruct();
|
||
177 | } |
||
178 | |||
179 | protected void setTileStructImage(TileCacheStructImage tileStructImage) { |
||
180 | this.tileStructImage = tileStructImage;
|
||
181 | for (int i = 0; i < this.tileStructImage.getBandNumber(); i++) { |
||
182 | this.getBandDescriptor(i).setDataType(this.tileStructImage.getDataTypes()[i]); |
||
183 | } |
||
184 | } |
||
185 | |||
186 | /**
|
||
187 | * @return TileStructImage
|
||
188 | */
|
||
189 | public TileStructImage getTileStructImage() {
|
||
190 | return tileStructImage;
|
||
191 | } |
||
192 | |||
193 | @Override
|
||
194 | public void deleteAll() { |
||
195 | tileStructImage.forgetCache(); |
||
196 | } |
||
197 | |||
198 | @Override
|
||
199 | public void close() throws CloseException { |
||
200 | this.tileStructImage = null; |
||
201 | } |
||
202 | |||
203 | @Override
|
||
204 | public String getName() { |
||
205 | return this.innerProvider.getName(); |
||
206 | } |
||
207 | |||
208 | @Override
|
||
209 | public String getFullName() { |
||
210 | return this.innerProvider.getFullName(); |
||
211 | } |
||
212 | |||
213 | @Override
|
||
214 | protected void doDispose() throws BaseException { |
||
215 | super.doDispose();
|
||
216 | if (this.tileStructImage != null) { |
||
217 | DisposeUtils.dispose((AbstractDisposable) tileStructImage); |
||
218 | this.tileStructImage = null; |
||
219 | } |
||
220 | |||
221 | Set<Entry<Integer, List<PageManager>>> entrySet = pageManagersPerZoomLevel.entrySet(); |
||
222 | for (Iterator<Entry<Integer, List<PageManager>>> iterator = entrySet.iterator(); iterator.hasNext();) { |
||
223 | Entry<Integer, List<PageManager>> entry = (Entry<Integer, List<PageManager>>) iterator.next(); |
||
224 | List<PageManager> pageManagers = entry.getValue();
|
||
225 | for (Iterator<PageManager> iterator2 = pageManagers.iterator(); iterator2.hasNext();) { |
||
226 | PageManager pageManager = (PageManager) iterator2.next(); |
||
227 | DisposeUtils.dispose(pageManager); |
||
228 | iterator2.remove(); |
||
229 | } |
||
230 | iterator.remove(); |
||
231 | } |
||
232 | } |
||
233 | |||
234 | @Override
|
||
235 | public void apply(RasterStoreProvider provider, IProjection crs, RasterQuery query) throws DataException { |
||
236 | this.innerProvider = provider;
|
||
237 | pageManagersPerZoomLevel = new HashMap<Integer, List<PageManager>>(); |
||
238 | } |
||
239 | |||
240 | @Override
|
||
241 | public RasterStoreProvider getInnerProvider() {
|
||
242 | return innerProvider;
|
||
243 | } |
||
244 | |||
245 | @Override
|
||
246 | public BufferDimensions getDimensions() throws InitializeException { |
||
247 | return innerProvider.getDimensions();
|
||
248 | } |
||
249 | |||
250 | @Override
|
||
251 | public boolean isTiled() { |
||
252 | return true; |
||
253 | } |
||
254 | } |