Revision 2003

View differences:

trunk/extensions/extWCS/src/com/iver/cit/gvsig/fmap/layers/FLyrWCS.java
40 40
 */
41 41
package com.iver.cit.gvsig.fmap.layers;
42 42

  
43
import java.awt.Dimension;
44 43
import java.awt.Graphics2D;
45
import java.awt.Image;
46
import java.awt.geom.Point2D;
47 44
import java.awt.geom.Rectangle2D;
48 45
import java.awt.image.BufferedImage;
49
import java.io.File;
50 46
import java.io.IOException;
51
import java.net.MalformedURLException;
52 47
import java.net.URL;
53 48

  
54 49
import javax.swing.JOptionPane;
55 50

  
56
import org.cresques.geo.ViewPortData;
57
import org.cresques.io.GdalFile;
58
import org.cresques.io.rasterOld.ComputeMinMaxFilter;
59
import org.cresques.io.rasterOld.GreyscaleRasterToImageFilter;
60
import org.cresques.io.rasterOld.LinearEnhancementFilter;
61
import org.cresques.io.rasterOld.RasterBuf;
62
import org.cresques.io.rasterOld.RasterStats;
63
import org.cresques.io.rasterOld.RasterToImageFilter;
64
import org.cresques.px.Extent;
65
import org.cresques.px.PxRaster;
66

  
67
import com.iver.andami.PluginServices;
68 51
import com.iver.cit.gvsig.fmap.DriverException;
69 52
import com.iver.cit.gvsig.fmap.ViewPort;
70 53
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
......
77 60
import com.iver.utiles.StringUtilities;
78 61
import com.iver.utiles.XMLEntity;
79 62

  
80
import es.gva.cit.jgdal.Gdal;
81
import es.gva.cit.jgdal.GdalBuffer;
82
import es.gva.cit.jgdal.GdalException;
83
import es.gva.cit.jgdal.GdalRasterBand;
84
import es.gva.cit.jgdal.GeoTransform;
85
import es.uji.lsi.wcs.client.ServerErrorResponseException;
86 63
import es.uji.lsi.wcs.client.ServerOutOfOrderException;
87 64

  
88 65
/**
......
91 68
 * @author jaume - jaume.dominguez@iver.es
92 69
 */
93 70
public class FLyrWCS extends FLyrDefault {
71
	private FMapWCSAdaptor wcs = null;
94 72

  
95
	private URL host = null;
96
	private FMapWCSDriver wcs = null;
97
	private String coverageName;
98
	private Rectangle2D fullExtent, bbox;
99
	private String SRS;
100
	private String format;
101
	private String time;
102
	private String parameter;
103
	private String coverageQuery;
104
	private String coverageInfoQuery;
105
	private String lastCoverageQuery = "";
106 73
	private String label;
107
	private static final double METROSXGRADO = 111120D;
108
	private WCSParamsPanel toc;
109
	private File fCoverage = null;
74
	private WCSParamsPanel toc = null;
75
	
110 76

  
111 77
	/**
112 78
	 * Devuelve el XMLEntity con la informaci?n necesaria para reproducir la
......
118 84
	public XMLEntity getXMLEntity() throws XMLException {
119 85
		XMLEntity xml = super.getXMLEntity();
120 86

  
121
		xml.putProperty("wcs.fullExtent", StringUtilities.rect2String(fullExtent));
122
		xml.putProperty("wcs.host", host.toExternalForm());
123
		xml.putProperty("wcs.layerQuery", coverageQuery);
124
		xml.putProperty("wcs.format", format);
125
		xml.putProperty("wcs.srs", SRS);
126
		xml.putProperty("wcs.time", time);
127
		xml.putProperty("wcs.parameter", parameter);
87
		xml.putProperty("wcs.host", getHost());
88
		xml.putProperty("wcs.fullExtent",
89
			StringUtilities.rect2String(wcs.getFullExtent()));
90
		xml.putProperty("wcs.layerQuery", wcs.getCoverageQuery());
91
		xml.putProperty("wcs.format", getFormat());
92
		xml.putProperty("wcs.srs", getSRS());
93
		xml.putProperty("wcs.time", getTime());
94
		xml.putProperty("wcs.parameter", getParameter());
128 95
		xml.putProperty("wcs.label", label);
129
		xml.putProperty("wcs.coverageName", coverageName);
96
		xml.putProperty("wcs.coverageName", getCoverageName());
130 97
		return xml;
131 98
	}
132 99

  
......
141 108
	 */
142 109
	public void setXMLEntity(XMLEntity xml) throws XMLException {
143 110
		super.setXMLEntity(xml);
144
		System.out.println(" Cargo la capa WCS.");
145
		fullExtent = StringUtilities.string2Rect(xml
146
				.getStringProperty("wcs.fullExtent"));
111
		System.out.println(" Cargo la capa WCS. ... o no ;-)");
112
		setHost(xml.getStringProperty("wcs.host"));
113
		setFullExtent(StringUtilities.string2Rect(
114
			xml.getStringProperty("wcs.fullExtent")));
147 115

  
148
		try {
149
			setHost(new URL(xml.getStringProperty("wcs.host")));
150
		} catch (MalformedURLException e) {
151
			throw new XMLException(e);
152
		}
153 116

  
154
		coverageQuery = xml.getStringProperty("wcs.layerQuery");
155
		format = xml.getStringProperty("wcs.format");
156
		SRS = xml.getStringProperty("wcs.srs");
157
		time = xml.getStringProperty("wcs.time");
158
		parameter = xml.getStringProperty("wcs.parameter");
117
		wcs.setCoverageQuery(xml.getStringProperty("wcs.layerQuery"));
118
		setFormat(xml.getStringProperty("wcs.format"));
119
		setSRS(xml.getStringProperty("wcs.srs"));
120
		setTime(xml.getStringProperty("wcs.time"));
121
		setParameter(xml.getStringProperty("wcs.parameter"));
159 122
		label = xml.getStringProperty("wcs.label");
160
		coverageName = xml.getStringProperty("wcs.coverageName");
123
		setCoverageName(xml.getStringProperty("wcs.coverageName"));
161 124
	}
162 125
	
163 126
	/**
......
166 129
	 * @return Rectangle2D
167 130
	 */
168 131
	public Rectangle2D getFullExtent() throws DriverException {
169
		return fullExtent;
132
		return wcs.getFullExtent();
170 133
	}
171 134

  
172 135
	/**
......
174 137
	 */
175 138
	public synchronized void draw(BufferedImage image, Graphics2D g,
176 139
			ViewPort viewPort, Cancellable cancel) throws DriverException {
177
		if (viewPort.getExtent().getMinX() > fullExtent.getMaxX())
178
			return;
179
		if (viewPort.getExtent().getMinY() > fullExtent.getMaxY())
180
			return;
181
		if (viewPort.getExtent().getMaxX() < fullExtent.getMinX())
182
			return;
183
		if (viewPort.getExtent().getMaxY() < fullExtent.getMinY())
184
			return;
185
		setBBox(viewPort.getAdjustedExtent());
186
		
187
		double x = bbox.getMinX();
188
		double y = bbox.getMinY();
189
		double w = bbox.getWidth();
190
		double h = bbox.getHeight();
191
		
192
		double scalex = viewPort.getAffineTransform().getScaleX()	/* g.getTransform().getScaleX()*/ ,
193
			scaley = viewPort.getAffineTransform().getScaleY()		/* g.getTransform().getScaleY() */;
194
		int wImg = (int) Math.abs(w*scalex)+1, hImg = (int) Math.abs(h*scaley)+1;
195
		if (wImg <= 0 || hImg <= 0) return;
196

  
197
		setCoverageQuery(bbox, new Dimension(wImg, hImg));
198

  
199
		try {
200
			if (lastCoverageQuery.compareTo(coverageQuery) != 0) {
201
				setWCSClientCoverageQuery(coverageQuery);
202
				fCoverage = wcs.getCoverage();
203
			}
204

  
205
			if (fCoverage != null) {
206
				//drawJaume(g, viewPort, fCoverage);
207
				drawLWS(g, viewPort, fCoverage);
208
			}
209
		} catch (ServerErrorResponseException e) {
210
			JOptionPane.showMessageDialog(null, e.getMessage(), "Error",
211
					JOptionPane.ERROR_MESSAGE);
212
			throw new DriverException(e);
213
		}
140
		wcs.draw(image, g, viewPort, cancel);
214 141
	}
215
	
216
	private void drawJaume(Graphics2D g, ViewPort viewPort, File fCoverage) {
217
		Image coverage = renderizeRaster(getRaster(fCoverage));
218 142
		
219
		Point2D p1 = new Point2D.Double(bbox.getMinX(), bbox.getMaxY());
220
		//Point2D p2 = new Point2D.Double(bbox.getMaxX(), bbox.getMinY());
221

  
222
		viewPort.getAffineTransform().transform(p1, p1);
223
		//viewPort.getAffineTransform().transform(p2, p2);
224

  
225
		g.drawImage(coverage, (int) p1.getX(), (int) p1.getY(), null);
226
		/*g.setColor(Color.RED);
227
		g.drawRect((int) p1.getX(), (int) p1.getY(),
228
				((int) (p2.getX() - p1.getX())), ((int) (p2.getY() - p1
229
						.getY())));*/
230
	}
231
	
232
	/**
233
	 * Pinta usando PxRaster
234
	 */
235

  
236
	private void drawLWS(Graphics2D g, ViewPort viewPort, File fCoverage) {
237
		Extent e = new Extent(bbox);
238
		GdalFile rasterFile = new GdalFile(viewPort.getProjection(), fCoverage.getAbsolutePath());
239
		PxRaster raster = new PxRaster(rasterFile, null, rasterFile.getExtent());
240
		// ? PxRaster raster = new PxRaster(rasterFile, null, e);
241
		raster.setTransparency(false);
242
		ViewPortData vpData = new ViewPortData(viewPort.getProjection(), e, viewPort.getImageSize() );
243
		vpData.setMat(viewPort.getAffineTransform());
244
		
245
		raster.draw(g, vpData);
246
	}
247
		
248
	/*
249
	 * (non-Javadoc)
250
	 * 
251
	 * @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D,
252
	 *      com.iver.cit.gvsig.fmap.ViewPort,
253
	 *      com.iver.cit.gvsig.fmap.operations.Cancellable)
254
	 */
255 143
	public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel)
256 144
			throws DriverException {
257 145
	}
258 146

  
259 147
	/**
260
	 * Recoge los par?metros de la capa y los pasa al cliente WCS. Despu?s de
261
	 * esto, ya se puede lanzar una Getcoverage
262
	 *  
263
	 */
264
	private void setWCSClientCoverageQuery(String query) {
265
		lastCoverageQuery = query;
266
		wcs.setGetCoverageParams(query);
267
	}
268

  
269
	/**
270
	 * Establece el host al que se conecta el cliente.
271
	 * 
272
	 * @param host
273
	 */
274
	public void setHost(URL host) {
275
		this.host = host;
276
		if (wcs == null)
277
			wcs = new FMapWCSDriver();
278
		wcs.setHost(host.toString());
279
	}
280

  
281
	/**
282
	 * Establece nombre de la cobertura.
283
	 * 
284
	 * @param name
285
	 */
286
	public void setCoverageName(String name) {
287
		coverageName = name;
288
	}
289

  
290
	/**
291 148
	 * Establece la etiqueta de la cobertura. La que se usar? en el TOC
292 149
	 * 
293 150
	 * @param lbl
......
297 154
	}
298 155

  
299 156
	public void setFullExtent(Rectangle2D rect) {
300
		fullExtent = rect;
157
		wcs.setFullExtent(rect);
301 158
	}
302 159

  
303 160
	/**
304
	 * Construye un objeto Image a partir de un RasterBuf
305
	 * 
306
	 * @param raster
307
	 * @return Image
308
	 */
309
	public Image renderizeRaster(RasterBuf raster) {
310
		RasterStats stats = new RasterStats(raster.getBandNr());
311
		int alpha = 255; // transparencia
312
		boolean debug = false;
313
		ComputeMinMaxFilter filter = new ComputeMinMaxFilter(raster, stats);
314

  
315
		LinearEnhancementFilter lEFilter = new LinearEnhancementFilter(raster,
316
				stats);
317
		Image image = null;
318
		if (raster.getBandNr() == 1)
319
			image = new GreyscaleRasterToImageFilter(raster, alpha).getImage();
320
		else
321
			image = new RasterToImageFilter(raster, alpha).getImage();
322

  
323
		if (debug)
324
			stats.pinta();
325
		return image;
326
	}
327

  
328
	/**
329
	 * Computa el r?ster del fichero geogr?fico
330
	 * 
331
	 * @param coverage
332
	 * @return RasterBuf
333
	 */
334
	private RasterBuf getRaster(File coverage) {
335
		RasterBuf raster = null;
336

  
337
		Gdal migdal = new Gdal();
338
		GeoTransform gt = null;
339
		int ancho = 0, alto = 0;
340
		GdalRasterBand mirasterband = null;
341
		int rastercount = 0;
342

  
343
		try {
344
			migdal.open(coverage.getAbsolutePath(), Gdal.GA_ReadOnly);
345
		} catch (Exception ge) {
346
			ge.printStackTrace();
347
		}
348

  
349
		try {
350
			gt = migdal.getGeoTransform();
351
			//	System.out.println("Origin =
352
			// ("+gt.adfgeotransform[0]+","+gt.adfgeotransform[3]+")");
353
			//	System.out.println("Pixel Size =
354
			// ("+gt.adfgeotransform[1]+","+gt.adfgeotransform[5]+")");
355
		} catch (GdalException e) {
356
			System.out
357
					.println("I can't obtain the array geoTransform for this image");
358
		}
359

  
360
		try {
361
			rastercount = migdal.getRasterCount();
362
			ancho = migdal.getRasterXSize();
363
			alto = migdal.getRasterYSize();
364
			int ngcp = migdal.getGCPCount();
365
			//System.out.println("NGCP="+ngcp);
366
		} catch (GdalException ge) {
367
			ge.printStackTrace();
368
			//...
369
		}
370

  
371
		try {
372
			int dataType = migdal.getRasterBand(1).getRasterDataType();
373
			GdalBuffer buf = null;
374

  
375
			/*
376
			 * Evita el problema de que haya m?s de 3 bandas en el fichero esto
377
			 * deberia hacerse asignando a las 3 bandas del raster una banda
378
			 * distinta del fichero (no necesariamente 1->0, 2->1 y 3->2
379
			 */
380

  
381
			if (rastercount > 3)
382
				rastercount = 3;
383
			if (dataType == Gdal.GDT_Byte) {
384
				raster = new RasterBuf(RasterBuf.TYPE_INT, ancho, alto,
385
						rastercount, null);
386
				for (int iBand = 0; iBand < rastercount; iBand++) {
387
					mirasterband = migdal.getRasterBand(iBand + 1);
388
					buf = mirasterband.readRaster(0, 0, ancho, alto, ancho,
389
							alto, dataType);
390
					for (int y = 0; y < alto; y++)
391
						for (int x = 0; x < ancho; x++)
392
							raster.setPixelInt(x, y, iBand, buf.buffByte[y
393
									* ancho + x] & 0xff);
394
				}
395
				migdal.close();
396
			} else if (dataType == Gdal.GDT_CInt16
397
					|| dataType == Gdal.GDT_UInt16
398
					|| dataType == Gdal.GDT_Int16) {
399
				raster = new RasterBuf(RasterBuf.TYPE_INT, ancho, alto,
400
						rastercount, null);
401
				for (int iBand = 0; iBand < rastercount; iBand++) {
402
					// System.out.println("Banda:"+iBand);
403
					mirasterband = migdal.getRasterBand(iBand + 1);
404
					buf = mirasterband.readRaster(0, 0, ancho, alto, ancho,
405
							alto, dataType);
406
					for (int y = 0; y < alto; y++)
407
						for (int x = 0; x < ancho; x++)
408
							raster.setPixelInt(x, y, iBand, buf.buffShort[y
409
									* ancho + x] & 0xffff);
410
				}
411
				migdal.close();
412
			}
413
		} catch (GdalException e1) {
414
			e1.printStackTrace();
415
		}
416
		return raster;
417
	}
418

  
419
	public void setBBox(Rectangle2D rect) {
420
		double x1 = rect.getMinX();
421
		double y1 = rect.getMinY();
422
		double x2 = rect.getMaxX();
423
		double y2 = rect.getMaxY();
424
		if (x1 < fullExtent.getMinX())
425
			x1 = fullExtent.getMinX();
426
		if (y1 < fullExtent.getMinY())
427
			y1 = fullExtent.getMinY();
428
		if (x2 > fullExtent.getMaxX())
429
			x2 = fullExtent.getMaxX();
430
		if (y2 > fullExtent.getMaxY())
431
			y2 = fullExtent.getMaxY();
432

  
433
		if (bbox == null)
434
			bbox = new Rectangle2D.Double();
435

  
436
		bbox.setRect(x1, y1, x2 - x1, y2 - y1);
437
	}
438

  
439
	public void setFormat(String format) {
440
		this.format = format;
441
	}
442

  
443
	public void setSRS(String srs) {
444
		this.SRS = srs;
445
	}
446

  
447
	public String getSRS() {
448
		return this.SRS;
449
	}
450

  
451
	public FMapWCSDriver getWCSClient() {
452
		return wcs;
453
	}
454

  
455
	/**
456
	 * Para establecer los valores iniciales que se incluiran en la consulta.
457
	 * 
458
	 * @param layersRectangle
459
	 * @param srs
460
	 * @param format
461
	 * @param parametro
462
	 * @param times
463
	 */
464
	public void setCoverageQuery(Rectangle2D bBox, Dimension sz) {
465
		String coverage = "COVERAGE=" + coverageName;
466
		String crs = "&CRS=" + SRS;
467
		String boundingBox = "&BBOX=" + bBox.getMinX() + "," + bBox.getMinY()
468
				+ "," + bBox.getMaxX() + "," + bBox.getMaxY();
469
		String time = this.time != null ? "&" + this.time : "";
470
		String param = parameter != null ? "&" + parameter : "";
471
		double res = bBox.getWidth() / sz.getWidth();
472
		// Calculo cutre para ver si son grados (o metros). Si da menos de 180
473
		// es que son grados y lo paso a metros. (LWS)
474
		if (bBox.getMaxX() < 181D)
475
			res *= METROSXGRADO;
476
		System.out.println(" resolucion = " + res);
477
		String resX = "&RESX=" + res;
478
		String resY = "&RESY=" + res;
479
		
480
		//		String width = "&WIDTH="+ (int) sz.getWidth();
481
		//		String height = "&HEIGHT="+ (int) sz.getHeight();
482
		
483
		String format = "&FORMAT=" + this.format;
484
		coverageQuery = coverage + crs + boundingBox + time + param + resX	+ resY + format;
485
	}
486

  
487
	/**
488
	 * @param times
489
	 */
490
	public void setTimes(String times) {
491
		this.time = times;
492
	}
493

  
494
	public void setParameter(String prm) {
495
		this.parameter = prm;
496
	}
497

  
498
	/**
499 161
	 * Recupera el nom de la capa mostrada al TOC. El text per al nom no ?s el
500 162
	 * nom de la covertura sin? el texte que apareix al camp de text del wizard,
501 163
	 * que es correspon amb la "label" que el servidor especifica per a la
......
522 184
		if (toc == null) {
523 185
			try {
524 186
				WCSWizardDataSource dataSource = new WCSDataSourceAdapter();
525
				WCSWizardData data = dataSource.detalles(host);
187
				WCSWizardData data = dataSource.detalles( new URL(getHost()) );
526 188

  
527 189
				toc = new WCSParamsPanel();
528 190
					
......
532 194
				
533 195
				toc.getLstCoverages().setListData(data.getCoverageNames());
534 196
				
535
				int index = toc.getCoverageIndex(coverageName);
197
				int index = toc.getCoverageIndex(wcs.getCoverageName());
536 198
				if (index != -1)
537 199
					toc.getLstCoverages().setSelectedIndex(index);
538 200
				
539 201
				toc.actualizaWizard();
540 202
				
541
				index = toc.getSRSIndex(SRS);
203
				index = toc.getSRSIndex(wcs.getSRS());
542 204
				if (index != -1)
543 205
					toc.getLstCRSs().setSelectedIndex(index);
544
				index = toc.getFormatIndex(format);
206
				index = toc.getFormatIndex(wcs.getFormat());
545 207
				if (index != -1)
546 208
					toc.getLstFormats().setSelectedIndex(index);
547
				if (time != null)
548
					toc.getLstSelectedTimes().setListData(time.split("=")[1].split(","));
209
				if (wcs.getTime() != null)
210
					toc.getLstSelectedTimes().setListData(wcs.getTime().split("=")[1].split(","));
549 211
				/* vale, i ara.. per al cas d'intervals continus? se m'ocorre
550 212
				 * fer un text field. Per? aix? ja vindr? si ha de vindre.
551 213
				 */
552
				if (parameter!= null){
553
					String[] s = parameter.split("=");
214
				if (wcs.getParameter()!= null){
215
					String[] s = wcs.getParameter().split("=");
554 216
					String pName = s[0];
555 217
					String[] pVals = s[1].split(",");
556 218
					index = toc.getParamIndex(pName);
557 219
					toc.getCmbParam().setSelectedIndex(index);
558
					toc.actualizaListaParametros(coverageName);
220
					toc.actualizaListaParametros(wcs.getCoverageName());
559 221
					int[] indexes = new int[pVals.length];
560 222
					for (int i = 0; i < pVals.length; i++) {
561 223
						indexes[i] = toc.getValueIndex(pVals[i]);
......
576 238
		}
577 239
		return toc;
578 240
	}
241
	public String getCoverageName() {
242
		return wcs.getCoverageName();
243
	}
244
	public String getFormat() {
245
		return wcs.getFormat();
246
	}
247
	public String getHost() {
248
		return wcs.getHost();
249
	}
250
	public String getParameter() {
251
		return wcs.getParameter();
252
	}
253
	public String getSRS() {
254
		return wcs.getSRS();
255
	}
256
	public String getTime() {
257
		return wcs.getTime();
258
	}
259
	public void setFormat(String format) {
260
		wcs.setFormat(format);
261
	}
262
	public void setHost(String host) {
263
		if (wcs == null) {
264
			wcs = new FMapWCSAdaptor();
265
			wcs.setDriver(new FMapWCSDriver());
266
		}
267
		wcs.setHost(host);
268
	}
269
	public void setParameter(String parameter) {
270
		wcs.setParameter(parameter);
271
	}
272
	public void setSRS(String srs) {
273
		wcs.setSRS(srs);
274
	}
275
	public void setTime(String time) {
276
		wcs.setTime(time);
277
	}
278
	public void setCoverageName(String coverageName) {
279
		wcs.setCoverageName(coverageName);
280
	}
281
	
579 282
}
trunk/extensions/extWCS/src/com/iver/cit/gvsig/fmap/layers/FMapWCSAdaptor.java
1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2005 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
package com.iver.cit.gvsig.fmap.layers;
42

  
43
import java.awt.Dimension;
44
import java.awt.Graphics2D;
45
import java.awt.Image;
46
import java.awt.geom.Point2D;
47
import java.awt.geom.Rectangle2D;
48
import java.awt.image.BufferedImage;
49
import java.io.File;
50

  
51
import javax.swing.JOptionPane;
52

  
53
import org.cresques.geo.ViewPortData;
54
import org.cresques.io.GdalFile;
55
import org.cresques.io.GeoRasterFile;
56
import org.cresques.io.rasterOld.ComputeMinMaxFilter;
57
import org.cresques.io.rasterOld.GreyscaleRasterToImageFilter;
58
import org.cresques.io.rasterOld.LinearEnhancementFilter;
59
import org.cresques.io.rasterOld.RasterBuf;
60
import org.cresques.io.rasterOld.RasterStats;
61
import org.cresques.io.rasterOld.RasterToImageFilter;
62
import org.cresques.px.Extent;
63
import org.cresques.px.PxRaster;
64

  
65
import com.hardcode.driverManager.Driver;
66
import com.iver.cit.gvsig.fmap.DriverException;
67
import com.iver.cit.gvsig.fmap.ViewPort;
68
import com.iver.cit.gvsig.fmap.drivers.WCSDriver;
69
import com.iver.cit.gvsig.fmap.drivers.wcs.FMapWCSDriver;
70
import com.iver.cit.gvsig.fmap.operations.Cancellable;
71

  
72
import es.gva.cit.jgdal.Gdal;
73
import es.gva.cit.jgdal.GdalBuffer;
74
import es.gva.cit.jgdal.GdalException;
75
import es.gva.cit.jgdal.GdalRasterBand;
76
import es.gva.cit.jgdal.GeoTransform;
77
import es.uji.lsi.wcs.client.ServerErrorResponseException;
78

  
79
/**
80
 * @author jaume - jaume.dominguez@iver.es
81
 *
82
 */
83
public class FMapWCSAdaptor {
84
	private boolean driverInitialized = false;
85
	private WCSDriver driver;
86
	private Rectangle2D fullExtent, bbox;
87
	
88
	private static final double METROSXGRADO = 111120D;
89
	private String coverageName;
90
	private String SRS;
91
	private String format;
92
	private String time;
93
	private String parameter;
94
	
95
	private String coverageQuery;
96
	private String lastCoverageQuery = "";
97
	private File fCoverage = null;
98
	
99
	/**
100
	 * Establece el driver sobre el que act?a el adaptador 
101
	 */
102
	public void setDriver(Driver d) {
103
		driver = (WCSDriver) d;
104
	}
105
	
106
	/**
107
	 * Obtiene una referencia al objeto que implementa la interfaz vectorial con
108
	 *  el fin de que las Strategy puedan optimizar en funci?n del driver.
109
	 */
110
	public Driver getDriver(){
111
		return driver;
112
	}
113
	
114
	/**
115
	 * @see com.iver.cit.gvsig.fmap.layers.LayerOperations#draw(java.awt.image.BufferedImage, java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort)
116
	 */
117
	public void draw(BufferedImage image, Graphics2D g,
118
			ViewPort viewPort, Cancellable cancel) throws DriverException {
119
		if (viewPort.getExtent().getMinX() > fullExtent.getMaxX())
120
			return;
121
		if (viewPort.getExtent().getMinY() > fullExtent.getMaxY())
122
			return;
123
		if (viewPort.getExtent().getMaxX() < fullExtent.getMinX())
124
			return;
125
		if (viewPort.getExtent().getMaxY() < fullExtent.getMinY())
126
			return;
127
		setBBox(viewPort.getAdjustedExtent());
128
		
129
		double x = bbox.getMinX();
130
		double y = bbox.getMinY();
131
		double w = bbox.getWidth();
132
		double h = bbox.getHeight();
133
		
134
		double scalex = viewPort.getAffineTransform().getScaleX()	/* g.getTransform().getScaleX()*/ ,
135
		scaley = viewPort.getAffineTransform().getScaleY()		/* g.getTransform().getScaleY() */;
136
		int wImg = (int) Math.abs(w*scalex)+1, hImg = (int) Math.abs(h*scaley)+1;
137
		if (wImg <= 0 || hImg <= 0) return;
138
		
139
		setCoverageQuery(bbox, new Dimension(wImg, hImg));
140
		
141
		try {
142
			if (lastCoverageQuery.compareTo(coverageQuery) != 0) {
143
				setWCSClientCoverageQuery(coverageQuery);
144
				fCoverage = driver.getCoverage();
145
			}
146
			
147
			if (fCoverage != null) {
148
				//drawJaume(g, viewPort, fCoverage);
149
				drawLWS(g, viewPort, fCoverage);
150
			}
151
		} catch (ServerErrorResponseException e) {
152
			JOptionPane.showMessageDialog(null, e.getMessage(), "Error",
153
					JOptionPane.ERROR_MESSAGE);
154
			//throw new DriverException(e);
155
		}
156
	}
157
		
158
	/**
159
	 * Pinta usando PxRaster
160
	 */	
161
	private void drawLWS(Graphics2D g, ViewPort viewPort, File fCoverage) {
162
		GeoRasterFile rasterFile = new GdalFile(viewPort.getProjection(), fCoverage.getAbsolutePath());
163
		Extent e = new Extent(bbox);
164
		PxRaster raster = new PxRaster(rasterFile, null, rasterFile.getExtent());
165
		// ? PxRaster raster = new PxRaster(rasterFile, null, e);
166
		raster.setTransparency(false);
167
		ViewPortData vpData = new ViewPortData(viewPort.getProjection(), e, viewPort.getImageSize() );
168
		vpData.setMat(viewPort.getAffineTransform());
169
		
170
		raster.draw(g, vpData);
171
	}
172
	
173
	public void setBBox(Rectangle2D rect) {
174
		double x1 = rect.getMinX();
175
		double y1 = rect.getMinY();
176
		double x2 = rect.getMaxX();
177
		double y2 = rect.getMaxY();
178
		if (x1 < fullExtent.getMinX())
179
			x1 = fullExtent.getMinX();
180
		if (y1 < fullExtent.getMinY())
181
			y1 = fullExtent.getMinY();
182
		if (x2 > fullExtent.getMaxX())
183
			x2 = fullExtent.getMaxX();
184
		if (y2 > fullExtent.getMaxY())
185
			y2 = fullExtent.getMaxY();
186
		
187
		if (bbox == null)
188
			bbox = new Rectangle2D.Double();
189
		
190
		bbox.setRect(x1, y1, x2 - x1, y2 - y1);
191
	}
192
	/**
193
	 * Para establecer los valores iniciales que se incluiran en la consulta.
194
	 * 
195
	 * @param layersRectangle
196
	 * @param srs
197
	 * @param format
198
	 * @param parametro
199
	 * @param times
200
	 */
201
	public void setCoverageQuery(Rectangle2D bBox, Dimension sz) {
202
		String coverage = "COVERAGE=" + coverageName;
203
		String crs = "&CRS=" + SRS;
204
		String boundingBox = "&BBOX=" + bBox.getMinX() + "," + bBox.getMinY()
205
		+ "," + bBox.getMaxX() + "," + bBox.getMaxY();
206
		String time = this.time != null ? "&" + this.time : "";
207
		String param = parameter != null ? "&" + parameter : "";
208
		double res = bBox.getWidth() / sz.getWidth();
209
		// Calculo cutre para ver si son grados (o metros). Si da menos de 180
210
		// es que son grados y lo paso a metros. (LWS)
211
		if (bBox.getMaxX() < 181D)
212
			res *= METROSXGRADO;
213
		System.out.println(" resolucion = " + res);
214
		String resX = "&RESX=" + res;
215
		String resY = "&RESY=" + res;
216
		
217
		//		String width = "&WIDTH="+ (int) sz.getWidth();
218
		//		String height = "&HEIGHT="+ (int) sz.getHeight();
219
		
220
		String format = "&FORMAT=" + this.format;
221
		coverageQuery = coverage + crs + boundingBox + time + param + resX	+ resY + format;
222
	}
223
	
224
	/**
225
	 * Recoge los par?metros de la capa y los pasa al cliente WCS. Despu?s de
226
	 * esto, ya se puede lanzar una Getcoverage
227
	 *  
228
	 */
229
	private void setWCSClientCoverageQuery(String query) {
230
		lastCoverageQuery = query;
231
		((FMapWCSDriver) driver).setGetCoverageParams(query);
232
	}
233
	
234
	public String getCoverageName() {
235
		return coverageName;
236
	}
237
	public void setCoverageName(String coverageName) {
238
		this.coverageName = coverageName;
239
	}
240
	public String getCoverageQuery() {
241
		return coverageQuery;
242
	}
243
	public void setCoverageQuery(String coverageQuery) {
244
		this.coverageQuery = coverageQuery;
245
	}
246
	public String getFormat() {
247
		return format;
248
	}
249
	public void setFormat(String format) {
250
		this.format = format;
251
	}
252
	public Rectangle2D getFullExtent() {
253
		return fullExtent;
254
	}
255
	public void setFullExtent(Rectangle2D fullExtent) {
256
		this.fullExtent = fullExtent;
257
	}
258
	public String getParameter() {
259
		return parameter;
260
	}
261
	public void setParameter(String parameter) {
262
		this.parameter = parameter;
263
	}
264
	public String getSRS() {
265
		return SRS;
266
	}
267
	public void setSRS(String srs) {
268
		SRS = srs;
269
	}
270
	public String getTime() {
271
		return time;
272
	}
273
	public void setTime(String time) {
274
		this.time = time;
275
	}
276
	
277
	public String getHost() {
278
		return ((FMapWCSDriver) driver).getHost();
279
	}
280
	
281
	public void setHost(String host) {
282
		((FMapWCSDriver) driver).setHost(host);
283
	}
284
	
285
	private void drawJaume(Graphics2D g, ViewPort viewPort, File fCoverage) {
286
		Image coverage = renderizeRaster(getRaster(fCoverage));
287
		
288
		Point2D p1 = new Point2D.Double(bbox.getMinX(), bbox.getMaxY());
289
		//Point2D p2 = new Point2D.Double(bbox.getMaxX(), bbox.getMinY());
290
		
291
		viewPort.getAffineTransform().transform(p1, p1);
292
		//viewPort.getAffineTransform().transform(p2, p2);
293
		
294
		g.drawImage(coverage, (int) p1.getX(), (int) p1.getY(), null);
295
		/*g.setColor(Color.RED);
296
		 g.drawRect((int) p1.getX(), (int) p1.getY(),
297
		 ((int) (p2.getX() - p1.getX())), ((int) (p2.getY() - p1
298
		 .getY())));*/
299
	}
300
	
301
	/**
302
	 * Computa el r?ster del fichero geogr?fico
303
	 * 
304
	 * @param coverage
305
	 * @return RasterBuf
306
	 */
307
	private RasterBuf getRaster(File coverage) {
308
		RasterBuf raster = null;
309
		
310
		Gdal migdal = new Gdal();
311
		GeoTransform gt = null;
312
		int ancho = 0, alto = 0;
313
		GdalRasterBand mirasterband = null;
314
		int rastercount = 0;
315
		
316
		try {
317
			migdal.open(coverage.getAbsolutePath(), Gdal.GA_ReadOnly);
318
		} catch (Exception ge) {
319
			ge.printStackTrace();
320
		}
321
		
322
		try {
323
			gt = migdal.getGeoTransform();
324
			//	System.out.println("Origin =
325
			// ("+gt.adfgeotransform[0]+","+gt.adfgeotransform[3]+")");
326
			//	System.out.println("Pixel Size =
327
			// ("+gt.adfgeotransform[1]+","+gt.adfgeotransform[5]+")");
328
		} catch (GdalException e) {
329
			System.out
330
			.println("I can't obtain the array geoTransform for this image");
331
		}
332
		
333
		try {
334
			rastercount = migdal.getRasterCount();
335
			ancho = migdal.getRasterXSize();
336
			alto = migdal.getRasterYSize();
337
			int ngcp = migdal.getGCPCount();
338
			//System.out.println("NGCP="+ngcp);
339
		} catch (GdalException ge) {
340
			ge.printStackTrace();
341
			//...
342
		}
343
		
344
		try {
345
			int dataType = migdal.getRasterBand(1).getRasterDataType();
346
			GdalBuffer buf = null;
347
			
348
			/*
349
			 * Evita el problema de que haya m?s de 3 bandas en el fichero esto
350
			 * deberia hacerse asignando a las 3 bandas del raster una banda
351
			 * distinta del fichero (no necesariamente 1->0, 2->1 y 3->2
352
			 */
353
			
354
			if (rastercount > 3)
355
				rastercount = 3;
356
			if (dataType == Gdal.GDT_Byte) {
357
				raster = new RasterBuf(RasterBuf.TYPE_INT, ancho, alto,
358
						rastercount, null);
359
				for (int iBand = 0; iBand < rastercount; iBand++) {
360
					mirasterband = migdal.getRasterBand(iBand + 1);
361
					buf = mirasterband.readRaster(0, 0, ancho, alto, ancho,
362
							alto, dataType);
363
					for (int y = 0; y < alto; y++)
364
						for (int x = 0; x < ancho; x++)
365
							raster.setPixelInt(x, y, iBand, buf.buffByte[y
366
																		 * ancho + x] & 0xff);
367
				}
368
				migdal.close();
369
			} else if (dataType == Gdal.GDT_CInt16
370
					|| dataType == Gdal.GDT_UInt16
371
					|| dataType == Gdal.GDT_Int16) {
372
				raster = new RasterBuf(RasterBuf.TYPE_INT, ancho, alto,
373
						rastercount, null);
374
				for (int iBand = 0; iBand < rastercount; iBand++) {
375
					// System.out.println("Banda:"+iBand);
376
					mirasterband = migdal.getRasterBand(iBand + 1);
377
					buf = mirasterband.readRaster(0, 0, ancho, alto, ancho,
378
							alto, dataType);
379
					for (int y = 0; y < alto; y++)
380
						for (int x = 0; x < ancho; x++)
381
							raster.setPixelInt(x, y, iBand, buf.buffShort[y
382
																		  * ancho + x] & 0xffff);
383
				}
384
				migdal.close();
385
			}
386
		} catch (GdalException e1) {
387
			e1.printStackTrace();
388
		}
389
		return raster;
390
	}
391
	
392
	/**
393
	 * Construye un objeto Image a partir de un RasterBuf
394
	 * 
395
	 * @param raster
396
	 * @return Image
397
	 */
398
	public Image renderizeRaster(RasterBuf raster) {
399
		RasterStats stats = new RasterStats(raster.getBandNr());
400
		int alpha = 255; // transparencia
401
		boolean debug = false;
402
		ComputeMinMaxFilter filter = new ComputeMinMaxFilter(raster, stats);
403
		
404
		LinearEnhancementFilter lEFilter = new LinearEnhancementFilter(raster,
405
				stats);
406
		Image image = null;
407
		if (raster.getBandNr() == 1)
408
			image = new GreyscaleRasterToImageFilter(raster, alpha).getImage();
409
		else
410
			image = new RasterToImageFilter(raster, alpha).getImage();
411
		
412
		if (debug)
413
			stats.pinta();
414
		return image;
415
	}	
416
}
0 417

  
trunk/extensions/extWCS/src/com/iver/cit/gvsig/fmap/drivers/wcs/FMapWCSDriver.java
64 64
	private WCSClient wcs = null;
65 65
	private String host = null;
66 66
	
67
	public String getName() { return "WCSDriver"; }
68
	
67 69
	/**
68 70
	 * Establece el servidor al que se quiere conectar
69 71
	 * 
......
75 77
		wcs = new WCSClient(host);
76 78
	}
77 79
	
80
	public String getHost() { return host; }
81
	
78 82
	/**
79 83
	 * Env?a la operaci?n GetCapabilities al servidor
80 84
	 * @throws ServerOutOfOrderException
......
106 110
	 * 
107 111
	 * @return String
108 112
	 */
109
	public String getName(){
113
	public String getServerName(){
110 114
		return wcs.getTheCapabilities().getServiceName();
111 115
	}
112 116
	
trunk/extensions/extWCS/src/com/iver/cit/gvsig/gui/wcs/WCSWizard.java
768 768
	public FLayer getLayer() {
769 769
		FLyrWCS layer = new FLyrWCS();
770 770
		
771
		layer.setHost(this.getHost());
771
		layer.setHost(this.getHost().toString());
772 772
		layer.setCoverageName(this.getNomCobertura());
773 773
		layer.setLabel(this.getEtiquetaCobertura());
774 774
		layer.setSRS(this.getSRS());
775 775
		layer.setFormat(this.getFormat());
776 776
		layer.setFullExtent(this.getLayersRectangle());
777
		layer.setTimes(this.getSelectedTimes());
777
		layer.setTime(this.getSelectedTimes());
778 778
		layer.setParameter(this.getParametro());
779 779
		layer.setToc(this.wcsParamsTabbedPane);
780 780
		layer.setName(layer.getLabel());
trunk/extensions/extWCS/src/com/iver/cit/gvsig/gui/dialog/WCSPropsDialog.java
96 96
			public void valueChanged(javax.swing.event.ListSelectionEvent e) {    
97 97
				wcsParamsTabbedPane.actualizaWizard();
98 98
				applied = false;
99
				getBtnApply().setEnabled(!applied);
99
				getBtnApply().setEnabled(!applied && wcsParamsTabbedPane.hayParametrosSuficientes());
100 100
			}
101 101
		});
102 102
		wcsParamsTabbedPane.getLstCRSs().addListSelectionListener(new javax.swing.event.ListSelectionListener() { 
103 103
			public void valueChanged(javax.swing.event.ListSelectionEvent e) {
104 104
				getBtnOk().setEnabled(wcsParamsTabbedPane.hayParametrosSuficientes());
105 105
				applied = false;
106
				getBtnApply().setEnabled(!applied);
106
				getBtnApply().setEnabled(!applied && wcsParamsTabbedPane.hayParametrosSuficientes());
107 107
			}
108 108
		});
109 109
		wcsParamsTabbedPane.getLstFormats().addListSelectionListener(new javax.swing.event.ListSelectionListener() { 
110 110
			public void valueChanged(javax.swing.event.ListSelectionEvent e) {
111 111
				getBtnOk().setEnabled(wcsParamsTabbedPane.hayParametrosSuficientes());
112 112
				applied = false;
113
				getBtnApply().setEnabled(!applied);
113
				getBtnApply().setEnabled(!applied && wcsParamsTabbedPane.hayParametrosSuficientes());
114 114
			}
115 115
		});
116 116
		wcsParamsTabbedPane.getLstSelectedTimes().addListSelectionListener(new javax.swing.event.ListSelectionListener() { 
117 117
			public void valueChanged(javax.swing.event.ListSelectionEvent e) {
118 118
				getBtnOk().setEnabled(wcsParamsTabbedPane.hayParametrosSuficientes());
119 119
				applied = false;
120
				getBtnApply().setEnabled(!applied);
120
				getBtnApply().setEnabled(!applied && wcsParamsTabbedPane.hayParametrosSuficientes());
121 121
			}
122 122
		});
123 123
		wcsParamsTabbedPane.getLstParamValues().addListSelectionListener(new javax.swing.event.ListSelectionListener() { 
124 124
			public void valueChanged(javax.swing.event.ListSelectionEvent e) {
125 125
				getBtnOk().setEnabled(wcsParamsTabbedPane.hayParametrosSuficientes());
126 126
				applied = false;
127
				getBtnApply().setEnabled(!applied);
127
				getBtnApply().setEnabled(!applied && wcsParamsTabbedPane.hayParametrosSuficientes());
128 128
			}
129 129
		});
130 130
		wcsParamsTabbedPane.getCmbParam().addItemListener(
......
133 133
						String s = (String) wcsParamsTabbedPane.getLstCoverages().getSelectedValue();
134 134
						wcsParamsTabbedPane.actualizaListaParametros(s);
135 135
						applied = false;
136
						getBtnApply().setEnabled(!applied);
136
						getBtnApply().setEnabled(!applied && wcsParamsTabbedPane.hayParametrosSuficientes());
137 137
					}
138 138
				});
139 139
		wcsParamsTabbedPane.getBtnAddTemps().addActionListener(
140 140
				new java.awt.event.ActionListener() {
141 141
					public void actionPerformed(java.awt.event.ActionEvent e) {
142 142
						applied = false;
143
						getBtnApply().setEnabled(!applied);
143
						getBtnApply().setEnabled(!applied && wcsParamsTabbedPane.hayParametrosSuficientes());
144 144
						wcsParamsTabbedPane.addTiempo();
145 145
					}
146 146
				});
......
148 148
				new java.awt.event.ActionListener() {
149 149
					public void actionPerformed(java.awt.event.ActionEvent e) {
150 150
						applied = false;
151
						getBtnApply().setEnabled(!applied);
151
						getBtnApply().setEnabled(!applied && wcsParamsTabbedPane.hayParametrosSuficientes());
152 152
						wcsParamsTabbedPane.delTiempo();
153 153
					}
154 154
				});
......
241 241
            	((FLyrWCS) fLayer).setSRS(wcsParamsTabbedPane.getSRS());
242 242
            	((FLyrWCS) fLayer).setFormat(wcsParamsTabbedPane.getFormat());
243 243
            	((FLyrWCS) fLayer).setFullExtent(wcsParamsTabbedPane.getLayersRectangle());
244
            	((FLyrWCS) fLayer).setTimes(wcsParamsTabbedPane.getTiempos());
244
            	((FLyrWCS) fLayer).setTime(wcsParamsTabbedPane.getTiempos());
245 245
            	((FLyrWCS) fLayer).setParameter(wcsParamsTabbedPane.getParametro());
246 246
            	if (!applied) {
247 247
            		com.iver.cit.gvsig.gui.View vista = (com.iver.cit.gvsig.gui.View) PluginServices.getMDIManager().getActiveView();
......
256 256
            	((FLyrWCS) fLayer).setSRS(wcsParamsTabbedPane.getSRS());
257 257
            	((FLyrWCS) fLayer).setFormat(wcsParamsTabbedPane.getFormat());
258 258
            	((FLyrWCS) fLayer).setFullExtent(wcsParamsTabbedPane.getLayersRectangle());
259
            	((FLyrWCS) fLayer).setTimes(wcsParamsTabbedPane.getTiempos());
259
            	((FLyrWCS) fLayer).setTime(wcsParamsTabbedPane.getTiempos());
260 260
            	((FLyrWCS) fLayer).setParameter(wcsParamsTabbedPane.getParametro());
261 261
            	com.iver.cit.gvsig.gui.View vista = (com.iver.cit.gvsig.gui.View) PluginServices.getMDIManager().getActiveView();
262 262
        		MapControl mapCtrl = vista.getMapControl();
trunk/extensions/extWCS/src/es/uji/lsi/wcs/client/ServerErrorResponseException.java
65 65
	 * @param texto parseado de la respuesta en  xml de error
66 66
	 */
67 67
	public ServerErrorResponseException(String s){
68
		message = PluginServices.getText(null, "respuesta_error_servidor");
69
		message += ":\n"+s;
68
		message = PluginServices.getText(null, "respuesta_error_servidor") + ":\n"+s;
70 69
	}
71 70
	
72 71
	public String getMessage(){

Also available in: Unified diff