Statistics
| Revision:

gvsig-raster / org.gvsig.raster.wmts / trunk / org.gvsig.raster.wmts / org.gvsig.raster.wmts.io / src / main / java / org / gvsig / raster / wmts / io / downloader / WMTSCacheStruct.java @ 4272

History | View | Annotate | Download (10.2 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.raster.wmts.io.downloader;
23

    
24
import java.awt.geom.Point2D;
25
import java.awt.geom.Rectangle2D;
26
import java.io.File;
27
import java.net.URL;
28
import java.util.ArrayList;
29
import java.util.List;
30

    
31
import org.gvsig.fmap.dal.coverage.RasterLocator;
32
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
33
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
34
import org.gvsig.fmap.dal.coverage.util.MathUtils;
35
import org.gvsig.raster.cache.tile.Tile;
36
import org.gvsig.raster.cache.tile.TileCacheLocator;
37
import org.gvsig.raster.cache.tile.exception.TileBuildException;
38
import org.gvsig.raster.cache.tile.provider.CacheStruct;
39
import org.gvsig.raster.wmts.io.WMTSDataParameters;
40
import org.gvsig.raster.wmts.io.WMTSProvider;
41
import org.gvsig.raster.wmts.ogc.WMTSStatus;
42
import org.gvsig.raster.wmts.ogc.struct.WMTSTile;
43
import org.gvsig.raster.wmts.ogc.struct.WMTSTileMatrix;
44
import org.gvsig.raster.wmts.ogc.struct.WMTSTileMatrixLimits;
45
import org.gvsig.raster.wmts.ogc.struct.WMTSTileMatrixSet;
46
import org.gvsig.raster.wmts.ogc.struct.WMTSTileMatrixSetLink;
47

    
48
/**
49
 * Implementation for a structure of a cache
50
 * @author Nacho Brodin (nachobrodin@gmail.com)
51
 */
52
public class WMTSCacheStruct implements CacheStruct {
53
    private String                        layerName           = null;
54
        private String                        serverURL           = null;
55
        private WMTSTileMatrixSet             tileMatrixSet       = null;
56
        private List<WMTSTileMatrixLimits>    tileMatrixSetLimits = null;
57
        private double[]                      pixelSize           = null;
58
    private RasterDataStore               store               = null;
59

    
60
    public WMTSCacheStruct(RasterDataStore store, WMTSTileMatrixSetLink tileMatrixSetLink) {
61
            this.store = store;
62
            this.tileMatrixSet = tileMatrixSetLink.getTileMatrixSet();
63
                this.tileMatrixSetLimits = tileMatrixSetLink.getTileMatrixLimits();
64
                pixelSize = ((WMTSProvider)store.getProvider()).getPixelSizeByLevel();
65
                serverURL = ((WMTSProvider)store.getProvider()).getURIOfFirstProvider().getPath();
66
                layerName = ((WMTSDataParameters)store.getParameters()).getLayer().getTitle();
67
    }
68

    
69
        public int getNumberOfLevels() {
70
                return tileMatrixSet.getTileMatrix().size();
71
        }
72

    
73
        public String getLayerName() {
74
                return layerName;
75
        }
76

    
77
        public String getServerURL() {
78
                return serverURL + getDimension();
79
        }
80

    
81
        public int[] getTileSizeByLevel(int level) {
82
                return new int[] {
83
                        ((WMTSTileMatrix)tileMatrixSet.getTileMatrix().get(level)).getTileWidth(),
84
                        ((WMTSTileMatrix)tileMatrixSet.getTileMatrix().get(level)).getTileHeight()
85
                };
86
        }
87

    
88
        public int getLayerWidthOfTileMatrixByLevel(int level) {
89
                if(tileMatrixSetLimits != null && tileMatrixSetLimits.size() > level) {
90
                        WMTSTileMatrixLimits l = (WMTSTileMatrixLimits)tileMatrixSetLimits.get(level);
91
                        return l.getMaxTileRow() - l.getMinTileRow();
92
                } else {
93
                        WMTSTileMatrix tm = (WMTSTileMatrix)tileMatrixSet.getTileMatrix().get(level);
94
                        return (int)tm.getMatrixWidth();
95
                }
96
        }
97

    
98
        public int getLayerHeightOfTileMatrixByLevel(int level) {
99
                if(tileMatrixSetLimits != null && tileMatrixSetLimits.size() > level) {
100
                        WMTSTileMatrixLimits l = (WMTSTileMatrixLimits)tileMatrixSetLimits.get(level);
101
                        return l.getMaxTileCol() - l.getMinTileCol();
102
                } else {
103
                        WMTSTileMatrix tm = (WMTSTileMatrix)tileMatrixSet.getTileMatrix().get(level);
104
                        return (int)tm.getMatrixHeight();
105
                }
106
        }
107

    
108
        public int getLayerInitXTilePositionByLevel(int level) {
109
                if(tileMatrixSetLimits != null && tileMatrixSetLimits.size() > level) {
110
                        WMTSTileMatrixLimits l = (WMTSTileMatrixLimits)tileMatrixSetLimits.get(level);
111
                        return l.getMinTileCol();
112
                } else
113
                        return 0;
114
        }
115

    
116
        public int getLayerInitYTilePositionByLevel(int level) {
117
                if(tileMatrixSetLimits != null && tileMatrixSetLimits.size() > level) {
118
                        WMTSTileMatrixLimits l = (WMTSTileMatrixLimits)tileMatrixSetLimits.get(level);
119
                        return l.getMinTileRow();
120
                } else
121
                        return 0;
122
        }
123

    
124
        public long getWorldHeightOfTileMatrixByLevel(int level) {
125
                return ((WMTSTileMatrix)tileMatrixSet.getTileMatrix().get(level)).getMatrixWidth();
126
        }
127

    
128
        public long getWorldWidthOfTileMatrixByLevel(int level) {
129
                return ((WMTSTileMatrix)tileMatrixSet.getTileMatrix().get(level)).getMatrixHeight();
130
        }
131

    
132
        public double getPixelSizeByLevel(int level) {
133
                if(level < pixelSize.length)
134
                        return pixelSize[level];
135
                else
136
                        return pixelSize[pixelSize.length - 1];
137
        }
138

    
139
        public Point2D[] getTileExtent(Tile tile) {
140
                return getTileExtent(tile.getLevel(), tile.getCol(), tile.getRow());
141
        }
142

    
143
        public Point2D[] getTileExtent(int level, int col, int row) {
144
                double[] ul = tileMatrixSet.getBoundingBox().getUpperCorner();
145
                long tileWidth = ((WMTSTileMatrix)tileMatrixSet.getTileMatrix().get(level)).getTileWidth();
146
                long tileHeight = ((WMTSTileMatrix)tileMatrixSet.getTileMatrix().get(level)).getTileHeight();
147
                double mtsWidthTile = tileWidth * pixelSize[level];
148
                double mtsHeightTile = tileHeight * pixelSize[level];
149
                double ulx = ul[0] + (col * mtsWidthTile);
150
                double uly = ulx + mtsWidthTile;
151
                double lrx = ul[1] - (row * mtsHeightTile);
152
                double lry = lrx - mtsHeightTile;
153
                return new Point2D[]{new Point2D.Double(ulx, uly), new Point2D.Double(lrx, lry)};
154
        }
155

    
156
        public Tile getTileStructure(int level, int tileCol, int tileRow, Point2D ul, Point2D lr) throws TileBuildException  {
157
                int[] size = getTileSizeByLevel(level);
158
                Tile tile = TileCacheLocator.getManager().createTile(level, tileRow, tileCol);
159
                tile.setUl(ul);
160
                tile.setLr(lr);
161
                tile.setWidthPx(size[0]);
162
                tile.setHeightPx(size[1]);
163

    
164
                Rectangle2D r = new Rectangle2D.Double(Math.min(ul.getX(), lr.getX()),
165
                                Math.min(ul.getY(), lr.getY()),
166
                                Math.abs(ul.getX() - lr.getX()),
167
                                Math.abs(ul.getY() - lr.getY()));
168
                int bufWidth = (int)(r.getWidth() / getPixelSizeByLevel(level));
169
                int bufHeight = (int)(r.getHeight() / getPixelSizeByLevel(level));
170
                try {
171
                        WMTSStatus status = ((WMTSProvider)store.getProvider()).buildWMTSStatus(r, bufWidth, bufHeight);
172
                        tile.setDownloaderParams("WMTSStatus", status);
173
                } catch (RasterDriverException e) {
174
                        throw new TileBuildException(e);
175
                }
176

    
177
                return tile;
178
        }
179

    
180
        public List<Tile> getTileList(Point2D ul, Point2D lr, double mtsPixelRequest) throws TileBuildException {
181
                Rectangle2D r = new Rectangle2D.Double(Math.min(ul.getX(), lr.getX()),
182
                                Math.min(ul.getY(), lr.getY()),
183
                                Math.abs(ul.getX() - lr.getX()),
184
                                Math.abs(ul.getY() - lr.getY()));
185
                int bufWidth = (int)(r.getWidth() / mtsPixelRequest);
186
                int bufHeight = (int)(r.getHeight() / mtsPixelRequest);
187
                try {
188
                        WMTSStatus status = ((WMTSProvider)store.getProvider()).buildWMTSStatus(r, bufWidth, bufHeight);
189

    
190
                        //Conversi?n a tiles de la librer?a
191
                        List<WMTSTile> tiles = status.getTileList();
192
                        List<Tile> tileList = new ArrayList<Tile>();
193
                        for (int i = 0; i < tiles.size(); i++) {
194
                                WMTSTile tOrigin = (WMTSTile) tiles.get(i);
195
                                Tile t = TileCacheLocator.getManager().createTile(status.getLevel(), tOrigin.getCol(), tOrigin.getRow());
196
                                t.setUl(new Point2D.Double(tOrigin.getULX(), tOrigin.getULY()));
197
                                t.setLr(new Point2D.Double(tOrigin.getLRX(), tOrigin.getLRY()));
198
                                t.setWidthPx(tOrigin.getWidthPx());
199
                                t.setHeightPx(tOrigin.getHeightPx());
200
                                t.setDownloaderParams("WMTSStatus", status.cloneStatus());
201
                                tileList.add(t);
202
                        }
203
                        return tileList;
204
                } catch (RasterDriverException e) {
205
                        throw new TileBuildException(e);
206
                }
207
        }
208

    
209
        public double[] getTileSizeInRealCoordsByLevel(int level) {
210
                return new double[] {
211
                                getPixelSizeByLevel(level) * getTileSizeByLevel(level)[0],
212
                                getPixelSizeByLevel(level) *  getTileSizeByLevel(level)[1]
213
                        };
214
        }
215

    
216
        public String getFileSuffix() {
217
                return ((WMTSProvider)store.getProvider()).getFileSuffix();
218
        }
219

    
220
        public boolean compare(CacheStruct struct) {
221
                MathUtils mu = RasterLocator.getManager().getMathUtils();
222
                //Compara: n?mero de niveles, tama?o de tile,
223
                //anchoXalto de la matriz, tama?o de pixel por nivel,
224
                //coordenadas de al menos un tile de la matriz
225
                if(struct.getNumberOfLevels() == getNumberOfLevels()) {
226
                        for (int i = 0; i < getNumberOfLevels(); i++) {
227
                                if(        struct.getTileSizeByLevel(i)[0] == getTileSizeByLevel(i)[0] &&
228
                                        struct.getTileSizeByLevel(i)[1] == getTileSizeByLevel(i)[1] &&
229
                                        struct.getWorldHeightOfTileMatrixByLevel(i) == getWorldHeightOfTileMatrixByLevel(i) &&
230
                                        struct.getWorldWidthOfTileMatrixByLevel(i) == getWorldWidthOfTileMatrixByLevel(i) &&
231
                                        mu.clipDecimals(struct.getPixelSizeByLevel(i), 2) == mu.clipDecimals(getPixelSizeByLevel(i), 2) &&
232
                                        compareExtents(struct.getTileExtent(i, 0, 0), getTileExtent(i, 0, 0))) {
233
                                        return true;
234
                                }
235
                        }
236
                }
237
                return false;
238
        }
239

    
240
        private boolean compareExtents(Point2D[] p, Point2D[] p1) {
241
                return (p[0].getX() == p1[0].getX() && p[0].getY() == p1[0].getY() &&
242
                                p[1].getX() == p1[1].getX() && p[1].getY() == p1[1].getY());
243
        }
244

    
245
        public String getEPSG() {
246
                /*IProjection proj = provider.getProjection();
247
                if(proj != null)
248
                        return proj.getAbrev();
249
                return null;*/
250
                return ((WMTSProvider)store.getProvider()).getSRSCode();
251
        }
252

    
253
        private String getDimension() {
254
                WMTSDataParameters p = (WMTSDataParameters)(((WMTSProvider)store.getProvider()).getDataParameters());
255
                String dimension = p.getDimension();
256
                String dimensionValue = p.getDimensionSelectedValue();
257
                if(dimension != null && dimensionValue != null)
258
                        return dimension + "_" + dimensionValue;
259
                return "";
260
        }
261

    
262
        public String getFileSize() {
263
                return "0";
264
        }
265

    
266
        public List<Tile> getTileList(int x, int y, int w, int h) {
267
                return null;
268
        }
269

    
270
        public ArrayList<Tile> getTileList(Rectangle2D r) {
271
                return null;
272
        }
273
}