Revision 7950

View differences:

org.gvsig.raster.wmts/tags/org.gvsig.raster.wmts-2.2.57/org.gvsig.raster.wmts.io/src/main/resources/META-INF/services/org.gvsig.tools.library.Library
1
org.gvsig.raster.wmts.io.DefaultWMTSIOLibrary
org.gvsig.raster.wmts/tags/org.gvsig.raster.wmts-2.2.57/org.gvsig.raster.wmts.io/src/main/java/org/gvsig/raster/wmts/io/TilePipe.java
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;
23

  
24
import org.gvsig.raster.wmts.ogc.struct.WMTSTile;
25

  
26

  
27
/**
28
 * This class manages transactions between the producer and the consumer. The
29
 * producer download tiles from a server and the consumer is a tile provider
30
 * which will return downloaded tiles.
31
 *
32
 * @author Nacho Brodin (nachobrodin@gmail.com)
33
 */
34
public class TilePipe {
35
	//N?mero de threads m?ximos a lanzar para descarga. Cuando se lanzan m?s de estos el 
36
	//invocador debe dormir hasta que se haya liberado alguno.
37
	public static int            NTHREADS_QUEUE = 5;
38
	//N?mero m?ximo de elementos en la tuberia. Cuando se llene esta el setTile de esta clase debe
39
	//dormir hasta que getTile lo despierte.
40
	private final static int     BUFFER_SIZE    = 10;
41
	
42
	private WMTSTile             buffer[]       = new WMTSTile[BUFFER_SIZE];
43
	private int                  next           = 0;
44
	private boolean              isFull         = false;
45
	private boolean              isEmpty        = true;
46
	private Thread               threadManager  = null;
47

  
48
	/**
49
	 * El thread manager no se usa con la pool solo para la implementaci?n de RequestThreadManager
50
	 * @param threadManager
51
	 */
52
	public void setRequestManager(Thread threadManager) {
53
		this.threadManager = threadManager;
54
	}
55
	
56
	/**
57
	 * Sets a tile in the pipe
58
	 * @param tile
59
	 */
60
	public synchronized void setTile(WMTSTile tile) {
61
		while( isFull == true ) {
62
			try {
63
				wait();
64
			} catch( InterruptedException e ) {
65
			}
66
		}
67
		buffer[next] = tile;
68
		next++;
69
		if( next == BUFFER_SIZE )
70
			isFull = true;
71
		isEmpty = false;
72
		notify();
73
	}
74

  
75
	/**
76
	 * Gets a tile from the pipe
77
	 * @return
78
	 */
79
	public synchronized WMTSTile getTile() {
80
		while( isEmpty == true ) {
81
			try {
82
				wait();
83
			} catch( InterruptedException e ) {
84
			}
85
		}
86
        next--;
87
        if( next == 0 )
88
        	isEmpty = true;
89
        isFull = false;
90
        notify();
91
        if(threadManager != null && getSize() <= NTHREADS_QUEUE) {
92
        	synchronized(threadManager) {
93
        		threadManager.notify();
94
        	}
95
        }
96
        	
97
        return buffer[next] ;
98
	}
99
	
100
	/**
101
	 * Returns the number of elements in the queue
102
	 * @return
103
	 */
104
	public synchronized int getSize() {
105
		return next;
106
	}
107
}
0 108

  
org.gvsig.raster.wmts/tags/org.gvsig.raster.wmts-2.2.57/org.gvsig.raster.wmts.io/src/main/java/org/gvsig/raster/wmts/io/DefaultWMTSIOLibrary.java
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;
23

  
24
import org.gvsig.tools.library.AbstractLibrary;
25
import org.gvsig.tools.library.LibraryException;
26
/**
27
 *
28
 * @author Nacho Brodin (nachobrodin@gmail.com)
29
 */
30
public class DefaultWMTSIOLibrary extends AbstractLibrary {	
31

  
32
	public DefaultWMTSIOLibrary() {
33
		/*super(DefaultWMTSIOLibrary.class,Library.TYPE.IMPL);
34
		require(ToolsLibrary.class);
35
		require(DALLibrary.class);
36
		require(DALFileLibrary.class);*/
37
	}
38
	
39
	@Override
40
	protected void doInitialize() throws LibraryException {
41
		//RasterLibrary.wakeUp();
42
	}
43

  
44
	@Override
45
	protected void doPostInitialize() throws LibraryException {
46
		WMTSServerExplorerParameters.registerDynClass();
47
		WMTSDataParametersImpl.registerDynClass();
48
		WMTSProvider.register();
49
	}
50
}
0 51

  
org.gvsig.raster.wmts/tags/org.gvsig.raster.wmts-2.2.57/org.gvsig.raster.wmts.io/src/main/java/org/gvsig/raster/wmts/io/downloader/TileDownloaderForWMTS.java
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.io.File;
25
import java.io.IOException;
26
import java.net.ConnectException;
27
import java.net.URL;
28

  
29
import org.gvsig.compat.net.ICancellable;
30
import org.gvsig.fmap.dal.coverage.exception.RemoteServiceException;
31
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
32
import org.gvsig.raster.cache.tile.Tile;
33
import org.gvsig.raster.cache.tile.exception.TileGettingException;
34
import org.gvsig.raster.impl.provider.tile.BaseTileDownloader;
35
import org.gvsig.raster.wmts.io.WMTSDataParameters;
36
import org.gvsig.raster.wmts.ogc.WMTSClient;
37
import org.gvsig.raster.wmts.ogc.WMTSOGCLocator;
38
import org.gvsig.raster.wmts.ogc.WMTSStatus;
39
import org.gvsig.raster.wmts.ogc.exception.ServerErrorException;
40
import org.gvsig.raster.wmts.ogc.exception.WMTSException;
41

  
42
/**
43
 * Tile getter
44
 * @author Nacho Brodin (nachobrodin@gmail.com)
45
 */
46
public class TileDownloaderForWMTS extends BaseTileDownloader {
47
	private WMTSClient             ogcClient  = null;
48

  
49
	public TileDownloaderForWMTS(RasterDataStore store,
50
			int tilePxWidth,
51
			int tilePxHeight) {
52
		super(store, tilePxWidth, tilePxHeight);
53
	}
54

  
55
	/**
56
	 * Gets the connector from the URL
57
	 * @return
58
	 * @throws RemoteServiceException
59
	 */
60
	public WMTSClient getOGCClient() throws WMTSException {
61
		if(ogcClient == null) {
62
			WMTSDataParameters p = (WMTSDataParameters)store.getParameters();
63
			ogcClient = p.getOGCClient();
64
			if(ogcClient != null)
65
				return ogcClient;
66

  
67
			URL url = null;
68
			try {
69
				url = p.getURI().toURL();
70
			} catch (Exception e) {
71
				throw new WMTSException("Malformed URL",e);
72
			}
73
			try {
74
				ogcClient = WMTSOGCLocator.getManager().createWMTSClient(url.toString());
75
				ogcClient.connect(false, new ICancellable() {
76
					public boolean isCanceled() {
77
						return false;
78
					}
79

  
80
					public Object getID() {
81
						return null;
82
					}
83
				});
84
			} catch (ConnectException e) {
85
				throw new WMTSException("Connect exception",e);
86
			} catch (IOException e) {
87
				throw new WMTSException("Connect exception",e);
88
			}
89
		}
90
		return ogcClient;
91
	}
92

  
93
	public synchronized Tile downloadTile(Tile tile) throws TileGettingException {
94
		try {
95
			WMTSStatus status = (WMTSStatus)tile.getDownloaderParams("WMTSStatus");
96
			status.setTileRow(tile.getRow());
97
			status.setTileCol(tile.getCol());
98

  
99
			String urlFromTemplate = status.getResourceURL(tile.getRow() + "" + tile.getCol() + "");
100
			//System.out.println(urlFromTemplate);
101
			File f = null;
102
			if(urlFromTemplate != null)
103
				f = getOGCClient().getTile(urlFromTemplate, tile.getCancelled(), tile.getFile());
104
			else
105
				f = getOGCClient().getTile(status, tile.getCancelled(), tile.getFile());
106
			tile.setFile(f);
107
			//Si borramos el rmf no se puede leer la etiqueta Alpha. En caso de que se modifique jgdal para
108
			//poder guardar esta etiqueta deberiamos borrar el rmf para ahorrar ficheros
109
			//File rmf = new File(tile.getFile().getAbsolutePath() + ".rmf");
110
			//if(rmf.exists())
111
				//rmf.delete();
112
		} catch (WMTSException e) {
113
			throw new TileGettingException(e);
114
		} catch (ServerErrorException e) {
115
			throw new TileGettingException(e);
116
		}
117
		readTileFromDisk(tile);
118
		return tile;
119
	}
120

  
121
}
0 122

  
org.gvsig.raster.wmts/tags/org.gvsig.raster.wmts-2.2.57/org.gvsig.raster.wmts.io/src/main/java/org/gvsig/raster/wmts/io/downloader/WMTSTileServer.java
1
package org.gvsig.raster.wmts.io.downloader;
2

  
3
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
4
import org.gvsig.raster.cache.tile.provider.CacheStruct;
5
import org.gvsig.raster.cache.tile.provider.Downloader;
6
import org.gvsig.raster.cache.tile.provider.TileServer;
7
import org.gvsig.raster.wmts.ogc.struct.WMTSTileMatrix;
8
import org.gvsig.raster.wmts.ogc.struct.WMTSTileMatrixSetLink;
9

  
10
/** 
11
* Data server for the tile cache in a WMTSProvider 
12
* @author Nacho Brodin (nachobrodin@gmail.com)
13
*/
14
public class WMTSTileServer implements TileServer {
15
	private CacheStruct                struct               = null;
16
	private Downloader                 downloader           = null;
17
	private RasterDataStore            store                = null;
18
	private String                     suffix               = ".tif";
19
	private WMTSTileMatrixSetLink      tileMatrixSetLink    = null;
20
	
21
	public WMTSTileServer(RasterDataStore store, 
22
			WMTSTileMatrixSetLink tileMatrixSetLink) {
23
		this.store = store;
24
		this.tileMatrixSetLink = tileMatrixSetLink;
25
	}
26
	
27
	public Downloader getDownloader() {
28
		//if(downloader == null) {
29
			int tileWidth = ((WMTSTileMatrix)tileMatrixSetLink.getTileMatrixSet().getTileMatrix().get(0)).getTileWidth();
30
			int tileHeight = ((WMTSTileMatrix)tileMatrixSetLink.getTileMatrixSet().getTileMatrix().get(0)).getTileHeight();
31
			downloader = new TileDownloaderForWMTS(store, tileWidth, tileHeight);
32
		//}
33
		return downloader;
34
	}
35

  
36
	public CacheStruct getStruct() {
37
		if(struct == null) {
38
			struct = new WMTSCacheStruct(store, tileMatrixSetLink);
39
		}
40
		return struct;
41
	}
42
	
43
	public void setStruct(CacheStruct struct) {
44
		//La structura de cache es proporcionada por el servidor
45
	}
46
	
47
	public String getFileSuffix() {
48
		return suffix;
49
	}
50
	
51
	public void setFileSuffix(String extension) {
52
		this.suffix = extension;
53
	}
54
}
0 55

  
org.gvsig.raster.wmts/tags/org.gvsig.raster.wmts-2.2.57/org.gvsig.raster.wmts.io/src/main/java/org/gvsig/raster/wmts/io/downloader/WMTSCacheStruct.java
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
}
0 274

  
org.gvsig.raster.wmts/tags/org.gvsig.raster.wmts-2.2.57/org.gvsig.raster.wmts.io/src/main/java/org/gvsig/raster/wmts/io/package.html
1
<?xml version="1.0" encoding="UTF-8" ?>
2
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
<html xmlns="http://www.w3.org/1999/xhtml">
4
<head>
5
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6
<title>org.gvsig.raster.wmts.io package documentation</title>
7
</head>
8
<body>
9

  
10
	<p>WMTS provider</p>
11

  
12
</body>
13
</html>
0 14

  
org.gvsig.raster.wmts/tags/org.gvsig.raster.wmts-2.2.57/org.gvsig.raster.wmts.io/src/main/java/org/gvsig/raster/wmts/io/WMTSServerExplorer.java
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

  
23
/*
24
* AUTHORS (In addition to CIT):
25
* 2009 IVER T.I   {{Task}}
26
*/
27

  
28
package org.gvsig.raster.wmts.io;
29

  
30
import java.io.IOException;
31
import java.io.InputStream;
32
import java.net.MalformedURLException;
33
import java.net.URI;
34
import java.net.URISyntaxException;
35
import java.net.URL;
36
import java.net.URLConnection;
37
import java.util.List;
38

  
39
import org.slf4j.Logger;
40
import org.slf4j.LoggerFactory;
41

  
42
import org.gvsig.compat.net.ICancellable;
43
import org.gvsig.fmap.dal.DALLocator;
44
import org.gvsig.fmap.dal.DataManager;
45
import org.gvsig.fmap.dal.DataServerExplorerParameters;
46
import org.gvsig.fmap.dal.DataStoreParameters;
47
import org.gvsig.fmap.dal.NewDataStoreParameters;
48
import org.gvsig.fmap.dal.coverage.exception.ConnectException;
49
import org.gvsig.fmap.dal.coverage.store.RasterDataServerExplorer;
50
import org.gvsig.fmap.dal.coverage.store.parameter.TileDataParameters;
51
import org.gvsig.fmap.dal.exception.DataException;
52
import org.gvsig.fmap.dal.exception.InitializeException;
53
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
54
import org.gvsig.fmap.dal.spi.AbstractDataServerExplorer;
55
import org.gvsig.fmap.dal.spi.DataServerExplorerProvider;
56
import org.gvsig.fmap.dal.spi.DataServerExplorerProviderServices;
57
import org.gvsig.raster.wmts.ogc.WMTSClient;
58
import org.gvsig.raster.wmts.ogc.WMTSOGCLocator;
59

  
60
/**
61
 * Explorer for a WMTS server
62
 * @author Nacho Brodin (nachobrodin@gmail.com)
63
 */
64
public class WMTSServerExplorer extends AbstractDataServerExplorer implements RasterDataServerExplorer, DataServerExplorerProvider {
65
	public static final String           NAME                     = WMTSProvider.NAME;
66
	private WMTSClient                   ogcClient                = null;
67
//	private WMTSServerExplorerParameters parameters               = null;
68
	private static final Logger         logger                    = LoggerFactory.getLogger(WMTSServerExplorer.class);
69

  
70
	public WMTSServerExplorer(
71
			WMTSServerExplorerParameters parameters,
72
			DataServerExplorerProviderServices services)
73
			throws InitializeException {
74
                super(parameters, services);
75
//		this.parameters = parameters;
76
	}
77

  
78
	public String getDataStoreProviderName() {
79
		return WMTSProvider.NAME;
80
	}
81

  
82
	public String getDescription() {
83
		return WMTSProvider.DESCRIPTION;
84
	}
85

  
86
	public boolean add(String provider, NewDataStoreParameters parameters,
87
			boolean overwrite) throws DataException {
88
		return false;
89
	}
90

  
91
	public boolean canAdd() {
92
		return false;
93
	}
94

  
95
	public boolean canAdd(String storeName) throws DataException {
96
		return false;
97
	}
98

  
99
	public NewDataStoreParameters getAddParameters(String storeName)
100
			throws DataException {
101
		return null;
102
	}
103

  
104
	public List<?> getDataStoreProviderNames() {
105
		return null;
106
	}
107

  
108
	public WMTSServerExplorerParameters getParameters() {
109
		return (WMTSServerExplorerParameters) super.getParameters();
110
	}
111

  
112
	public List<?> list() throws DataException {
113
		return null;
114
	}
115

  
116
	public List<?> list(int mode) throws DataException {
117
		return null;
118
	}
119

  
120
	public void remove(DataStoreParameters parameters) throws DataException {
121

  
122
	}
123

  
124
	public String getProviderName() {
125
		return WMTSProvider.NAME;
126
	}
127

  
128
	//**********************************************
129
	//Connector
130
	//**********************************************
131

  
132
	public DataStoreParameters getStoredParameters() {
133
		DataManager manager = DALLocator.getDataManager();
134
		WMTSDataParameters wmtsParams = null;
135
		try {
136
			wmtsParams = (WMTSDataParameters) manager.createStoreParameters(this.getDataStoreProviderName());
137
			String host = getParameters().getHost();
138
            try {
139
                wmtsParams.setURI(new URI(host));
140
            } catch (URISyntaxException e) {
141
                logger.warn("Can't create URI from "+host, e);
142
            }
143
			wmtsParams.setOGCClient(getOGCClient());
144

  
145
			if(WMTSProvider.TILED) {
146
				TileDataParameters tileParams = (TileDataParameters) manager.createStoreParameters("Tile Store");
147
				tileParams.setDataParameters(wmtsParams);
148
				return tileParams;
149
			}
150
		} catch (InitializeException e) {
151
            logger.warn("Can't get DataStoreParameters from WMTSServerExplorer", e);
152
		} catch (ProviderNotRegisteredException e) {
153
            logger.warn("Can't get DataStoreParameters from WMTSServerExplorer", e);
154
		}
155
		return wmtsParams;
156
	}
157

  
158
	public void connect(ICancellable cancellable) throws ConnectException {
159
		URL url = null;
160
		boolean override = false;
161

  
162
		try {
163
			url = new URL(getParameters().getHost());
164
		} catch (Exception e) {
165
			throw new ConnectException("Malformed URL",e);
166
		}
167
        try {
168
        	ogcClient = WMTSOGCLocator.getManager().createWMTSClient(url.toString());
169
        	ogcClient.setForceChangeAxisOrder(getParameters().isLongitudeFirst());
170
        	if (!ogcClient.connect(override, cancellable))
171
        		throw new ConnectException("Error connecting");
172
        } catch (IOException e) {
173
			throw new ConnectException(e.getMessage(), e);
174
		}
175
	}
176

  
177
	public boolean isHostReachable(int timeout) {
178
		URL url = null;
179
		URLConnection con = null;
180
		try {
181
			url = new URL(getParameters().getHost());
182
			con = url.openConnection();
183
			if(con == null)
184
				return false;
185
			con.connect();
186
		} catch (MalformedURLException e) {
187
			return false;
188
		} catch (IOException e) {
189
			return false;
190
		}
191

  
192
		InputStream stream = null;
193
		try {
194
			stream = con.getInputStream();
195
			if(stream == null)
196
				return false;
197
		} catch (IOException e) {
198
		}
199

  
200
		return true;
201
	}
202

  
203
	/**
204
	 * Checks if the network and host are reachable
205
	 * @return true if both are reachable and false if they are not
206
	 */
207
	public boolean isHostReachable() {
208
		return isHostReachable(RasterDataServerExplorer.TIME);
209
	}
210

  
211
	public boolean isConnected() {
212
		if(ogcClient != null)
213
			return true;
214
		return false;
215
	}
216

  
217
	public WMTSClient getOGCClient() {
218
		return ogcClient;
219
	}
220

  
221
	public String getHost() {
222
		return getParameters().getHost();
223
	}
224

  
225
	public DataServerExplorerProviderServices getServerExplorerProviderServices() {
226
		return null;
227
	}
228
}
0 229

  
org.gvsig.raster.wmts/tags/org.gvsig.raster.wmts-2.2.57/org.gvsig.raster.wmts.io/src/main/java/org/gvsig/raster/wmts/io/WMTSProvider.java
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;
23

  
24
import java.awt.Image;
25
import java.awt.Rectangle;
26
import java.awt.geom.AffineTransform;
27
import java.awt.geom.NoninvertibleTransformException;
28
import java.awt.geom.Point2D;
29
import java.awt.geom.Rectangle2D;
30
import java.io.File;
31
import java.io.IOException;
32
import java.net.ConnectException;
33
import java.net.MalformedURLException;
34
import java.net.URI;
35
import java.net.URISyntaxException;
36
import java.net.URL;
37
import java.util.List;
38

  
39
import javax.swing.ImageIcon;
40

  
41
import org.gvsig.compat.net.ICancellable;
42
import org.gvsig.fmap.dal.DALLocator;
43
import org.gvsig.fmap.dal.DataStore;
44
import org.gvsig.fmap.dal.DataStoreParameters;
45
import org.gvsig.fmap.dal.coverage.RasterLocator;
46
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
47
import org.gvsig.fmap.dal.coverage.datastruct.BandList;
48
import org.gvsig.fmap.dal.coverage.datastruct.DatasetBand;
49
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
50
import org.gvsig.fmap.dal.coverage.datastruct.NoData;
51
import org.gvsig.fmap.dal.coverage.exception.BandAccessException;
52
import org.gvsig.fmap.dal.coverage.exception.BandNotFoundInListException;
53
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
54
import org.gvsig.fmap.dal.coverage.exception.InfoByPointException;
55
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
56
import org.gvsig.fmap.dal.coverage.exception.InvalidSourceException;
57
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
58
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
59
import org.gvsig.fmap.dal.coverage.exception.QueryException;
60
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
61
import org.gvsig.fmap.dal.coverage.exception.RemoteServiceException;
62
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
63
import org.gvsig.fmap.dal.coverage.store.RasterQuery;
64
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
65
import org.gvsig.fmap.dal.coverage.store.props.HistogramComputer;
66
import org.gvsig.fmap.dal.coverage.store.props.Transparency;
67
import org.gvsig.fmap.dal.coverage.util.MathUtils;
68
import org.gvsig.fmap.dal.exception.CloseException;
69
import org.gvsig.fmap.dal.exception.InitializeException;
70
import org.gvsig.fmap.dal.exception.OpenException;
71
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
72
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
73
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
74
import org.gvsig.metadata.MetadataLocator;
75
import org.gvsig.raster.cache.tile.TileCacheLocator;
76
import org.gvsig.raster.cache.tile.TileCacheManager;
77
import org.gvsig.raster.cache.tile.exception.TileGettingException;
78
import org.gvsig.raster.cache.tile.provider.CacheStruct;
79
import org.gvsig.raster.cache.tile.provider.TileListener;
80
import org.gvsig.raster.cache.tile.provider.TileServer;
81
import org.gvsig.raster.impl.buffer.SpiRasterQuery;
82
import org.gvsig.raster.impl.datastruct.BandListImpl;
83
import org.gvsig.raster.impl.datastruct.DatasetBandImpl;
84
import org.gvsig.raster.impl.datastruct.ExtentImpl;
85
import org.gvsig.raster.impl.provider.AbstractRasterProvider;
86
import org.gvsig.raster.impl.provider.MemoryTileMatrixBuffer;
87
import org.gvsig.raster.impl.provider.RasterProvider;
88
import org.gvsig.raster.impl.provider.RemoteRasterProvider;
89
import org.gvsig.raster.impl.provider.TiledRasterProvider;
90
import org.gvsig.raster.impl.store.DefaultRasterStore;
91
import org.gvsig.raster.impl.store.DefaultStoreFactory;
92
import org.gvsig.raster.impl.store.properties.DataStoreColorInterpretation;
93
import org.gvsig.raster.impl.store.properties.DataStoreTransparency;
94
import org.gvsig.raster.impl.store.properties.RemoteStoreHistogram;
95
import org.gvsig.raster.util.DefaultProviderServices;
96
import org.gvsig.raster.wmts.io.downloader.WMTSTileServer;
97
import org.gvsig.raster.wmts.ogc.WMTSClient;
98
import org.gvsig.raster.wmts.ogc.WMTSOGCLocator;
99
import org.gvsig.raster.wmts.ogc.WMTSStatus;
100
import org.gvsig.raster.wmts.ogc.exception.DownloadException;
101
import org.gvsig.raster.wmts.ogc.exception.ServerErrorException;
102
import org.gvsig.raster.wmts.ogc.exception.WMTSException;
103
import org.gvsig.raster.wmts.ogc.struct.WMTSLayer;
104
import org.gvsig.raster.wmts.ogc.struct.WMTSTile;
105
import org.gvsig.raster.wmts.ogc.struct.WMTSTileMatrix;
106
import org.gvsig.raster.wmts.ogc.struct.WMTSTileMatrixLimits;
107
import org.gvsig.raster.wmts.ogc.struct.WMTSTileMatrixSet;
108
import org.gvsig.raster.wmts.ogc.struct.WMTSTileMatrixSetLink;
109
import org.gvsig.tools.ToolsLocator;
110

  
111
import org.apache.commons.io.FilenameUtils;
112
import org.cresques.cts.IProjection;
113
import org.slf4j.Logger;
114
import org.slf4j.LoggerFactory;
115
/**
116
 * Provider for WMTS service
117
 *
118
 * @author Nacho Brodin (nachobrodin@gmail.com)
119
 */
120
public class WMTSProvider extends AbstractRasterProvider implements RemoteRasterProvider, TiledRasterProvider {
121
	public static String                NAME                     = "Wmts Store";
122
	public static String                DESCRIPTION              = "Wmts Raster file";
123
	public static final String          METADATA_DEFINITION_NAME = "WmtsStore";
124
	private static Logger               logger                   = LoggerFactory.getLogger(WMTSProvider.class);
125
	public static boolean               TILED                    = true;
126

  
127
	//Los tiles se piden de forma secuencial y sin lanzar threads para ello (+Lento)
128
	public static int                   SEQUENTIAL               = 0;
129
	//Los tiles se piden en threads y hay un thread manager para gestionar que no se pidan m?s de cierto n?mero
130
	public static int                   LIMITED_THREADS          = 1;
131
	//Los tiles se piden en threads y se lanzan tantos threads como tiles haya
132
	public static int                   UNLIMITED_THREADS        = 2;
133
	private int                         requestType              = LIMITED_THREADS;
134

  
135
	private static final double         MTS_X_GRADO              = 111319.490793274;
136

  
137
	private Extent                      viewRequest              = null;
138
	private WMTSClient                  ogcClient                = null;
139
	//private static Hashtable<URL, WMTSConnector>
140
	//                                    drivers                  = new Hashtable<URL, WMTSConnector> ();
141
	private boolean                     open                     = false;
142
	private File                        lastRequest              = null;
143
	private DataStoreTransparency       lastFileTransparency     = null;
144
	private int                         lastWidthRequest         = 0;
145
	private int                         lastHeightRequest        = 0;
146
	private WMTSStatus                  lastStatus               = null;
147
	private boolean                     gridSubsets              = true;
148
	private Extent[]                    extentByLevel            = null; //Only for layers without gridSubsets
149
	private Extent                      bbox                     = null;
150
	private MathUtils                   math                     = RasterLocator.getManager().getMathUtils();
151

  
152
	/**
153
	 * This thread manages the number of tiles that have been thrown.
154
	 * This number is controlled by the NTHREADS_QUEUE variable.
155
	 *
156
	 * @author Nacho Brodin (nachobrodin@gmail.com)
157
	 */
158
	public class RequestThreadManager extends Thread {
159
		private TilePipe               pipe           = null;
160
		private List<WMTSTile>         tiles          = null;
161
		private WMTSStatus             status         = null;
162

  
163
		public RequestThreadManager(TilePipe pipe, List<WMTSTile> tiles, WMTSStatus status) {
164
			this.pipe = pipe;
165
			this.tiles = tiles;
166
			this.status = status;
167
		}
168

  
169
		public void run() {
170
			for (int i = 0; i < tiles.size(); i++) {
171
				WMTSTile tile = tiles.get(i);
172
				WMTSStatus statusCopy = status.cloneStatus();
173
				statusCopy.setTileRow(tile.getRow());
174
				statusCopy.setTileCol(tile.getCol());
175
				if (pipe.getSize() > TilePipe.NTHREADS_QUEUE) {
176
					try {
177
						synchronized (this) {
178
							wait();
179
						}
180
					} catch( InterruptedException e ) {
181
					}
182
				}
183
				new RequestTileLauncher(pipe, statusCopy, tile).start();
184
			}
185
		}
186
	}
187

  
188
	/**
189
	 * Thread to download a tile
190
	 * @author Nacho Brodin (nachobrodin@gmail.com)
191
	 */
192
	class RequestTileLauncher extends Thread {
193
		private TilePipe      pipe    = null;
194
		private WMTSStatus    status  = null;
195
		private WMTSTile      tile    = null;
196

  
197
		public RequestTileLauncher(TilePipe pipe, WMTSStatus status, WMTSTile tile) {
198
			this.pipe = pipe;
199
			this.status = status;
200
			this.tile = tile;
201
		}
202

  
203
		public void run() {
204
			try {
205
				//File file = getConnector().getTile(status, null);
206
				URL url = getOGCClient().getTileURL(status);
207
				tile.setFile(getOGCClient().downloadFile(url, null));
208
				pipe.setTile(tile);
209
			} catch (DownloadException e) {
210
				logger.info("Error downloading files", e);
211
			} catch (MalformedURLException e) {
212
				logger.info("Malformed URL", e);
213
			} catch (WMTSException e) {
214
				logger.info("", e);
215
			}
216
		}
217
	}
218

  
219
	/**
220
	 * Point information
221
	 * @author Nacho Brodin (nachobrodin@gmail.com)
222
	 */
223
	public class PointInfo {
224
		public Point2D worldCoord;
225
		public Point2D tile;
226
		public Point2D pixelInTile;
227
		public int     level;
228

  
229
		public PointInfo(Point2D worldCoord) {
230
			this.worldCoord = worldCoord;
231
		}
232
	}
233

  
234
	public static void register() {
235
		DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
236
		if (dataman != null && !dataman.getStoreProviders().contains(NAME)) {
237
			dataman.registerStoreProvider(NAME,
238
					WMTSProvider.class, WMTSDataParametersImpl.class);
239
		}
240

  
241
		if (!dataman.getExplorerProviders().contains(WMTSServerExplorer.NAME)) {
242
			dataman.registerExplorerProvider(WMTSServerExplorer.NAME, WMTSServerExplorer.class, WMTSServerExplorerParameters.class);
243
		}
244
		dataman.registerStoreFactory(NAME, DefaultStoreFactory.class);
245
	}
246

  
247
	public WMTSProvider() throws NotSupportedExtensionException {
248
		super();
249
	}
250

  
251
	/**
252
	 * Constructor. Abre el dataset.
253
	 * @param proj Proyecci?n
254
	 * @param fName Nombre del fichero
255
	 * @throws NotSupportedExtensionException
256
	 * @throws OpenException
257
     * @deprecated use {@link #WMTSProvider(URI)}, this constructor will be removed in gvSIG 2.5
258
	 */
259
	public WMTSProvider(String params) throws NotSupportedExtensionException, OpenException {
260
		super(params);
261
        logger.info("Deprecated use of WMTSProvider constructor");
262
		if(params instanceof String) {
263
			WMTSDataParameters p = new WMTSDataParametersImpl();
264
            try {
265
                p.setURI(new URI((String) params));
266
            } catch (URISyntaxException e) {
267
                throw new OpenException("Can't create URI from" + (String) params, e);
268
            }
269
			super.init(p, null, ToolsLocator.getDynObjectManager()
270
					.createDynObject(
271
							MetadataLocator.getMetadataManager().getDefinition(
272
									DataStore.METADATA_DEFINITION_NAME)));
273
			init(p, null);
274
		}
275
	}
276

  
277
	 /**
278
     * Constructor. Abre el dataset.
279
     * @param uri URI del fichero
280
     * @throws NotSupportedExtensionException
281
     */
282
    public WMTSProvider(URI uri) throws NotSupportedExtensionException {
283
        super(uri);
284
        WMTSDataParameters p = new WMTSDataParametersImpl();
285
        p.setURI(uri);
286
        super.init(
287
            p,
288
            null,
289
            ToolsLocator.getDynObjectManager().createDynObject(
290
                MetadataLocator.getMetadataManager().getDefinition(DataStore.METADATA_DEFINITION_NAME)));
291
        init(p, null);
292
    }
293

  
294
    public WMTSProvider(WMTSDataParameters params,
295
			DataStoreProviderServices storeServices) throws NotSupportedExtensionException {
296
		super(params, storeServices, ToolsLocator.getDynObjectManager()
297
				.createDynObject(
298
						MetadataLocator.getMetadataManager().getDefinition(
299
								DataStore.METADATA_DEFINITION_NAME)));
300
		init(params, storeServices);
301
	}
302

  
303
	/**
304
	 * Gets the connector from the URL
305
	 * @return
306
	 * @throws RemoteServiceException
307
	 */
308
	public WMTSClient getOGCClient() throws WMTSException {
309
		if(ogcClient == null) {
310
			WMTSDataParameters p = (WMTSDataParameters)parameters;
311
			ogcClient = p.getOGCClient();
312
			if(ogcClient != null)
313
				return ogcClient;
314

  
315
			URL url = null;
316
			try {
317
				url = p.getURI().toURL();
318
			} catch (Exception e) {
319
				throw new WMTSException("Malformed URL",e);
320
			}
321
			try {
322
				ogcClient = WMTSOGCLocator.getManager().createWMTSClient(url.toString());
323
				ogcClient.connect(true, new ICancellable() {
324

  
325
					public boolean isCanceled() {
326
						return false;
327
					}
328

  
329
					public Object getID() {
330
						return null;
331
					}
332
				});
333
			} catch (ConnectException e) {
334
				throw new WMTSException("Connect exception",e);
335
			} catch (IOException e) {
336
				throw new WMTSException("Connect exception",e);
337
			}
338
		}
339
		return ogcClient;
340
	}
341

  
342
	/**
343
	 * Crea las referencias al fichero y carga
344
	 * las estructuras con la informaci?n y los metadatos.
345
	 * @param proj Proyecci?n
346
	 * @param param Parametros de carga
347
	 * @throws NotSupportedExtensionException
348
	 */
349
	public void init (DataStoreParameters params,
350
			DataStoreProviderServices storeServices) throws NotSupportedExtensionException {
351
		setParam(storeServices, params);
352
		if(((WMTSDataParameters)params).getImageFormat().compareTo("image/gif") == 0) {
353
			setDataType(new int[]{Buffer.TYPE_BYTE});
354
			bandCount = 1;
355
		} else {
356
			setDataType(new int[]{Buffer.TYPE_BYTE, Buffer.TYPE_BYTE, Buffer.TYPE_BYTE, Buffer.TYPE_BYTE});
357
			bandCount = 4;
358
		}
359

  
360
		if(!(param instanceof WMTSDataParameters))
361
			return;
362

  
363
		gridSubsets = hasGridSubsets((WMTSDataParameters)param);
364
		open = true;
365
	}
366

  
367
	/**
368
	 * Returns true if this layer has grid subsets
369
	 * @return
370
	 */
371
	public boolean hasGridSubsets() {
372
		return gridSubsets;
373
	}
374

  
375
	/**
376
	 * Checks if this layer has grid subsets or doesn't
377
	 * @param p
378
	 * @return
379
	 */
380
	private boolean hasGridSubsets(WMTSDataParameters p) {
381
		List<WMTSTileMatrixLimits> tileMatrixSetLimits = null;
382
		List<WMTSTileMatrixSetLink> tileMatrixSetLinkList = p.getLayer().getTileMatrixSetLink();
383
		String srs = p.getSRSCode();
384
		for (int i = 0; i < tileMatrixSetLinkList.size(); i++) {
385
			WMTSTileMatrixSetLink tileMatrixSetLink = (WMTSTileMatrixSetLink)tileMatrixSetLinkList.get(i);
386
			WMTSTileMatrixSet tms = tileMatrixSetLink.getTileMatrixSet();
387
			List<WMTSTileMatrixLimits> tmsl = tileMatrixSetLink.getTileMatrixLimits();
388
			String srsTileSet = tms.getSupportedCRS();
389
			if(areSrsEquals(srsTileSet, srs)) {
390
				tileMatrixSetLimits = tmsl;
391
			}
392
		}
393

  
394
		return (tileMatrixSetLimits == null || tileMatrixSetLimits.size() <= 0) ? false : true;
395
	}
396

  
397
	private boolean areSrsEquals(String sourceSrs, String appSrs) {
398
		if(sourceSrs.compareTo(appSrs) == 0)
399
			return true;
400
		if(sourceSrs.contains("CRS:84") || sourceSrs.contains("CRS84")) {
401
			if(appSrs.equals("EPSG:4326"))
402
				return true;
403
		}
404
		return false;
405
	}
406

  
407
	/*public static final WMTSConnector getConnectorFromURL(URL url) throws IOException {
408
		WMTSConnector drv = (WMTSConnector) drivers.get(url);
409
		if (drv == null) {
410
			drv = new WMTSConnector(url);
411
			drivers.put(url, drv);
412
		}
413
		return drv;
414
	}*/
415

  
416
	/**
417
	 * Obtiene el objeto que contiene que contiene la interpretaci?n de
418
	 * color por banda
419
	 * @return
420
	 */
421
	public ColorInterpretation getColorInterpretation() {
422
		if(super.getColorInterpretation() == null) {
423
			ColorInterpretation colorInterpretation = new DataStoreColorInterpretation(getBandCount());
424

  
425
			if(getBandCount() == 1)
426
				colorInterpretation = DataStoreColorInterpretation.createGrayInterpretation();
427

  
428
			if(getBandCount() == 3)
429
				colorInterpretation = DataStoreColorInterpretation.createRGBInterpretation();
430

  
431
			if(getBandCount() == 4)
432
				colorInterpretation = DataStoreColorInterpretation.createRGBAInterpretation();
433

  
434
			if(getBandCount() > 4 || getBandCount() == 2) {
435
				for (int i = 0; i < getBandCount(); i++) {
436
					colorInterpretation.setColorInterpValue(i, DataStoreColorInterpretation.UNDEF_BAND);
437
				}
438
			}
439
			setColorInterpretation(colorInterpretation);
440
		}
441
		return super.getColorInterpretation();
442
	}
443

  
444
	public boolean isTiled() {
445
		return true;
446
	}
447

  
448
	public AffineTransform getAffineTransform() {
449
		WMTSDataParameters p = (WMTSDataParameters)parameters;
450
		Extent e = getExtent();
451
		double psX = e.width() / (lastWidthRequest <= 0 ? p.getWidth() : lastWidthRequest);
452
		double psY = -(e.height() / (lastHeightRequest <= 0 ? p.getHeight() : lastHeightRequest));
453
		ownTransformation = new AffineTransform(
454
				psX,
455
				0,
456
				0,
457
				psY,
458
				e.getULX() - (psX / 2),
459
				e.getULY() - (psY / 2));
460
		externalTransformation = (AffineTransform) ownTransformation.clone();
461
		return ownTransformation;
462
	}
463

  
464
	/**
465
	 * <p>
466
	 * Gets the bounding box in world coordinates.
467
	 * If the layer has defined the BoundingBox tag, we will take this bounding box as entire
468
	 * extension of this layer, else we'll see if the tag WGS84BoundingBox is defined (it can be approximated).
469
	 * In this case we'll take WGS84BoundingBox as entire extension.
470
	 * </p>
471
	 * <br>
472
	 * Note:
473
	 * <br>
474
	 * <p>
475
	 * If the layer has grid subsets (TileMatrixLimits) then
476
	 * this will have a only extent but if the layer doesn't have grid subsets then this will have a different
477
	 * extent in each level resolution. In this case we need to know the extent for each level.
478
	 * </p>
479
	 * @return Extent
480
	 */
481
	public Extent getExtent() {
482
		WMTSDataParameters p = (WMTSDataParameters)parameters;
483
		WMTSLayer layer = p.getLayer();
484

  
485
		if(layer.getBBox() != null)
486
			return new ExtentImpl(layer.getBBox().toRectangle2D());
487

  
488
		if(layer.getWGS84BBox() != null) {
489
			String crsCode = p.getSRSCode();
490
			Rectangle2D r = layer.getWGS84BBoxTransformed(crsCode);
491
			if(r != null)
492
				return new ExtentImpl(r);
493
		}
494

  
495
		if(bbox == null)
496
			getExtentByResolutionLevel();
497
		return bbox;
498

  
499
		/*if(gridSubsets) {
500
			WMTSBoundingBox bbox = layer.getWGS84BBox();
501
			return new ExtentImpl(bbox.toRectangle2D());
502
		} else {
503
			if(bbox == null)
504
				getExtentByResolutionLevel();
505
			return bbox;
506
		}*/
507
	}
508

  
509
	/**
510
	 * Gets the suffix of the downloaded image
511
	 * @return
512
	 */
513
	public String getFileSuffix() {
514
		WMTSDataParameters p = (WMTSDataParameters)parameters;
515
		String format = p.getImageFormat();
516
		if (format == null){
517
			return "xml";
518
		}
519
		if (format.indexOf("png") >= 0){
520
	        return "png";
521
		}
522
	    if (format.indexOf("xml") >= 0){
523
	        return "xml";
524
	    }
525
	    if (format.indexOf("gif") >= 0){
526
	        return "gif";
527
	    }
528
	    if (format.indexOf("tif") >= 0){
529
	        return "tif";
530
	    }
531
	    if (format.indexOf("bmp") >= 0){
532
	        return "bmp";
533
	    }
534
	    if (format.indexOf("jpg") >= 0
535
	        || format.indexOf("jpeg") >= 0){
536
	        return "jpg";
537
	    }
538
		return "xml";
539
	}
540

  
541
	/**
542
	 * When a layer doesn't have grid subsets this will have a different bounding
543
	 * box by resolution level. This function calculates and returns the array of
544
	 * extents, one by resolution level.
545
	 * @return
546
	 */
547
	public Extent[] getExtentByResolutionLevel() {
548
		if(extentByLevel == null) {
549
			WMTSDataParameters p = (WMTSDataParameters)parameters;
550
			WMTSTileMatrixSetLink tileMatrixSetLink = getTileMatrixSetLink();
551
			WMTSTileMatrixSet tileMatrixSet = tileMatrixSetLink.getTileMatrixSet();
552

  
553
	    	double widthMtsTile = 0;
554
	    	double heightMtsTile = 0;
555
			List<WMTSTileMatrix> tileMatrixList = tileMatrixSet.getTileMatrix();
556
			extentByLevel = new ExtentImpl[tileMatrixList.size()];
557
			double minX = 0;
558
			double minY = 0;
559
			double maxX = 0;
560
			double maxY = 0;
561
			for (int i = 0; i < tileMatrixList.size(); i++) {
562
				WMTSTileMatrix tileMatrix = (WMTSTileMatrix)tileMatrixList.get(i);
563
		    	if(!p.isProjected()) {
564
		    		widthMtsTile = (tileMatrix.getScaleDenominator() * tileMatrix.getTileWidth() * 0.28) / (MTS_X_GRADO * 1000);
565
		    		heightMtsTile = (tileMatrix.getScaleDenominator() * tileMatrix.getTileHeight() * 0.28) / (MTS_X_GRADO * 1000);
566
		    	} else {
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff