Revision 3320

View differences:

org.gvsig.raster.wmts/tags/org.gvsig.raster.wmts-2.2.6/pom.xml
1
<?xml version="1.0" encoding="UTF-8"?>
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/xsd/maven-4.0.0.xsd">
3
    <modelVersion>4.0.0</modelVersion>
4
    <artifactId>org.gvsig.raster.wmts</artifactId>
5
    <packaging>pom</packaging>
6
    <version>2.2.6</version>
7
    <name>${project.artifactId}</name>
8
    <description>WMTS client</description>
9
    <inceptionYear>2011</inceptionYear>
10
	
11
    <parent>
12
        <groupId>org.gvsig</groupId>
13
        <artifactId>org.gvsig.desktop</artifactId>
14
        <version>2.0.90</version>
15
    </parent>
16

  
17
        <properties>
18
            <!-- El plugin versions:use-latest-versions falla con scope import -->
19
            <!-- asi que toca usar el versions:update-properties que si que funciona -->
20
            <org.gvsig.raster.version>2.2.11</org.gvsig.raster.version>
21
        </properties>
22
    
23
    <repositories>
24
        <repository>
25
            <id>gvsig-public-http-repository</id>
26
            <name>gvSIG maven public HTTP repository</name>
27
            <url>http://devel.gvsig.org/m2repo/j2se</url>
28
            <releases>
29
                <enabled>true</enabled>
30
                <updatePolicy>daily</updatePolicy>
31
                <checksumPolicy>warn</checksumPolicy>
32
            </releases>
33
            <snapshots>
34
                <enabled>true</enabled>
35
                <updatePolicy>daily</updatePolicy>
36
                <checksumPolicy>warn</checksumPolicy>
37
            </snapshots>
38
        </repository>
39
    </repositories>
40
    
41
    <scm>
42
        <connection>scm:svn:https://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.wmts/tags/org.gvsig.raster.wmts-2.2.6</connection>
43
        <developerConnection>scm:svn:https://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.wmts/tags/org.gvsig.raster.wmts-2.2.6</developerConnection>
44
        <url>https://devel.gvsig.org/redmine/projects/gvsig-raster/repository/show/org.gvsig.raster.wmts/tags/org.gvsig.raster.wmts-2.2.6</url>
45
    </scm>
46
    
47
    <dependencyManagement>
48
        <dependencies>
49
                        <dependency>
50
                                <groupId>org.gvsig</groupId>
51
                                <artifactId>org.gvsig.raster</artifactId>
52
                                <version>${org.gvsig.raster.version}</version>
53
                                <type>pom</type>
54
                                <scope>import</scope>
55
                        </dependency>
56

  
57
            <dependency>
58
                <groupId>org.gvsig</groupId>
59
                <artifactId>org.gvsig.raster.wmts.swing.api</artifactId>
60
                <version>2.2.6</version>
61
            </dependency>
62
            <dependency>
63
                <groupId>org.gvsig</groupId>
64
                <artifactId>org.gvsig.raster.wmts.swing.impl</artifactId>
65
                <version>2.2.6</version>
66
            </dependency>
67
            <dependency>
68
                <groupId>org.gvsig</groupId>
69
                <artifactId>org.gvsig.raster.wmts.ogc.api</artifactId>
70
                <version>2.2.6</version>
71
            </dependency>
72
            <dependency>
73
                <groupId>org.gvsig</groupId>
74
                <artifactId>org.gvsig.raster.wmts.ogc.impl</artifactId>
75
                <version>2.2.6</version>
76
            </dependency>
77
            <dependency>
78
                <groupId>org.gvsig</groupId>
79
                <artifactId>org.gvsig.raster.wmts.app.wmtsclient</artifactId>
80
                <version>2.2.6</version>
81
            </dependency>
82
            <dependency>
83
                <groupId>org.gvsig</groupId>
84
                <artifactId>org.gvsig.raster.wmts.io</artifactId>
85
                <version>2.2.6</version>
86
            </dependency>
87

  
88
        </dependencies>
89
    </dependencyManagement>
90
	
91
    <developers>
92
        <developer>
93
            <id>nbrodin</id>
94
            <name>Nacho Brodin</name>
95
            <email>nachobrodin@gmail.com</email>
96
            <roles>
97
                <role>Architect</role>
98
                <role>Developer</role>
99
            </roles>
100
        </developer>
101
    </developers>
102
	
103
    <build>
104
        <plugins>
105
            <plugin>
106
                <groupId>org.apache.maven.plugins</groupId>
107
                <artifactId>maven-release-plugin</artifactId>
108
                <configuration>
109
                    <tagBase>https://devel.gvsig.org/svn/gvsig-raster/org.gvsig.raster.wmts/tags/</tagBase>
110
                    <goals>deploy</goals>
111
                </configuration>
112
            </plugin>
113
        </plugins>
114
    </build>
115
    
116
    <modules>
117
        <module>org.gvsig.raster.wmts.swing</module>
118
        <module>org.gvsig.raster.wmts.io</module>
119
        <module>org.gvsig.raster.wmts.app.wmtsclient</module>
120
        <module>org.gvsig.raster.wmts.ogc</module>
121
    </modules>
122
</project>
0 123

  
org.gvsig.raster.wmts/tags/org.gvsig.raster.wmts-2.2.6/org.gvsig.raster.wmts.io/src/test/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.6/org.gvsig.raster.wmts.io/src/test/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.6/org.gvsig.raster.wmts.io/src/test/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.6/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.6/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.URL;
34
import java.net.URLConnection;
35
import java.util.List;
36

  
37
import org.gvsig.compat.net.ICancellable;
38
import org.gvsig.fmap.dal.DALLocator;
39
import org.gvsig.fmap.dal.DataManager;
40
import org.gvsig.fmap.dal.DataServerExplorerParameters;
41
import org.gvsig.fmap.dal.DataStoreParameters;
42
import org.gvsig.fmap.dal.NewDataStoreParameters;
43
import org.gvsig.fmap.dal.coverage.exception.ConnectException;
44
import org.gvsig.fmap.dal.coverage.store.RasterDataServerExplorer;
45
import org.gvsig.fmap.dal.coverage.store.parameter.TileDataParameters;
46
import org.gvsig.fmap.dal.exception.DataException;
47
import org.gvsig.fmap.dal.exception.InitializeException;
48
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
49
import org.gvsig.fmap.dal.spi.DataServerExplorerProvider;
50
import org.gvsig.fmap.dal.spi.DataServerExplorerProviderServices;
51
import org.gvsig.raster.wmts.ogc.WMTSClient;
52
import org.gvsig.raster.wmts.ogc.WMTSOGCLocator;
53

  
54
/**
55
 * Explorer for a WMTS server
56
 * @author Nacho Brodin (nachobrodin@gmail.com)
57
 */
58
public class WMTSServerExplorer implements RasterDataServerExplorer, DataServerExplorerProvider {
59
	public static final String           NAME                     = WMTSProvider.NAME;
60
	private WMTSClient                   ogcClient                = null;
61
	private WMTSServerExplorerParameters parameters               = null;
62
	
63
	public WMTSServerExplorer(
64
			WMTSServerExplorerParameters parameters,
65
			DataServerExplorerProviderServices services)
66
			throws InitializeException {
67
		this.parameters = parameters;
68
	}
69
	
70
	public String getDataStoreProviderName() {
71
		return WMTSProvider.NAME;
72
	}
73
	
74
	public String getDescription() {
75
		return WMTSProvider.DESCRIPTION;
76
	}
77
	
78
	public boolean add(String provider, NewDataStoreParameters parameters,
79
			boolean overwrite) throws DataException {
80
		return false;
81
	}
82

  
83
	public boolean canAdd() {
84
		return false;
85
	}
86

  
87
	public boolean canAdd(String storeName) throws DataException {
88
		return false;
89
	}
90

  
91
	public NewDataStoreParameters getAddParameters(String storeName)
92
			throws DataException {
93
		return null;
94
	}
95

  
96
	public List<?> getDataStoreProviderNames() {
97
		return null;
98
	}
99

  
100
	public DataServerExplorerParameters getParameters() {
101
		return parameters;
102
	}
103

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

  
108
	public List<?> list(int mode) throws DataException {
109
		return null;
110
	}
111

  
112
	public void remove(DataStoreParameters parameters) throws DataException {
113
		
114
	}
115

  
116
	public void dispose() {
117
		
118
	}
119

  
120
	public String getProviderName() {
121
		return WMTSProvider.NAME;
122
	}
123

  
124
	//**********************************************
125
	//Connector
126
	//**********************************************
127
	
128
	public DataStoreParameters getStoredParameters() {
129
		DataManager manager = DALLocator.getDataManager();
130
		WMTSDataParameters wmtsParams = null;
131
		try {
132
			wmtsParams = (WMTSDataParameters) manager.createStoreParameters(this.getDataStoreProviderName());
133
			wmtsParams.setURI(parameters.getHost());
134
			wmtsParams.setOGCClient(getOGCClient());
135

  
136
			if(WMTSProvider.TILED) {
137
				TileDataParameters tileParams = (TileDataParameters) manager.createStoreParameters("Tile Store");
138
				tileParams.setDataParameters(wmtsParams);
139
				return tileParams;
140
			} 
141
		} catch (InitializeException e) {
142
			e.printStackTrace();
143
		} catch (ProviderNotRegisteredException e) {
144
			e.printStackTrace();
145
		}
146
		return wmtsParams;
147
	}
148
	
149
	public void connect(ICancellable cancellable) throws ConnectException {
150
		URL url = null;
151
		boolean override = false;
152
		
153
		try {
154
			url = new URL(parameters.getHost());
155
		} catch (Exception e) {
156
			throw new ConnectException("Malformed URL",e);
157
		}
158
        try {
159
        	ogcClient = WMTSOGCLocator.getManager().createWMTSClient(url.toString());
160
        	ogcClient.setForceChangeAxisOrder(parameters.isLongitudeFirst());
161
        	if (!ogcClient.connect(override, cancellable))
162
        		throw new ConnectException("Error connecting");
163
        } catch (IOException e) {
164
			throw new ConnectException(e.getMessage(), e);
165
		}
166
	}
167
	
168
	public boolean isHostReachable(int timeout) {
169
		URL url = null;
170
		URLConnection con = null;
171
		try {
172
			url = new URL(parameters.getHost());
173
			con = url.openConnection();
174
			if(con == null)
175
				return false;
176
			con.connect();
177
		} catch (MalformedURLException e) {
178
			return false;
179
		} catch (IOException e) {
180
			return false;
181
		}
182
		
183
		InputStream stream = null;
184
		try {
185
			stream = con.getInputStream();
186
			if(stream == null)
187
				return false;
188
		} catch (IOException e) {
189
		}
190
		
191
		return true;
192
	}
193

  
194
	/**
195
	 * Checks if the network and host are reachable
196
	 * @return true if both are reachable and false if they are not
197
	 */
198
	public boolean isHostReachable() {
199
		return isHostReachable(RasterDataServerExplorer.TIME);
200
	}
201

  
202
	public boolean isConnected() {
203
		if(ogcClient != null)
204
			return true;
205
		return false;
206
	}
207
	
208
	public WMTSClient getOGCClient() {
209
		return ogcClient;
210
	}
211

  
212
	public String getHost() {
213
		return parameters.getHost();
214
	}
215

  
216
	public DataServerExplorerProviderServices getServerExplorerProviderServices() {
217
		return null;
218
	}
219
}
0 220

  
org.gvsig.raster.wmts/tags/org.gvsig.raster.wmts-2.2.6/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.URL;
35
import java.util.List;
36

  
37
import javax.swing.ImageIcon;
38

  
39
import org.gvsig.compat.net.ICancellable;
40
import org.gvsig.fmap.dal.DALLocator;
41
import org.gvsig.fmap.dal.DataStore;
42
import org.gvsig.fmap.dal.DataStoreParameters;
43
import org.gvsig.fmap.dal.coverage.RasterLocator;
44
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
45
import org.gvsig.fmap.dal.coverage.datastruct.BandList;
46
import org.gvsig.fmap.dal.coverage.datastruct.DatasetBand;
47
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
48
import org.gvsig.fmap.dal.coverage.datastruct.NoData;
49
import org.gvsig.fmap.dal.coverage.exception.BandAccessException;
50
import org.gvsig.fmap.dal.coverage.exception.BandNotFoundInListException;
51
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
52
import org.gvsig.fmap.dal.coverage.exception.InfoByPointException;
53
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
54
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
55
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
56
import org.gvsig.fmap.dal.coverage.exception.QueryException;
57
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
58
import org.gvsig.fmap.dal.coverage.exception.RemoteServiceException;
59
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
60
import org.gvsig.fmap.dal.coverage.store.RasterQuery;
61
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
62
import org.gvsig.fmap.dal.coverage.store.props.HistogramComputer;
63
import org.gvsig.fmap.dal.coverage.store.props.Transparency;
64
import org.gvsig.fmap.dal.coverage.util.MathUtils;
65
import org.gvsig.fmap.dal.exception.CloseException;
66
import org.gvsig.fmap.dal.exception.InitializeException;
67
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
68
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
69
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
70
import org.gvsig.metadata.MetadataLocator;
71
import org.gvsig.raster.cache.tile.TileCacheLocator;
72
import org.gvsig.raster.cache.tile.TileCacheManager;
73
import org.gvsig.raster.cache.tile.exception.TileGettingException;
74
import org.gvsig.raster.cache.tile.provider.CacheStruct;
75
import org.gvsig.raster.cache.tile.provider.TileListener;
76
import org.gvsig.raster.cache.tile.provider.TileServer;
77
import org.gvsig.raster.impl.buffer.SpiRasterQuery;
78
import org.gvsig.raster.impl.datastruct.BandListImpl;
79
import org.gvsig.raster.impl.datastruct.DatasetBandImpl;
80
import org.gvsig.raster.impl.datastruct.ExtentImpl;
81
import org.gvsig.raster.impl.provider.AbstractRasterProvider;
82
import org.gvsig.raster.impl.provider.MemoryTileMatrixBuffer;
83
import org.gvsig.raster.impl.provider.RasterProvider;
84
import org.gvsig.raster.impl.provider.RemoteRasterProvider;
85
import org.gvsig.raster.impl.provider.TiledRasterProvider;
86
import org.gvsig.raster.impl.store.DefaultRasterStore;
87
import org.gvsig.raster.impl.store.DefaultStoreFactory;
88
import org.gvsig.raster.impl.store.properties.DataStoreColorInterpretation;
89
import org.gvsig.raster.impl.store.properties.DataStoreTransparency;
90
import org.gvsig.raster.impl.store.properties.RemoteStoreHistogram;
91
import org.gvsig.raster.util.DefaultProviderServices;
92
import org.gvsig.raster.wmts.io.downloader.WMTSTileServer;
93
import org.gvsig.raster.wmts.ogc.WMTSClient;
94
import org.gvsig.raster.wmts.ogc.WMTSOGCLocator;
95
import org.gvsig.raster.wmts.ogc.WMTSStatus;
96
import org.gvsig.raster.wmts.ogc.exception.DownloadException;
97
import org.gvsig.raster.wmts.ogc.exception.ServerErrorException;
98
import org.gvsig.raster.wmts.ogc.exception.WMTSException;
99
import org.gvsig.raster.wmts.ogc.struct.WMTSLayer;
100
import org.gvsig.raster.wmts.ogc.struct.WMTSTile;
101
import org.gvsig.raster.wmts.ogc.struct.WMTSTileMatrix;
102
import org.gvsig.raster.wmts.ogc.struct.WMTSTileMatrixLimits;
103
import org.gvsig.raster.wmts.ogc.struct.WMTSTileMatrixSet;
104
import org.gvsig.raster.wmts.ogc.struct.WMTSTileMatrixSetLink;
105
import org.gvsig.tools.ToolsLocator;
106
import org.slf4j.Logger;
107
import org.slf4j.LoggerFactory;
108
/**
109
 * Provider for WMTS service
110
 *
111
 * @author Nacho Brodin (nachobrodin@gmail.com)
112
 */
113
public class WMTSProvider extends AbstractRasterProvider implements RemoteRasterProvider, TiledRasterProvider {
114
	public static String                NAME                     = "Wmts Store";
115
	public static String                DESCRIPTION              = "Wmts Raster file";
116
	public static final String          METADATA_DEFINITION_NAME = "WmtsStore";
117
	private static Logger               logger                   = LoggerFactory.getLogger(WMTSProvider.class);
118
	public static boolean               TILED                    = true;
119
	
120
	//Los tiles se piden de forma secuencial y sin lanzar threads para ello (+Lento)
121
	public static int                   SEQUENTIAL               = 0;
122
	//Los tiles se piden en threads y hay un thread manager para gestionar que no se pidan m?s de cierto n?mero
123
	public static int                   LIMITED_THREADS          = 1;
124
	//Los tiles se piden en threads y se lanzan tantos threads como tiles haya
125
	public static int                   UNLIMITED_THREADS        = 2;
126
	private int                         requestType              = LIMITED_THREADS;
127
	
128
	private static final double         MTS_X_GRADO              = 111319.490793274;
129
	
130
	private Extent                      viewRequest              = null;
131
	private WMTSClient                  ogcClient                = null;
132
	//private static Hashtable<URL, WMTSConnector>    
133
	//                                    drivers                  = new Hashtable<URL, WMTSConnector> ();
134
	private boolean                     open                     = false;
135
	private File                        lastRequest              = null;
136
	private DataStoreTransparency       lastFileTransparency     = null;
137
	private int                         lastWidthRequest         = 0;
138
	private int                         lastHeightRequest        = 0;
139
	private WMTSStatus                  lastStatus               = null;
140
	private boolean                     gridSubsets              = true;
141
	private Extent[]                    extentByLevel            = null; //Only for layers without gridSubsets
142
	private Extent                      bbox                     = null;
143
	private MathUtils                   math                     = RasterLocator.getManager().getMathUtils();
144
	
145
	/**
146
	 * This thread manages the number of tiles that have been thrown.
147
	 * This number is controlled by the NTHREADS_QUEUE variable.
148
	 * 
149
	 * @author Nacho Brodin (nachobrodin@gmail.com)
150
	 */
151
	public class RequestThreadManager extends Thread {
152
		private TilePipe               pipe           = null;
153
		private List<WMTSTile>         tiles          = null;
154
		private WMTSStatus             status         = null;
155
		
156
		public RequestThreadManager(TilePipe pipe, List<WMTSTile> tiles, WMTSStatus status) {
157
			this.pipe = pipe;
158
			this.tiles = tiles;
159
			this.status = status;
160
		}
161
		
162
		public void run() {
163
			for (int i = 0; i < tiles.size(); i++) {
164
				WMTSTile tile = tiles.get(i);
165
				WMTSStatus statusCopy = status.cloneStatus();
166
				statusCopy.setTileRow(tile.getRow());
167
				statusCopy.setTileCol(tile.getCol());
168
				if (pipe.getSize() > TilePipe.NTHREADS_QUEUE) {
169
					try {
170
						synchronized (this) {
171
							wait();							
172
						}
173
					} catch( InterruptedException e ) {
174
					}
175
				}
176
				new RequestTileLauncher(pipe, statusCopy, tile).start();
177
			}
178
		}
179
	}
180
	
181
	/**
182
	 * Thread to download a tile
183
	 * @author Nacho Brodin (nachobrodin@gmail.com)
184
	 */
185
	class RequestTileLauncher extends Thread {
186
		private TilePipe      pipe    = null;
187
		private WMTSStatus    status  = null;
188
		private WMTSTile      tile    = null;
189

  
190
		public RequestTileLauncher(TilePipe pipe, WMTSStatus status, WMTSTile tile) {
191
			this.pipe = pipe;
192
			this.status = status;
193
			this.tile = tile;
194
		}
195

  
196
		public void run() {
197
			try {
198
				//File file = getConnector().getTile(status, null);
199
				URL url = getOGCClient().getTileURL(status);
200
				tile.setFile(getOGCClient().downloadFile(url, null));
201
				pipe.setTile(tile);
202
			} catch (DownloadException e) {
203
				logger.info("Error downloading files", e);
204
			} catch (MalformedURLException e) {
205
				logger.info("Malformed URL", e);
206
			} catch (WMTSException e) {
207
				logger.info("", e);
208
			}
209
		}
210
	}
211
	
212
	/**
213
	 * Point information 
214
	 * @author Nacho Brodin (nachobrodin@gmail.com)
215
	 */
216
	public class PointInfo {
217
		public Point2D worldCoord;
218
		public Point2D tile;
219
		public Point2D pixelInTile;
220
		public int     level;
221
		
222
		public PointInfo(Point2D worldCoord) {
223
			this.worldCoord = worldCoord;
224
		}
225
	}
226

  
227
	public static void register() {
228
		DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
229
		if (dataman != null && !dataman.getStoreProviders().contains(NAME)) {
230
			dataman.registerStoreProvider(NAME,
231
					WMTSProvider.class, WMTSDataParametersImpl.class);
232
		}
233

  
234
		if (!dataman.getExplorerProviders().contains(WMTSServerExplorer.NAME)) {
235
			dataman.registerExplorerProvider(WMTSServerExplorer.NAME, WMTSServerExplorer.class, WMTSServerExplorerParameters.class);
236
		}
237
		dataman.registerStoreFactory(NAME, DefaultStoreFactory.class);
238
	}
239
	
240
	public WMTSProvider() throws NotSupportedExtensionException {
241
		super();
242
	}
243
	
244
	/**
245
	 * Constructor. Abre el dataset.
246
	 * @param proj Proyecci?n
247
	 * @param fName Nombre del fichero
248
	 * @throws NotSupportedExtensionException
249
	 */
250
	public WMTSProvider(String params) throws NotSupportedExtensionException {
251
		super(params);
252
		if(params instanceof String) {
253
			WMTSDataParameters p = new WMTSDataParametersImpl();
254
			p.setURI((String)params);
255
			super.init(p, null, ToolsLocator.getDynObjectManager()
256
					.createDynObject(
257
							MetadataLocator.getMetadataManager().getDefinition(
258
									DataStore.METADATA_DEFINITION_NAME)));
259
			init(p, null);
260
		}
261
	}
262
	
263
	public WMTSProvider(WMTSDataParameters params,
264
			DataStoreProviderServices storeServices) throws NotSupportedExtensionException {
265
		super(params, storeServices, ToolsLocator.getDynObjectManager()
266
				.createDynObject(
267
						MetadataLocator.getMetadataManager().getDefinition(
268
								DataStore.METADATA_DEFINITION_NAME)));
269
		init(params, storeServices);
270
	}
271
	
272
	/**
273
	 * Gets the connector from the URL
274
	 * @return
275
	 * @throws RemoteServiceException
276
	 */
277
	public WMTSClient getOGCClient() throws WMTSException {
278
		if(ogcClient == null) {
279
			WMTSDataParameters p = (WMTSDataParameters)parameters;
280
			ogcClient = p.getOGCClient();
281
			if(ogcClient != null)
282
				return ogcClient;
283
			
284
			URL url = null;
285
			try {
286
				url = new URL(p.getURI());
287
			} catch (Exception e) {
288
				throw new WMTSException("Malformed URL",e);
289
			}
290
			try {
291
				ogcClient = WMTSOGCLocator.getManager().createWMTSClient(url.toString());
292
				ogcClient.connect(true, new ICancellable() {
293
					
294
					public boolean isCanceled() {
295
						return false;
296
					}
297
					
298
					public Object getID() {
299
						return null;
300
					}
301
				});
302
			} catch (ConnectException e) {
303
				throw new WMTSException("Connect exception",e);
304
			} catch (IOException e) {
305
				throw new WMTSException("Connect exception",e);
306
			}
307
		}
308
		return ogcClient;
309
	}
310

  
311
	/**
312
	 * Crea las referencias al fichero y carga
313
	 * las estructuras con la informaci?n y los metadatos.
314
	 * @param proj Proyecci?n
315
	 * @param param Parametros de carga
316
	 * @throws NotSupportedExtensionException
317
	 */
318
	public void init (DataStoreParameters params,
319
			DataStoreProviderServices storeServices) throws NotSupportedExtensionException {
320
		setParam(storeServices, params);
321
		if(((WMTSDataParameters)params).getImageFormat().compareTo("image/gif") == 0) {
322
			setDataType(new int[]{Buffer.TYPE_BYTE});
323
			bandCount = 1;
324
		} else {
325
			setDataType(new int[]{Buffer.TYPE_BYTE, Buffer.TYPE_BYTE, Buffer.TYPE_BYTE, Buffer.TYPE_BYTE});
326
			bandCount = 4;
327
		}
328
		
329
		if(!(param instanceof WMTSDataParameters))
330
			return;
331
		
332
		gridSubsets = hasGridSubsets((WMTSDataParameters)param);
333
		open = true;
334
	}
335
	
336
	/**
337
	 * Returns true if this layer has grid subsets
338
	 * @return
339
	 */
340
	public boolean hasGridSubsets() {
341
		return gridSubsets;
342
	}
343
	
344
	/**
345
	 * Checks if this layer has grid subsets or doesn't
346
	 * @param p
347
	 * @return
348
	 */
349
	private boolean hasGridSubsets(WMTSDataParameters p) {
350
		List<WMTSTileMatrixLimits> tileMatrixSetLimits = null;
351
		List<WMTSTileMatrixSetLink> tileMatrixSetLinkList = p.getLayer().getTileMatrixSetLink();
352
		String srs = p.getSRSCode();
353
		for (int i = 0; i < tileMatrixSetLinkList.size(); i++) {
354
			WMTSTileMatrixSetLink tileMatrixSetLink = (WMTSTileMatrixSetLink)tileMatrixSetLinkList.get(i);
355
			WMTSTileMatrixSet tms = tileMatrixSetLink.getTileMatrixSet();
356
			List<WMTSTileMatrixLimits> tmsl = tileMatrixSetLink.getTileMatrixLimits();
357
			String srsTileSet = tms.getSupportedCRS();
358
			if(areSrsEquals(srsTileSet, srs)) {
359
				tileMatrixSetLimits = tmsl;
360
			}
361
		}
362
		
363
		return (tileMatrixSetLimits == null || tileMatrixSetLimits.size() <= 0) ? false : true; 
364
	}
365
	
366
	private boolean areSrsEquals(String sourceSrs, String appSrs) {
367
		if(sourceSrs.compareTo(appSrs) == 0)
368
			return true;
369
		if(sourceSrs.contains("CRS:84") || sourceSrs.contains("CRS84")) { 
370
			if(appSrs.equals("EPSG:4326"))
371
				return true;
372
		}
373
		return false;
374
	}
375
	
376
	/*public static final WMTSConnector getConnectorFromURL(URL url) throws IOException {
377
		WMTSConnector drv = (WMTSConnector) drivers.get(url);
378
		if (drv == null) {
379
			drv = new WMTSConnector(url);
380
			drivers.put(url, drv);
381
		}
382
		return drv;
383
	}*/
384
	
385
	/**
386
	 * Obtiene el objeto que contiene que contiene la interpretaci?n de
387
	 * color por banda
388
	 * @return
389
	 */
390
	public ColorInterpretation getColorInterpretation() {
391
		if(super.getColorInterpretation() == null) {
392
			ColorInterpretation colorInterpretation = new DataStoreColorInterpretation(getBandCount());
393
			
394
			if(getBandCount() == 1) 
395
				colorInterpretation = DataStoreColorInterpretation.createGrayInterpretation();
396
			
397
			if(getBandCount() == 3) 
398
				colorInterpretation = DataStoreColorInterpretation.createRGBInterpretation();
399
			
400
			if(getBandCount() == 4)
401
				colorInterpretation = DataStoreColorInterpretation.createRGBAInterpretation();
402
			
403
			if(getBandCount() > 4 || getBandCount() == 2) {
404
				for (int i = 0; i < getBandCount(); i++) {
405
					colorInterpretation.setColorInterpValue(i, DataStoreColorInterpretation.UNDEF_BAND);
406
				}
407
			}
408
			setColorInterpretation(colorInterpretation);
409
		}
410
		return super.getColorInterpretation();
411
	}
412
	
413
	public boolean isTiled() {
414
		return true;
415
	}
416
	
417
	public AffineTransform getAffineTransform() {
418
		WMTSDataParameters p = (WMTSDataParameters)parameters;
419
		Extent e = getExtent();
420
		double psX = e.width() / (lastWidthRequest <= 0 ? p.getWidth() : lastWidthRequest);
421
		double psY = -(e.height() / (lastHeightRequest <= 0 ? p.getHeight() : lastHeightRequest));
422
		ownTransformation = new AffineTransform(
423
				psX, 
424
				0, 
425
				0, 
426
				psY, 
427
				e.getULX() - (psX / 2),
428
				e.getULY() - (psY / 2));
429
		externalTransformation = (AffineTransform) ownTransformation.clone();
430
		return ownTransformation;
431
	}
432
	
433
	/**
434
	 * <p>
435
	 * Gets the bounding box in world coordinates. 
436
	 * If the layer has defined the BoundingBox tag, we will take this bounding box as entire 
437
	 * extension of this layer, else we'll see if the tag WGS84BoundingBox is defined (it can be approximated).
438
	 * In this case we'll take WGS84BoundingBox as entire extension.
439
	 * </p>
440
	 * <br>
441
	 * Note: 
442
	 * <br>
443
	 * <p>
444
	 * If the layer has grid subsets (TileMatrixLimits) then
445
	 * this will have a only extent but if the layer doesn't have grid subsets then this will have a different
446
	 * extent in each level resolution. In this case we need to know the extent for each level.
447
	 * </p>
448
	 * @return Extent
449
	 */
450
	public Extent getExtent() {
451
		WMTSDataParameters p = (WMTSDataParameters)parameters;
452
		WMTSLayer layer = p.getLayer();
453

  
454
		if(layer.getBBox() != null)
455
			return new ExtentImpl(layer.getBBox().toRectangle2D());
456
		
457
		if(layer.getWGS84BBox() != null) {
458
			String crsCode = p.getSRSCode();
459
			Rectangle2D r = layer.getWGS84BBoxTransformed(crsCode);
460
			if(r != null)
461
				return new ExtentImpl(r);
462
		}
463
			
464
		if(bbox == null)
465
			getExtentByResolutionLevel();
466
		return bbox;
467
		
468
		/*if(gridSubsets) {
469
			WMTSBoundingBox bbox = layer.getWGS84BBox();
470
			return new ExtentImpl(bbox.toRectangle2D());
471
		} else {
472
			if(bbox == null)
473
				getExtentByResolutionLevel();
474
			return bbox;
475
		}*/
476
	}
477
	
478
	/**
479
	 * Gets the suffix of the downloaded image
480
	 * @return
481
	 */
482
	public String getFileSuffix() {
483
		WMTSDataParameters p = (WMTSDataParameters)parameters;
484
		String format = p.getImageFormat();
485
		if (format == null){
486
			return "xml";
487
		}
488
		if (format.indexOf("png") >= 0){
489
	        return "png";
490
		}	
491
	    if (format.indexOf("xml") >= 0){
492
	        return "xml";
493
	    }	
494
	    if (format.indexOf("gif") >= 0){
495
	        return "gif";
496
	    }
497
	    if (format.indexOf("tif") >= 0){
498
	        return "tif";
499
	    }
500
	    if (format.indexOf("bmp") >= 0){
501
	        return "bmp";
502
	    }
503
	    if (format.indexOf("jpg") >= 0
504
	        || format.indexOf("jpeg") >= 0){
505
	        return "jpg";			 
506
	    }
507
		return "xml";
508
	}
509

  
510
	/**
511
	 * When a layer doesn't have grid subsets this will have a different bounding
512
	 * box by resolution level. This function calculates and returns the array of
513
	 * extents, one by resolution level.
514
	 * @return
515
	 */
516
	public Extent[] getExtentByResolutionLevel() {
517
		if(extentByLevel == null) {
518
			WMTSDataParameters p = (WMTSDataParameters)parameters;
519
			WMTSTileMatrixSetLink tileMatrixSetLink = getTileMatrixSetLink();
520
			WMTSTileMatrixSet tileMatrixSet = tileMatrixSetLink.getTileMatrixSet();
521
			
522
	    	double widthMtsTile = 0;
523
	    	double heightMtsTile = 0;
524
			List<WMTSTileMatrix> tileMatrixList = tileMatrixSet.getTileMatrix();
525
			extentByLevel = new ExtentImpl[tileMatrixList.size()];
526
			double minX = 0;
527
			double minY = 0;
528
			double maxX = 0;
529
			double maxY = 0;
530
			for (int i = 0; i < tileMatrixList.size(); i++) {
531
				WMTSTileMatrix tileMatrix = (WMTSTileMatrix)tileMatrixList.get(i);
532
		    	if(!p.isProjected()) {
533
		    		widthMtsTile = (tileMatrix.getScaleDenominator() * tileMatrix.getTileWidth() * 0.28) / (MTS_X_GRADO * 1000);
534
		    		heightMtsTile = (tileMatrix.getScaleDenominator() * tileMatrix.getTileHeight() * 0.28) / (MTS_X_GRADO * 1000);
535
		    	} else {
536
		    		widthMtsTile = (tileMatrix.getScaleDenominator() * tileMatrix.getTileWidth() * 0.28) / 1000;
537
		    		heightMtsTile = (tileMatrix.getScaleDenominator() * tileMatrix.getTileHeight() * 0.28) / 1000;
538
		    	}
539
		    	
540
		    	//TODO: Revisar!!! Creo que el top left sale al rev?s en el de la nasa
541
		    	
542
		    	double h = Math.abs(tileMatrix.getTopLeftCorner()[1] - (tileMatrix.getTopLeftCorner()[1] - (tileMatrix.getMatrixHeight() * heightMtsTile)));
543
		    	Rectangle2D r = new Rectangle2D.Double(
544
		    			tileMatrix.getTopLeftCorner()[0], 
545
		    			tileMatrix.getTopLeftCorner()[1] - h,
546
		    			Math.abs(tileMatrix.getTopLeftCorner()[0] - (tileMatrix.getTopLeftCorner()[0] + (tileMatrix.getMatrixWidth() * widthMtsTile))),
547
		    			h);
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff