Revision 15525

View differences:

org.gvsig.raster.wmts/tags/org.gvsig.raster.wmts-2.2.151/org.gvsig.raster.wmts.io/pom.xml
1
<?xml version="1.0" encoding="ISO-8859-1"?>
2
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3
	<modelVersion>4.0.0</modelVersion>
4
	<artifactId>org.gvsig.raster.wmts.io</artifactId>
5
	<packaging>jar</packaging>
6
	<name>org.gvsig.raster.wmts.io</name>
7
	
8
	<parent>
9
		<groupId>org.gvsig</groupId>
10
		<artifactId>org.gvsig.raster.wmts</artifactId>
11
		<version>2.2.151</version>
12
	</parent>
13
	
14
	<dependencies>
15
		<dependency>
16
			<groupId>org.gvsig</groupId>
17
			<artifactId>org.gvsig.raster.cache.lib.api</artifactId>
18
            <scope>compile</scope>
19
		</dependency>
20
		<dependency>
21
			<groupId>org.gvsig</groupId>
22
			<artifactId>org.gvsig.raster.lib.api</artifactId>
23
            <scope>compile</scope>
24
		</dependency>
25
        <dependency>
26
            <groupId>org.gvsig</groupId>
27
            <artifactId>org.gvsig.raster.lib.impl</artifactId>
28
            <scope>compile</scope>
29
        </dependency>
30
        <dependency>
31
            <groupId>org.gvsig</groupId>
32
            <artifactId>org.gvsig.metadata.lib.basic.api</artifactId>
33
            <scope>compile</scope>
34
        </dependency>
35
        <dependency>
36
            <groupId>org.gvsig</groupId>
37
            <artifactId>org.gvsig.raster.wmts.ogc.api</artifactId>
38
            <scope>compile</scope>
39
        </dependency>
40
        <dependency>
41
            <groupId>org.gvsig</groupId>
42
            <artifactId>org.gvsig.raster.wmts.ogc.impl</artifactId>
43
            <scope>runtime</scope>
44
        </dependency>
45
		<dependency>
46
            <groupId>org.gvsig</groupId>
47
            <artifactId>org.gvsig.tools.lib</artifactId>
48
            <scope>compile</scope>
49
        </dependency>
50
        
51
        
52
        <dependency>
53
            <groupId>org.gvsig</groupId>
54
            <artifactId>org.gvsig.fmap.dal.api</artifactId>
55
            <scope>compile</scope>
56
        </dependency>
57
        <dependency>
58
            <groupId>org.gvsig</groupId>
59
            <artifactId>org.gvsig.fmap.dal.impl</artifactId>
60
            <scope>compile</scope>
61
        </dependency>
62
        <dependency>
63
            <groupId>org.gvsig</groupId>
64
            <artifactId>org.gvsig.fmap.dal.file.lib</artifactId>
65
            <scope>compile</scope>
66
        </dependency>
67
        <dependency>
68
            <groupId>org.gvsig</groupId>
69
            <artifactId>org.gvsig.fmap.dal.spi</artifactId>
70
            <scope>compile</scope>
71
        </dependency>
72
        <dependency>
73
            <groupId>org.gvsig</groupId>
74
            <artifactId>org.gvsig.projection.api</artifactId>
75
            <scope>compile</scope>
76
        </dependency>
77
        <dependency>
78
            <groupId>org.gvsig</groupId>
79
            <artifactId>org.gvsig.projection.cresques.impl</artifactId>
80
            <scope>runtime</scope>
81
        </dependency>
82
        <dependency>
83
            <groupId>org.gvsig</groupId>
84
            <artifactId>org.gvsig.fmap.geometry.api</artifactId>
85
            <scope>compile</scope>
86
        </dependency>
87
    <!--
88
        <dependency>
89
            <groupId>org.gvsig</groupId>
90
            <artifactId>org.gvsig.fmap.geometry.generalpath</artifactId>
91
            <scope>runtime</scope>
92
        </dependency>
93
        <dependency>
94
            <groupId>org.gvsig</groupId>
95
            <artifactId>org.gvsig.fmap.geometry.operation</artifactId>
96
            <scope>runtime</scope>
97
        </dependency>
98
    -->
99
        <dependency>
100
            <groupId>org.gvsig</groupId>
101
            <artifactId>org.gvsig.compat.api</artifactId>
102
            <scope>compile</scope>
103
        </dependency>
104
        <dependency>
105
            <groupId>org.gvsig</groupId>
106
            <artifactId>org.gvsig.compat.se</artifactId>
107
            <scope>compile</scope>
108
        </dependency>
109
	</dependencies>
110
</project>
0 111

  
org.gvsig.raster.wmts/tags/org.gvsig.raster.wmts-2.2.151/org.gvsig.raster.wmts.io/resources/TemplateRasterProvider.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.fmap.dal.coverage.dataset.io.netcdf;
23

  
24
import java.awt.geom.AffineTransform;
25

  
26
import org.gvsig.fmap.dal.DALFileLocator;
27
import org.gvsig.fmap.dal.DALLocator;
28
import org.gvsig.fmap.dal.DataStore;
29
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
30
import org.gvsig.fmap.dal.coverage.dataset.io.tile.downloader.FileTileServer;
31
import org.gvsig.fmap.dal.coverage.datastruct.BandList;
32
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
33
import org.gvsig.fmap.dal.coverage.exception.BandAccessException;
34
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
35
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
36
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
37
import org.gvsig.fmap.dal.coverage.exception.ParsingException;
38
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
39
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
40
import org.gvsig.fmap.dal.coverage.store.RasterFileStoreParameters;
41
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
42
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
43
import org.gvsig.metadata.MetadataLocator;
44
import org.gvsig.raster.cache.tile.provider.TileListener;
45
import org.gvsig.raster.cache.tile.provider.TileServer;
46
import org.gvsig.raster.impl.datastruct.ExtentImpl;
47
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
48
import org.gvsig.raster.impl.provider.RasterProvider;
49
import org.gvsig.raster.impl.store.AbstractRasterDataParameters;
50
import org.gvsig.raster.impl.store.AbstractRasterDataStore;
51
import org.gvsig.raster.impl.store.DefaultStoreFactory;
52
import org.gvsig.raster.impl.store.properties.DataStoreColorInterpretation;
53
import org.gvsig.raster.impl.store.properties.DataStoreMetadata;
54
import org.gvsig.raster.impl.store.properties.DataStoreTransparency;
55
import org.gvsig.tools.ToolsLocator;
56
import org.gvsig.tools.extensionpoint.ExtensionPoint;
57
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
58
/**
59
 * Data provider for ...
60
 *
61
 * @author Nacho Brodin (nachobrodin@gmail.com)
62
 */
63
public class NetCDFProvider extends DefaultRasterProvider {
64
	public static String        NAME                     = "Template Store";
65
	public static String        DESCRIPTION              = "Template Raster file";
66
	public final String         METADATA_DEFINITION_NAME = "TemplateStore";
67
	
68
	private static String[]     formatList               = new String[]{"*"};
69

  
70
	private Extent              viewRequest              = null;
71
	private TileServer          tileServer               = null;
72
	private boolean             open                     = false;
73

  
74
	public static void register() {
75
		DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
76
		if (dataman != null && !dataman.getStoreProviders().contains(NAME)) {
77
			dataman.registerStoreProvider(NAME,
78
					NetCDFProvider.class, NetCDFDataParameters.class);
79
		}
80
		
81
		if(DALFileLocator.getFilesystemServerExplorerManager() != null)
82
			DALFileLocator.getFilesystemServerExplorerManager().registerProvider(
83
					NAME, DESCRIPTION,
84
					NetCDFFilesystemServerExplorer.class);
85
		
86
		dataman.registerStoreFactory(NAME, DefaultStoreFactory.class);
87
	}
88

  
89
	/**
90
	 * Returns true if the extension is supported and false if doesn't
91
	 * @param ext
92
	 * @return
93
	 */
94
	public static boolean isExtensionSupported(String ext) {
95
		for (int i = 0; i < formatList.length; i++) {
96
			if(formatList[i].compareTo(ext) == 0)
97
				return true;
98
		}
99
		return false;
100
	}
101
	
102
	/**
103
	 * Constructor. Abre el dataset.
104
	 * @param proj Proyecci?n
105
	 * @param fName Nombre del fichero
106
	 * @throws NotSupportedExtensionException
107
	 */
108
	public NetCDFProvider(String params) throws NotSupportedExtensionException {
109
		super(params);
110
		if(params instanceof String) {
111
			NetCDFDataParameters p = new NetCDFDataParameters();
112
			p.setURI((String)params);
113
			super.init(p, null, ToolsLocator.getDynObjectManager()
114
					.createDynObject(
115
							MetadataLocator.getMetadataManager().getDefinition(
116
									DataStore.METADATA_DEFINITION_NAME)));
117
			init(p, null);
118
		}
119
	}
120
	
121
	public NetCDFProvider (NetCDFDataParameters params,
122
			AbstractRasterDataStore storeServices) throws NotSupportedExtensionException {
123
		super(params, storeServices, ToolsLocator.getDynObjectManager()
124
				.createDynObject(
125
						MetadataLocator.getMetadataManager().getDefinition(
126
								DataStore.METADATA_DEFINITION_NAME)));
127
		init(params, storeServices);
128
	}
129

  
130
	/**
131
	 * Crea las referencias al fichero y carga
132
	 * las estructuras con la informaci?n y los metadatos.
133
	 * @param proj Proyecci?n
134
	 * @param param Parametros de carga
135
	 * @throws NotSupportedExtensionException
136
	 */
137
	public void init (AbstractRasterDataParameters params,
138
			DataStoreProviderServices storeServices) throws NotSupportedExtensionException {
139
		//TODO:
140
		
141
		if(((RasterFileStoreParameters)params).getFile().exists()) {
142
			setParam(params);
143
			colorTable = null;
144
			noData = 0;
145
			wktProjection = null;
146
			//CrsWkt crs = new CrsWkt(wktProjection);
147
			//IProjection proj = CRSFactory.getCRS("EPSG:23030");
148
			noDataEnabled = true;
149
			ownTransformation = null;
150
			externalTransformation = (AffineTransform)ownTransformation.clone();
151
			load();
152
		} else
153
			setParam(params);
154
		bandCount = 0;
155
		setDataType(null);
156
		super.init();
157

  
158
		try {
159
			loadFromRmf(getRmfBlocksManager());
160
		} catch (ParsingException e) {
161
			//No lee desde rmf
162
		}
163
	}
164
	
165
	/*
166
	 * (non-Javadoc)
167
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#load()
168
	 */
169
	public RasterProvider load() {
170
		return this;
171
	}
172
	
173
	/*
174
	 * (non-Javadoc)
175
	 * @see org.gvsig.raster.impl.provider.RasterProvider#isOpen()
176
	 */
177
	public boolean isOpen() {
178
		return open;
179
	}
180

  
181
	/*
182
	 * (non-Javadoc)
183
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#close()
184
	 */
185
	public void close() {
186
		//TODO:
187
	}
188

  
189
	/*
190
	 * (non-Javadoc)
191
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#translateFileName(java.lang.String)
192
	 */
193
	public String translateFileName(String fileName) {
194
		return fileName;
195
	}
196

  
197
	/**
198
	 * Asigna el extent de la vista actual. existe un fichero .rmf debemos hacer una transformaci?n
199
	 * de la vista asignada ya que la petici?n viene en coordenadas del fichero .rmf y la vista (v)
200
	 * ha de estar en coordenadas del fichero.
201
	 */
202
	public void setView(Extent e) {
203
		viewRequest = new ExtentImpl(e);
204
	}
205

  
206
	/*
207
	 * (non-Javadoc)
208
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getView()
209
	 */
210
	public Extent getView() {
211
		return viewRequest;
212
	}
213

  
214
	/*
215
	 * (non-Javadoc)
216
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWidth()
217
	 */
218
	public double getWidth() {
219
		//TODO:
220
		return 0;
221
	}
222

  
223
	/*
224
	 * (non-Javadoc)
225
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getHeight()
226
	 */
227
	public double getHeight() {
228
		//TODO:
229
		return 0;
230
	}
231

  
232
	/**
233
	 * Read a line from the file
234
	 * @param line
235
	 * @param band
236
	 * @return
237
	 * @throws InvalidSetViewException
238
	 * @throws FileNotOpenException
239
	 * @throws RasterDriverException
240
	 * @Deprecated This operation is deprecated because is not useful and in the future
241
	 * it will not be maintained. The abstract operation has dissapear
242
	 */
243
	public Object readCompleteLine(int line, int band)throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
244
		if(line > this.getHeight() || band > this.getBandCount())
245
			throw new InvalidSetViewException("Request out of grid");
246

  
247
		//TODO:
248
		return null;
249
	}
250

  
251
	/*
252
	 *  (non-Javadoc)
253
	 * @see org.gvsig.raster.dataset.RasterDataset#readBlock(int, int)
254
	 */
255
	public Object readBlock(int pos, int blockHeight)
256
		throws InvalidSetViewException, FileNotOpenException, RasterDriverException, ProcessInterruptedException {
257
		if(pos < 0)
258
			throw new InvalidSetViewException("Request out of grid");
259

  
260
		if((pos + blockHeight) > getHeight())
261
			blockHeight = Math.abs(((int)getHeight()) - pos);
262
		
263
		//TODO:
264
		return null;
265
	}
266

  
267
	/*
268
	 * (non-Javadoc)
269
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getData(int, int, int)
270
	 */
271
	public Object getData(int x, int y, int band)throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
272
		if(x < 0 || y < 0 || x >= getWidth() || y >= getHeight())
273
			throw new InvalidSetViewException("Request out of grid");
274
		
275
		//TODO
276
		return null;
277
	}
278

  
279
	/*
280
	 * (non-Javadoc)
281
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(double, double, double, double, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.raster.cache.tile.provider.TileListener)
282
	 */
283
	public void getWindow(Extent ex, int bufWidth, int bufHeight, 
284
			BandList bandList, TileListener listener) throws ProcessInterruptedException, RasterDriverException {
285
		//TODO
286
	}
287

  
288
	/*
289
	 * (non-Javadoc)
290
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(org.gvsig.fmap.dal.coverage.datastruct.Extent, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer)
291
	 */
292
	public Buffer getWindow(Extent ex, BandList bandList, Buffer rasterBuf) 
293
		throws ProcessInterruptedException, RasterDriverException {
294
		//TODO
295

  
296
		return rasterBuf;
297
	}
298

  
299
	/*
300
	 * (non-Javadoc)
301
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(double, double, double, double, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer, boolean)
302
	 */
303
	public Buffer getWindow(double ulx, double uly, double w, double h, 
304
			BandList bandList, Buffer rasterBuf, boolean adjustToExtent) throws ProcessInterruptedException, RasterDriverException {
305
		//TODO
306

  
307
		return rasterBuf;
308
	}
309

  
310
	/*
311
	 * (non-Javadoc)
312
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(double, double, double, double, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer, boolean)
313
	 */
314
	public Buffer getWindow(Extent extent, 
315
			int bufWidth, int bufHeight, BandList bandList, Buffer rasterBuf, boolean adjustToExtent) throws ProcessInterruptedException, RasterDriverException {
316
		//TODO
317
		
318
		return rasterBuf;
319
	}
320

  
321
	/*
322
	 * (non-Javadoc)
323
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(int, int, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer)
324
	 */
325
	public Buffer getWindow(int x, int y, int w, int h, 
326
			BandList bandList, Buffer rasterBuf) throws ProcessInterruptedException, RasterDriverException {
327
		//TODO
328
		
329
		return rasterBuf;
330
	}
331

  
332
	/*
333
	 * (non-Javadoc)
334
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(int, int, int, int, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer)
335
	 */
336
	public Buffer getWindow(int x, int y, int w, int h, 
337
			int bufWidth, int bufHeight, BandList bandList, Buffer rasterBuf) throws ProcessInterruptedException, RasterDriverException {
338
		//TODO
339
		
340
		return rasterBuf;
341
	}
342

  
343
	/*
344
	 * (non-Javadoc)
345
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getBlockSize()
346
	 */
347
	public int getBlockSize(){
348
		//TODO
349
		
350
		return 0;
351
	}
352

  
353
	/*
354
	 * (non-Javadoc)
355
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getMetadata()
356
	 */
357
	public DataStoreMetadata getMetadata() {
358
		//TODO
359
		
360
		return null;
361
	}
362

  
363
	/*
364
	 * (non-Javadoc)
365
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getColorInterpretation()
366
	 */
367
	public DataStoreColorInterpretation getColorInterpretation(){
368
		//TODO
369
		
370
		return null;
371
	}
372

  
373
	/*
374
	 * (non-Javadoc)
375
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setColorInterpretation(org.gvsig.raster.impl.store.properties.DataStoreColorInterpretation)
376
	 */
377
	public void setColorInterpretation(DataStoreColorInterpretation colorInterpretation){
378
		//TODO
379
	}
380

  
381
	/*
382
	 * (non-Javadoc)
383
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getTransparency()
384
	 */
385
	public DataStoreTransparency getTransparency() {
386
		//TODO
387
		
388
		return null;
389
	}
390

  
391
	/*
392
	 * (non-Javadoc)
393
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isGeoreferenced()
394
	 */
395
	public boolean isGeoreferenced() {
396
		//TODO
397
		
398
		return false;
399
	}
400

  
401
	/**
402
	 * Informa de si el driver ha supersampleado en el ?ltimo dibujado. Es el driver el que colocar?
403
	 * el valor de esta variable cada vez que dibuja.
404
	 * @return true si se ha supersampleado y false si no se ha hecho.
405
	 */
406
	public boolean isSupersampling() {
407
		//TODO
408
		
409
		return false;
410
	}
411

  
412
	/*
413
	 * (non-Javadoc)
414
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setAffineTransform(java.awt.geom.AffineTransform)
415
	 */
416
	public void setAffineTransform(AffineTransform t){
417
		super.setAffineTransform(t);
418
	}
419

  
420
	/*
421
	 * (non-Javadoc)
422
	 * @see org.gvsig.raster.impl.provider.RasterProvider#getOverviewCount(int)
423
	 */
424
	public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
425
		if(band >= getBandCount())
426
			throw new BandAccessException("Wrong band");
427
		//TODO
428
		
429
		return 0;
430
	}
431

  
432
	/*
433
	 * (non-Javadoc)
434
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewWidth(int, int)
435
	 */
436
	public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException {
437
		if (band >= getBandCount())
438
			throw new BandAccessException("Wrong band");
439
		//TODO
440
		
441
		return 0;
442
	}
443

  
444
	/*
445
	 * (non-Javadoc)
446
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewHeight(int, int)
447
	 */
448
	public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
449
		if (band >= getBandCount())
450
			throw new BandAccessException("Wrong band");
451
		//TODO
452
		
453
		return 0;
454
	}
455

  
456
	/*
457
	 * (non-Javadoc)
458
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#overviewsSupport()
459
	 */
460
	public boolean overviewsSupport() {
461
		return true;
462
	}
463

  
464
	/*
465
	 * (non-Javadoc)
466
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isReproyectable()
467
	 */
468
	public boolean isReproyectable() {
469
		return true;
470
	}
471

  
472
	/*
473
	 * (non-Javadoc)
474
	 * @see org.gvsig.fmap.dal.spi.DataStoreProvider#getName()
475
	 */
476
	public String getName() {
477
		return NAME;
478
	}
479
	
480
	/*
481
	 * (non-Javadoc)
482
	 * @see org.gvsig.raster.impl.provider.RasterProvider#setStatus(org.gvsig.raster.impl.provider.RasterProvider)
483
	 */
484
	public void setStatus(RasterProvider provider) {
485
		if(provider instanceof NetCDFProvider) {
486
			//Not implemented yet
487
		}
488
	}
489
	
490
	/*
491
	 * (non-Javadoc)
492
	 * @see org.gvsig.raster.impl.provider.RasterProvider#getTileServer()
493
	 */
494
	public TileServer getTileServer() {
495
		if(tileServer == null)
496
			tileServer = new FileTileServer(this);
497
		return tileServer;
498
	}
499
}
0 500

  
org.gvsig.raster.wmts/tags/org.gvsig.raster.wmts-2.2.151/org.gvsig.raster.wmts.io/resources/README.txt
1
Put into this folder the resources needed by your test classes.
2

  
3
This folder is added to the Tests classpath, so you can load any resources 
4
through the ClassLoader.
5

  
6
By default, in this folder you can find an example of log4j configuration,
7
prepared to log messages through the console, so logging works when you
8
run your tests classes.
0 9

  
org.gvsig.raster.wmts/tags/org.gvsig.raster.wmts-2.2.151/org.gvsig.raster.wmts.io/resources/log4j.xml
1
<?xml version="1.0" encoding="ISO-8859-1" ?>
2
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
3

  
4
<!-- 
5
Log4J configuration file for unit tests execution.
6
 -->
7
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
8

  
9
	<!-- Appender configuration to show logging messages through the console -->
10
	<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
11
		<layout class="org.apache.log4j.PatternLayout">
12
			<param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %-5p [%c{2}.%M()]\n  %m%n" />
13
		</layout>
14
	</appender>
15

  
16
	<!-- 
17
	Activate logging messages of DEBUG level of higher only for the
18
	org.gvsig.tools packages.
19
	You can put full classes names or packages instead, to configure
20
	logging for all the classes and subpackages of the package.
21
	-->
22
	<category name="org.gvsig.tools">
23
		<priority value="DEBUG" />
24
	</category>
25
	<category name="org.gvsig.raster">
26
		<priority value="DEBUG" />
27
	</category>
28

  
29
	<!-- 
30
	By default, show only logging messages of INFO level or higher, 
31
	through the previously configured CONSOLE appender. 
32
	-->
33
	<root>
34
		<priority value="INFO" />
35
		<appender-ref ref="CONSOLE" />
36
	</root>
37
</log4j:configuration>
0 38

  
org.gvsig.raster.wmts/tags/org.gvsig.raster.wmts-2.2.151/org.gvsig.raster.wmts.io/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.151/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.151/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 {
567
		    		widthMtsTile = (tileMatrix.getScaleDenominator() * tileMatrix.getTileWidth() * 0.28) / 1000;
568
		    		heightMtsTile = (tileMatrix.getScaleDenominator() * tileMatrix.getTileHeight() * 0.28) / 1000;
569
		    	}
570

  
571
		    	//TODO: Revisar!!! Creo que el top left sale al rev?s en el de la nasa
572

  
573
		    	double h = Math.abs(tileMatrix.getTopLeftCorner()[1] - (tileMatrix.getTopLeftCorner()[1] - (tileMatrix.getMatrixHeight() * heightMtsTile)));
574
		    	Rectangle2D r = new Rectangle2D.Double(
575
		    			tileMatrix.getTopLeftCorner()[0],
576
		    			tileMatrix.getTopLeftCorner()[1] - h,
577
		    			Math.abs(tileMatrix.getTopLeftCorner()[0] - (tileMatrix.getTopLeftCorner()[0] + (tileMatrix.getMatrixWidth() * widthMtsTile))),
578
		    			h);
579
		    	extentByLevel[i] = new ExtentImpl(r);
580
		    	if(i == 0) {
581
		    		minX = extentByLevel[i].getMin().getX();
582
		    		minY = extentByLevel[i].getMin().getY();
583
		    		maxX = extentByLevel[i].getMax().getX();
584
		    		maxY = extentByLevel[i].getMax().getY();
585
		    	} else {
586
		    		minX = Math.min(minX, extentByLevel[i].getMin().getX());
587
		    		minY = Math.min(minY, extentByLevel[i].getMin().getY());
588
		    		maxX = Math.max(maxX, extentByLevel[i].getMax().getX());
589
		    		maxY = Math.max(maxY, extentByLevel[i].getMax().getY());
590
		    	}
591
			}
592
			bbox = new ExtentImpl(minX, maxY, maxX, minY);
593
		}
594
		return extentByLevel;
595
	}
596

  
597
	public Rectangle2D getLayerExtent(String layerName, String srs) throws RemoteServiceException {
598
		return null;
599
	}
600

  
601
	public RasterProvider load() {
602
		return this;
603
	}
604

  
605
	public boolean isOpen() {
606
		return open;
607
	}
608

  
609
	public void close() {
610
		open = false;
611
	}
612

  
613
	public Transparency getTransparency() {
614
		if(lastFileTransparency == null) {
615
			lastFileTransparency = new DataStoreTransparency(getColorInterpretation());
616
			lastFileTransparency.setTransparencyBand(3);
617
		}
618
		return lastFileTransparency;
619
	}
620

  
621
	public NoData getNoDataValue() {
622
		NoData nodata = super.getNoDataValue();
623
		if(nodata != null)
624
			nodata.setNoDataTransparent(false);
625
		return noData;
626
	}
627

  
628
	public URI translateURI(URI uri) {
629
		return uri;
630
	}
631

  
632
	public void setView(Extent e) {
633
		viewRequest = e;
634
	}
635

  
636
	public Extent getView() {
637
		return viewRequest;
638
	}
639

  
640
	public double getWidth() {
641
		WMTSDataParameters p = (WMTSDataParameters)parameters;
642
		if (lastWidthRequest <= 0)
643
			return p.getWidth();
644
		return lastWidthRequest;
645
	}
646

  
647
	public double getHeight() {
648
		WMTSDataParameters p = (WMTSDataParameters)parameters;
649
		if (lastHeightRequest <= 0)
650
			return p.getHeight();
651
		return lastHeightRequest;
652
	}
653

  
654
	public Object readCompleteLine(int line, int band)
655
		throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
656
		return null;
657
	}
658

  
659
	/**
660
	 * When the remote layer has fixed size this method downloads the file and return its reference.
661
	 * File layer has in the long side FIXED_SIZE pixels and the bounding box is complete. This file could be
662
	 * useful to build an histogram or calculate statistics. This represents a sample of data.
663
	 * @return
664
	 * @throws RasterDriverException
665
	 */
666
	public File getFileLayer() throws RasterDriverException {
667
		return null;
668
	}
669

  
670
	/**
671
	 * Reads a complete block of data and returns an tridimensional array of the right type. This function is useful
672
	 * to read a file very fast without setting a view. In a WMTS service when the size is fixed then it will read the
673
	 * entire image but when the source hasn't pixel size it will read a sample of data. This set of data will have
674
	 * the size defined in FIXED_SIZE.
675
	 *
676
	 * @param pos Posici?n donde se empieza  a leer
677
	 * @param blockHeight Altura m?xima del bloque leido
678
	 * @return Object que es un array tridimendional del tipo de datos del raster. (Bandas X Filas X Columnas)
679
	 * @throws InvalidSetViewException
680
	 * @throws FileNotOpenException
681
	 * @throws RasterDriverException
682
	 */
683
	public Object readBlock(int pos, int blockHeight, double scale)
684
	throws InvalidSetViewException, FileNotOpenException, RasterDriverException, ProcessInterruptedException {
685
		return null;
686
	}
687

  
688
	public Object getData(int x, int y, int band)
689
		throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
690
		return null;
691
	}
692

  
693
	/**
694
	 * Assigns the list of bands RGB and read a window of data
695
	 * @param rasterBuf
696
	 * @param bandList
697
	 * @param lastFile
698
	 * @param ulx
699
	 * @param uly
700
	 * @param lrx
701
	 * @param lry
702
	 * @return
703
	 * @throws RasterDriverException
704
	 * @throws ProcessInterruptedException
705
	 */
706
	public Buffer getBuffer(Buffer rasterBuf, BandList bandList, File lastFile,
707
			double ulx, double uly, double lrx, double lry) throws RasterDriverException, ProcessInterruptedException {
708
		return null;
709
	}
710

  
711
	/**
712
	 * Gets the tile matrix from the selected level
713
	 * @param level
714
	 * @return
715
	 */
716
	private WMTSTileMatrix getTileMatrixByLevel(int level) {
717
		level = adjustLevel(level);
718

  
719
		WMTSTileMatrixSetLink tileMatrixSetLink = getTileMatrixSetLink();
720
		WMTSTileMatrixSet tileMatrixSet = tileMatrixSetLink.getTileMatrixSet();
721
		List<WMTSTileMatrixLimits> tileMatrixSetLimits = tileMatrixSetLink.getTileMatrixLimits();
722

  
723
		WMTSTileMatrixLimits tileMatrixLimits = null;
724
		WMTSTileMatrix tileMatrix = (WMTSTileMatrix)tileMatrixSet.getTileMatrix().get(level);
725
		if(hasGridSubsets()) {
726
			tileMatrixLimits = (WMTSTileMatrixLimits)tileMatrixSetLimits.get(level);
727
			tileMatrix = tileMatrixLimits.getTileMatrix();
728
		}
729
		return tileMatrix;
730
	}
731

  
732
	/**
733
	 * Returns the number of levels
734
	 * @return
735
	 */
736
	public int getZoomLevels() {
737
		WMTSTileMatrixSetLink tileMatrixSetLink = getTileMatrixSetLink();
738
		WMTSTileMatrixSet tileMatrixSet = tileMatrixSetLink.getTileMatrixSet();
739
		if(hasGridSubsets()) {
740
			List<WMTSTileMatrixLimits> tileMatrixSetLimits = tileMatrixSetLink.getTileMatrixLimits();
741
			return Math.min(tileMatrixSet.getTileMatrix().size(), tileMatrixSetLimits.size());
742
		}
743
		return tileMatrixSet.getTileMatrix().size();
744

  
745
	}
746

  
747
	public Extent getCoordsInTheNearestLevel(Extent extent, int w, int h) {
748
		double[] pixelSizes = getPixelSizeByLevel();
749
		double currentPixelSize = extent.width() / (double)w;
750

  
751
		int level = 0;
752
		for (int i = 0; i < (pixelSizes.length - 1); i++) {
753
			if(currentPixelSize < pixelSizes[i] && currentPixelSize >= pixelSizes[i + 1]) {
754
				level = i + 1;
755
				break;
756
			}
757
		}
758

  
759
		return getZoomLevelCoordinates(level, extent, w, h);
760
	}
761

  
762
	public Extent getCoordsInLevel(Point2D viewCenter, int level, int w, int h) {
763
		WMTSDataParameters p = (WMTSDataParameters)param;
764
		level = adjustLevel(level);
765
		WMTSTileMatrix tileMatrix = getTileMatrixByLevel(level);
766

  
767
		boolean proj = p.isProjected();
768

  
769
		double psX = tileMatrix.getWidthWCTile(proj) / tileMatrix.getTileWidth();
770
		double psY = tileMatrix.getHeightWCTile(proj) / tileMatrix.getTileHeight();
771

  
772
		double ulx = viewCenter.getX() - ((w / 2) * psX);
773
		double uly = viewCenter.getY() - ((h / 2) * psY);
774
		double lrx = ulx + (w * psX);
775
		double lry = uly + (h * psY);
776
		return new ExtentImpl(ulx, uly, lrx, lry);
777
	}
778

  
779
	/**
780
	 * Calculates the extent of a zoom level using other extent as a reference. The new extent is
781
	 * calculated with the same coordinate at the center.
782
	 * @param level
783
	 * @param extent
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff