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

History | View | Annotate | Download (9.8 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.util.ArrayList;
27

    
28
import org.gvsig.fmap.dal.coverage.RasterLocator;
29
import org.gvsig.raster.wmts.io.WMTSProvider;
30
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
31
import org.gvsig.fmap.dal.coverage.store.parameter.WMTSDataParameters;
32
import org.gvsig.fmap.dal.coverage.util.MathUtils;
33
import org.gvsig.raster.cache.tile.Tile;
34
import org.gvsig.raster.cache.tile.provider.CacheStruct;
35
import org.gvsig.remoteclient.wmts.WMTSStatus;
36
import org.gvsig.remoteclient.wmts.struct.WMTSTileMatrix;
37
import org.gvsig.remoteclient.wmts.struct.WMTSTileMatrixLimits;
38
import org.gvsig.remoteclient.wmts.struct.WMTSTileMatrixSet;
39
import org.gvsig.remoteclient.wmts.struct.WMTSTileMatrixSetLink;
40
import org.gvsig.raster.cache.tile.TileCacheLocator;
41
import org.gvsig.raster.cache.tile.TileCacheManager;
42

    
43
/**
44
 * Implementation for a structure of a cache
45
 * @author Nacho Brodin (nachobrodin@gmail.com)
46
 */
47
public class WMTSCacheStruct implements CacheStruct {
48
    private String                        layerName           = null;
49
        private String                        serverURL           = null;
50
        private WMTSTileMatrixSet             tileMatrixSet       = null;
51
        private ArrayList<?>                  tileMatrixSetLimits = null;
52
        private double[]                      pixelSize           = null;
53
    private WMTSProvider                  provider            = null;
54
    
55
    public WMTSCacheStruct(WMTSProvider provider, WMTSTileMatrixSetLink tileMatrixSetLink) {
56
            this.provider = provider;
57
            this.tileMatrixSet = tileMatrixSetLink.getTileMatrixSet();
58
                this.tileMatrixSetLimits = tileMatrixSetLink.getTileMatrixLimits();
59
                pixelSize = provider.getPixelSizeByLevel();
60
                layerName = provider.getFName();
61
                serverURL = ((WMTSDataParameters)provider.getDataParameters()).getHost();
62
    }
63

    
64
    /*
65
     * (non-Javadoc)
66
     * @see org.gvsig.raster.cache.tile.provider.CacheStruct#getNumberOfLevels()
67
     */
68
        public int getNumberOfLevels() {
69
                return tileMatrixSet.getTileMatrix().size();
70
        }
71

    
72
        /*
73
         * (non-Javadoc)
74
         * @see org.gvsig.raster.cache.tile.provider.CacheStruct#getLayerName()
75
         */
76
        public String getLayerName() {
77
                return layerName;
78
        }
79

    
80
        /*
81
         * (non-Javadoc)
82
         * @see org.gvsig.raster.cache.tile.provider.CacheStruct#getServerURL()
83
         */
84
        public String getServerURL() {
85
                return serverURL;
86
        }
87

    
88
        /*
89
         * (non-Javadoc)
90
         * @see org.gvsig.raster.cache.tile.provider.CacheStruct#getTileSizeByLevel(int)
91
         */
92
        public int[] getTileSizeByLevel(int level) {
93
                return new int[] {
94
                        ((WMTSTileMatrix)tileMatrixSet.getTileMatrix().get(level)).getTileWidth(),
95
                        ((WMTSTileMatrix)tileMatrixSet.getTileMatrix().get(level)).getTileHeight()
96
                };
97
        }
98

    
99
        /*
100
         * (non-Javadoc)
101
         * @see org.gvsig.raster.cache.tile.provider.CacheStruct#getLayerWidthOfTileMatrixByLevel(int)
102
         */
103
        public int getLayerWidthOfTileMatrixByLevel(int level) {
104
                WMTSTileMatrixLimits l = (WMTSTileMatrixLimits)tileMatrixSetLimits.get(level);
105
                return l.getMaxTileRow() - l.getMinTileRow();
106
        }
107
        
108
        /*
109
         * (non-Javadoc)
110
         * @see org.gvsig.raster.cache.tile.provider.CacheStruct#getLayerHeightOfTileMatrixByLevel(int)
111
         */
112
        public int getLayerHeightOfTileMatrixByLevel(int level) {
113
                WMTSTileMatrixLimits l = (WMTSTileMatrixLimits)tileMatrixSetLimits.get(level);
114
                return l.getMaxTileCol() - l.getMinTileCol();
115
        }
116

    
117
        /*
118
         * (non-Javadoc)
119
         * @see org.gvsig.raster.cache.tile.provider.CacheStruct#getLayerInitXTilePositionByLevel(int)
120
         */
121
        public int getLayerInitXTilePositionByLevel(int level) {
122
                WMTSTileMatrixLimits l = (WMTSTileMatrixLimits)tileMatrixSetLimits.get(level);
123
                return l.getMinTileCol();
124
        }
125

    
126
        /*
127
         * (non-Javadoc)
128
         * @see org.gvsig.raster.cache.tile.provider.CacheStruct#getLayerInitYTilePositionByLevel(int)
129
         */
130
        public int getLayerInitYTilePositionByLevel(int level) {
131
                WMTSTileMatrixLimits l = (WMTSTileMatrixLimits)tileMatrixSetLimits.get(level);
132
                return l.getMinTileRow();
133
        }
134

    
135
        /*
136
         * (non-Javadoc)
137
         * @see org.gvsig.raster.cache.tile.provider.CacheStruct#getWorldHeightOfTileMatrixByLevel(int)
138
         */
139
        public long getWorldHeightOfTileMatrixByLevel(int level) {
140
                return ((WMTSTileMatrix)tileMatrixSet.getTileMatrix().get(level)).getMatrixWidth();
141
        }
142

    
143
        /*
144
         * (non-Javadoc)
145
         * @see org.gvsig.raster.cache.tile.provider.CacheStruct#getWorldWidthOfTileMatrixByLevel(int)
146
         */
147
        public long getWorldWidthOfTileMatrixByLevel(int level) {
148
                return ((WMTSTileMatrix)tileMatrixSet.getTileMatrix().get(level)).getMatrixHeight();
149
        }
150
        
151
        /*
152
         * (non-Javadoc)
153
         * @see org.gvsig.raster.cache.tile.provider.CacheStruct#getPixelSizeByLevel(int)
154
         */
155
        public double getPixelSizeByLevel(int level) {
156
                if(level < pixelSize.length)
157
                        return pixelSize[level];
158
                else
159
                        return pixelSize[pixelSize.length - 1];
160
        }
161
        
162
        /*
163
         * (non-Javadoc)
164
         * @see org.gvsig.raster.cache.tile.provider.CacheStruct#getTileExtent(org.gvsig.raster.cache.tile.Tile)
165
         */
166
        public Point2D[] getTileExtent(Tile tile) {
167
                return getTileExtent(tile.getLevel(), tile.getCol(), tile.getRow());
168
        }
169
        
170
        /*
171
         * (non-Javadoc)
172
         * @see org.gvsig.raster.cache.tile.provider.CacheStruct#getTileExtent(int, int, int)
173
         */
174
        public Point2D[] getTileExtent(int level, int col, int row) {
175
                double[] ul = tileMatrixSet.getBoundingBox().getUpperCorner();
176
                long tileWidth = ((WMTSTileMatrix)tileMatrixSet.getTileMatrix().get(level)).getTileWidth();
177
                long tileHeight = ((WMTSTileMatrix)tileMatrixSet.getTileMatrix().get(level)).getTileHeight();
178
                double mtsWidthTile = tileWidth * pixelSize[level];
179
                double mtsHeightTile = tileHeight * pixelSize[level];
180
                double ulx = ul[0] + (col * mtsWidthTile);
181
                double uly = ulx + mtsWidthTile;
182
                double lrx = ul[1] - (row * mtsHeightTile);
183
                double lry = lrx - mtsHeightTile;
184
                return new Point2D[]{new Point2D.Double(ulx, uly), new Point2D.Double(lrx, lry)};
185
        }
186
        
187
        /*
188
         * (non-Javadoc)
189
         * @see org.gvsig.raster.cache.tile.provider.CacheStruct#getTileList(java.awt.geom.Point2D, java.awt.geom.Point2D)
190
         */
191
        @SuppressWarnings("unchecked")
192
        public ArrayList<Tile> getTileList(Point2D ul, Point2D lr, double mtsPixelRequest) {
193
                Rectangle2D r = new Rectangle2D.Double(Math.min(ul.getX(), lr.getX()), 
194
                                Math.min(ul.getY(), lr.getY()), 
195
                                Math.abs(ul.getX() - lr.getX()), 
196
                                Math.abs(ul.getY() - lr.getY()));
197
                int bufWidth = (int)(r.getWidth() / mtsPixelRequest);
198
                int bufHeight = (int)(r.getHeight() / mtsPixelRequest);
199
                try {
200
                        WMTSStatus status = provider.buildWMTSStatus(r, bufWidth, bufHeight);
201
                        
202
                        //Conversi?n a tiles de la librer?a
203
                        ArrayList<org.gvsig.remoteclient.wmts.struct.WMTSTileMatrix.Tile> tiles = status.getTileList();
204
                        ArrayList<Tile> tileList = new ArrayList<Tile>();
205
                        for (int i = 0; i < tiles.size(); i++) {
206
                                org.gvsig.remoteclient.wmts.struct.WMTSTileMatrix.Tile tOrigin = (org.gvsig.remoteclient.wmts.struct.WMTSTileMatrix.Tile) tiles.get(i);
207
                                Tile t = TileCacheLocator.getManager().createTile(status.getLevel(), tOrigin.col, tOrigin.row);
208
                                t.setUl(new Point2D.Double(tOrigin.ulx, tOrigin.uly));
209
                                t.setLr(new Point2D.Double(tOrigin.lrx, tOrigin.lry));
210
                                t.setWidthPx(tOrigin.wPx);
211
                                t.setHeightPx(tOrigin.hPx);
212
                                t.setDownloaderParams("WMTSStatus", status);
213
                                tileList.add(t);
214
                        }
215
                        return tileList;
216
                } catch (RasterDriverException e) {
217
                        e.printStackTrace();
218
                }
219
                return null;
220
        }
221

    
222
        /*
223
         * (non-Javadoc)
224
         * @see org.gvsig.raster.cache.tile.provider.CacheStruct#getTileSizeInRealCoordsByLevel(int)
225
         */
226
        public double[] getTileSizeInRealCoordsByLevel(int level) {
227
                return new double[] {
228
                                getPixelSizeByLevel(level) * getTileSizeByLevel(level)[0],
229
                                getPixelSizeByLevel(level) *  getTileSizeByLevel(level)[1]
230
                        };
231
        }
232
        
233
        /*
234
         * (non-Javadoc)
235
         * @see org.gvsig.raster.cache.tile.provider.CacheStruct#getFileSuffix()
236
         */
237
        public String getFileSuffix() {
238
                return provider.getFileSuffix();
239
        }
240

    
241
        /*
242
         * (non-Javadoc)
243
         * @see org.gvsig.raster.cache.tile.provider.CacheStruct#compare(org.gvsig.raster.cache.tile.provider.CacheStruct)
244
         */
245
        public boolean compare(CacheStruct struct) {
246
                MathUtils mu = RasterLocator.getManager().getMathUtils();
247
                //Compara: n?mero de niveles, tama?o de tile, 
248
                //anchoXalto de la matriz, tama?o de pixel por nivel, 
249
                //coordenadas de al menos un tile de la matriz
250
                if(struct.getNumberOfLevels() == getNumberOfLevels()) {
251
                        for (int i = 0; i < getNumberOfLevels(); i++) {
252
                                if(        struct.getTileSizeByLevel(i)[0] == getTileSizeByLevel(i)[0] && 
253
                                        struct.getTileSizeByLevel(i)[1] == getTileSizeByLevel(i)[1] &&
254
                                        struct.getWorldHeightOfTileMatrixByLevel(i) == getWorldHeightOfTileMatrixByLevel(i) &&
255
                                        struct.getWorldWidthOfTileMatrixByLevel(i) == getWorldWidthOfTileMatrixByLevel(i) &&
256
                                        mu.clipDecimals(struct.getPixelSizeByLevel(i), 2) == mu.clipDecimals(getPixelSizeByLevel(i), 2) &&
257
                                        compareExtents(struct.getTileExtent(i, 0, 0), getTileExtent(i, 0, 0))) {
258
                                        return true;
259
                                }
260
                        }
261
                }
262
                return false;
263
        }
264
        
265
        private boolean compareExtents(Point2D[] p, Point2D[] p1) {
266
                return (p[0].getX() == p1[0].getX() && p[0].getY() == p1[0].getY() &&
267
                                p[1].getX() == p1[1].getX() && p[1].getY() == p1[1].getY());
268
        }
269
}