Revision 1108

View differences:

org.gvsig.raster.ermapper/tags/buildNumber_47/distribution/distribution.xml
1
<assembly>
2
</assembly>
0 3

  
org.gvsig.raster.ermapper/tags/buildNumber_47/org.gvsig.raster.ermapper.io/src/main/java/org/gvsig/raster/ermapper/io/DefaultErmapperIOLibrary.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.ermapper.io;
23

  
24
import org.gvsig.fmap.dal.DALFileLibrary;
25
import org.gvsig.fmap.dal.DALLibrary;
26
import org.gvsig.raster.impl.store.AbstractNewRasterStoreParameters;
27
import org.gvsig.raster.impl.store.AbstractRasterFileDataParameters;
28
import org.gvsig.tools.ToolsLibrary;
29
import org.gvsig.tools.library.AbstractLibrary;
30
import org.gvsig.tools.library.Library;
31
import org.gvsig.tools.library.LibraryException;
32
/**
33
 *
34
 * @author Nacho Brodin (nachobrodin@gmail.com)
35
 */
36
public class DefaultErmapperIOLibrary extends AbstractLibrary {	
37

  
38
	@SuppressWarnings("deprecation")
39
	public DefaultErmapperIOLibrary() {
40
		super(DefaultErmapperIOLibrary.class,Library.TYPE.IMPL);
41
		require(ToolsLibrary.class);
42
		require(DALLibrary.class);
43
		require(DALFileLibrary.class);
44
	}
45
	
46
	@Override
47
	protected void doInitialize() throws LibraryException {
48
		//RasterLibrary.wakeUp();
49
	}
50

  
51
	@Override
52
	protected void doPostInitialize() throws LibraryException {
53
		AbstractRasterFileDataParameters.registerDynClass();
54
		AbstractNewRasterStoreParameters.registerDynClass();
55
		
56
		// Registro de los drivers de lectura
57
		ErmapperProvider.register();
58
		
59
		// Registro de los drivers de escritura
60
		ErmapperWriter.register();
61
		ErmapperDataParameters.registerPersistence();
62
	}
63
}
0 64

  
org.gvsig.raster.ermapper/tags/buildNumber_47/org.gvsig.raster.ermapper.io/src/main/java/org/gvsig/raster/ermapper/io/ErmapperProvider.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.ermapper.io;
23

  
24
import java.awt.geom.AffineTransform;
25
import java.awt.geom.NoninvertibleTransformException;
26
import java.awt.geom.Point2D;
27

  
28
import org.cresques.cts.ICoordTrans;
29
import org.gvsig.fmap.dal.DALFileLocator;
30
import org.gvsig.fmap.dal.DALLocator;
31
import org.gvsig.fmap.dal.DataStore;
32
import org.gvsig.fmap.dal.coverage.RasterLocator;
33
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
34
import org.gvsig.fmap.dal.coverage.datastruct.BandList;
35
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
36
import org.gvsig.fmap.dal.coverage.exception.BandAccessException;
37
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
38
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
39
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
40
import org.gvsig.fmap.dal.coverage.exception.ParsingException;
41
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
42
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
43
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
44
import org.gvsig.fmap.dal.coverage.store.parameter.RasterFileStoreParameters;
45
import org.gvsig.fmap.dal.coverage.store.props.Transparency;
46
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
47
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
48
import org.gvsig.metadata.MetadataLocator;
49
import org.gvsig.raster.cache.tile.provider.TileListener;
50
import org.gvsig.raster.cache.tile.provider.TileServer;
51
import org.gvsig.raster.impl.datastruct.ExtentImpl;
52
import org.gvsig.raster.impl.process.RasterTask;
53
import org.gvsig.raster.impl.process.RasterTaskQueue;
54
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
55
import org.gvsig.raster.impl.provider.RasterProvider;
56
import org.gvsig.raster.impl.provider.tile.FileTileServer;
57
import org.gvsig.raster.impl.store.AbstractRasterDataParameters;
58
import org.gvsig.raster.impl.store.DefaultStoreFactory;
59
import org.gvsig.raster.impl.store.properties.DataStoreColorInterpretation;
60
import org.gvsig.raster.impl.store.properties.DataStoreTransparency;
61
import org.gvsig.tools.ToolsLocator;
62
import org.gvsig.tools.task.Cancellable;
63
import org.gvsig.tools.task.TaskStatus;
64

  
65
import com.ermapper.ecw.JNCSException;
66
import com.ermapper.ecw.JNCSFile;
67
import com.ermapper.ecw.JNCSFileNotOpenException;
68
import com.ermapper.ecw.JNCSInvalidSetViewException;
69
import com.ermapper.ecw.JNCSProgressiveUpdate;
70
/**
71
 * Driver de Ecw
72
 *
73
 * @author Nacho Brodin (nachobrodin@gmail.com)
74
 */
75
public class ErmapperProvider extends DefaultRasterProvider implements JNCSProgressiveUpdate {
76
	public static String                  NAME                     = "Ermapper Store";
77
	public static String                  DESCRIPTION              = "Ermapper Raster file";
78
	public static final String            METADATA_DEFINITION_NAME = "ErmapperStore";
79
	private JNCSFile 				      file                     = null;
80
	protected Transparency  		      fileTransparency         = null;
81
	private Extent                        viewRequest              = null;
82
	private DataStoreColorInterpretation  colorInterpr             = null;
83
	private boolean                       open                     = false;
84
	protected static String[]             formatList               = null;
85
	
86
	public static void register() {
87
		RasterLocator.getManager().registerFileProvidersTiled(ErmapperProvider.class);
88
		registerFormats();
89
		
90
		DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
91
		if (dataman != null && !dataman.getStoreProviders().contains(NAME)) {
92
			dataman.registerStoreProvider(NAME,
93
					ErmapperProvider.class, 
94
					ErmapperDataParameters.class);
95
		}
96
		
97
		if(DALFileLocator.getFilesystemServerExplorerManager() != null)
98
			DALFileLocator.getFilesystemServerExplorerManager().registerProvider(
99
					NAME, 
100
					DESCRIPTION,
101
					ErmapperFilesystemServerExplorer.class);
102
		
103
	    dataman.registerStoreFactory(NAME, DefaultStoreFactory.class);
104
	}
105
	
106
	private static void registerFormats() {
107
		formatList      = new String[] {
108
				"ecw", 
109
				"jp2"};
110
		for (int i = 0; i < formatList.length; i++) 
111
			RasterLocator.getManager().addFormat(formatList[i], ErmapperProvider.class);
112
	}
113
	
114
	/*
115
	 * (non-Javadoc)
116
	 * @see org.gvsig.raster.impl.provider.RasterProvider#getFormatList()
117
	 */
118
	public String[] getFormatList() {
119
		return formatList;
120
	}
121
	
122
	/**
123
	 * Returns true if the extension is supported and false if doesn't
124
	 * @param ext
125
	 * @return
126
	 */
127
	public boolean isExtensionSupported(String ext) {
128
		if(ext.indexOf(".") != -1)
129
			ext = ext.substring(ext.lastIndexOf(".") + 1, ext.length());
130
		for (int i = 0; i < formatList.length; i++) {
131
			if(formatList[i].compareTo(ext) == 0)
132
				return true;
133
		}
134
		return false;
135
	}
136
	
137
	/**
138
	 * Mandatory constructor to instantiate an empty provider
139
	 */
140
	public ErmapperProvider() {
141
	}
142
	
143
	/**
144
	 * Constructor. Abre el dataset.
145
	 * @param proj Proyecci?n
146
	 * @param fName Nombre del fichero ecw
147
	 * @throws NotSupportedExtensionException
148
	 */
149
	public ErmapperProvider(String params) throws NotSupportedExtensionException {
150
		super(params);
151
		if(params instanceof String) {
152
			ErmapperDataParameters p = new ErmapperDataParameters();
153
			p.setURI((String)params);
154
			super.init(p, null, ToolsLocator.getDynObjectManager()
155
					.createDynObject(
156
							MetadataLocator.getMetadataManager().getDefinition(
157
									DataStore.METADATA_DEFINITION_NAME)));
158
			init(p, null);
159
		}
160
	}
161
	
162
	public ErmapperProvider(ErmapperDataParameters params,
163
			DataStoreProviderServices storeServices) throws NotSupportedExtensionException {
164
		super(params, storeServices, ToolsLocator.getDynObjectManager()
165
				.createDynObject(
166
						MetadataLocator.getMetadataManager().getDefinition(
167
								DataStore.METADATA_DEFINITION_NAME)));
168
		init(params, storeServices);
169
	}
170

  
171
	/**
172
	 * Abre el dataset.
173
	 * @param proj Proyecci?n
174
	 * @param fName Nombre del fichero ecw
175
	 * @throws NotSupportedExtensionException
176
	 */
177
	public void init (AbstractRasterDataParameters params,
178
			DataStoreProviderServices storeServices) throws NotSupportedExtensionException {
179
		setParam(storeServices, params);
180
		if (!((RasterFileStoreParameters)param).getFile().exists() && !((RasterDataParameters)param).getURI().startsWith("ecwp:"))
181
			throw new NotSupportedExtensionException("Extension not supported");
182

  
183
		try {
184
			file = new JNCSFile(((RasterDataParameters)param).getURI(), false);
185
		} catch (JNCSException e1) {
186
			throw new NotSupportedExtensionException("Error loading the ecw file", e1);
187
		}
188
		load();
189
		bandCount = file.numBands;
190

  
191
		int[] dt = new int[bandCount];
192
		for (int i = 0; i < bandCount; i++)
193
			dt[i] = Buffer.TYPE_BYTE;
194
		setDataType(dt);
195

  
196
		super.init();
197

  
198
		try {
199
			loadFromRmf(getRmfBlocksManager());
200
		} catch (ParsingException e) {
201
			//No lee desde rmf
202
		}
203
		open = true;
204
	}
205

  
206
	/*
207
	 * (non-Javadoc)
208
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#load()
209
	 */
210
	public RasterProvider load() {
211
		ownTransformation = new AffineTransform(file.cellIncrementX, 0, 0, file.cellIncrementY, file.originX, file.originY);
212
		externalTransformation = (AffineTransform) ownTransformation.clone();
213
		return this;
214
	}
215
	
216
	/*
217
	 * (non-Javadoc)
218
	 * @see org.gvsig.raster.impl.provider.RasterProvider#isOpen()
219
	 */
220
	public boolean isOpen() {
221
		return open;
222
	}
223

  
224
	/*
225
	 * (non-Javadoc)
226
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#close()
227
	 */
228
	public void close() {
229
		if(file != null) {
230
			open = false;
231
			//Cuando se abren varios datastores del mismo fichero y se cierra uno de ellos se cierra la aplicaci?n en el siguiente dibujado
232
			//Se deber?a buscar una soluci?n ya que en los PrepareLayer se abre y cierra para hacer comprobaciones.
233
			//file.close(false);
234
			file = null;
235
		}
236
	}
237

  
238
	/*
239
	 * (non-Javadoc)
240
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getTransparency()
241
	 */
242
	public Transparency getTransparency() {
243
		if(fileTransparency == null)
244
			fileTransparency = new DataStoreTransparency();
245
		return fileTransparency;
246
	}
247

  
248
	/*
249
	 * (non-Javadoc)
250
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWidth()
251
	 */
252
	public double getWidth() {
253
		return file.width;
254
	}
255

  
256
	/*
257
	 * (non-Javadoc)
258
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getHeight()
259
	 */
260
	public double getHeight() {
261
		return file.height;
262
	}
263

  
264
	/*
265
	 * (non-Javadoc)
266
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getView()
267
	 */
268
	public Extent getView() {
269
		return viewRequest;
270
	}
271

  
272
	/*
273
	 * (non-Javadoc)
274
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setView(org.gvsig.fmap.dal.coverage.datastruct.Extent)
275
	 */
276
	public void setView(Extent e) {
277
		viewRequest = new ExtentImpl(e);
278
	}
279
	
280
	/*
281
	 * (non-Javadoc)
282
	 * @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)
283
	 */
284
	public void getWindow(Extent ex, int bufWidth, int bufHeight, 
285
			BandList bandList, TileListener listener, Cancellable status)throws ProcessInterruptedException, RasterDriverException {
286
		 
287
	}
288

  
289
	/*
290
	 * (non-Javadoc)
291
	 * @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)
292
	 */
293
	public Buffer getWindow(Extent ex, BandList bandList, Buffer rasterBuf, TaskStatus status) 
294
		throws ProcessInterruptedException, RasterDriverException {
295
		Point2D p1 = new Point2D.Double(ex.getULX(), ex.getULY());
296
		Point2D p2 = new Point2D.Double(ex.getLRX(), ex.getLRY());
297
		try {
298
			externalTransformation.inverseTransform(p1, p1);
299
			externalTransformation.inverseTransform(p2, p2);
300
			ownTransformation.transform(p1, p1);
301
			ownTransformation.transform(p2, p2);
302
		} catch (NoninvertibleTransformException e) {
303
			throw new RasterDriverException("Noninvertible transform");
304
		}
305

  
306
		Extent selectedExtent = new ExtentImpl(p1.getX(), p1.getY(), p2.getX(), p2.getY());
307

  
308
		setView(selectedExtent);
309
		int wPx = rasterBuf.getWidth();
310
		int hPx = rasterBuf.getHeight();
311
		int[] stpBuffer = new int[]{0, 0 , wPx, hPx};
312

  
313
		loadBuffer(viewRequest, wPx, hPx, rasterBuf, bandList, stpBuffer);
314

  
315
		return rasterBuf;
316
	}
317

  
318
	/*
319
	 * (non-Javadoc)
320
	 * @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)
321
	 */
322
	public Buffer getWindow(double ulx, double uly, double w, double h, 
323
			BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
324
		//El incremento o decremento de las X e Y depende de los signos de rotaci?n y escala en la matriz de transformaci?n. Por esto
325
		//tenemos que averiguar si lrx es x + w o x -w, asi como si lry es y + h o y - h
326
		Extent ext = getExtent();
327
		Point2D pInit = rasterToWorld(new Point2D.Double(0, 0));
328
		Point2D pEnd = rasterToWorld(new Point2D.Double(getWidth(), getHeight()));
329
		double wRaster = Math.abs(pEnd.getX() - pInit.getX());
330
		double hRaster = Math.abs(pEnd.getY() - pInit.getY());
331
		double lrx = (((ext.getULX() - wRaster) > ext.maxX()) || ((ext.getULX() - wRaster) < ext.minX())) ? (ulx + w) : (ulx - w);
332
		double lry = (((ext.getULY() - hRaster) > ext.maxY()) || ((ext.getULY() - hRaster) < ext.minY())) ? (uly + h) : (uly - h);
333

  
334
		Point2D p1 = new Point2D.Double(ulx, uly);
335
		Point2D p2 = new Point2D.Double(lrx, lry);
336
		try {
337
			externalTransformation.inverseTransform(p1, p1);
338
			externalTransformation.inverseTransform(p2, p2);
339
			p1.setLocation((int)p1.getX(), (int)p1.getY());
340
			p2.setLocation((int)Math.ceil(p2.getX()), (int)Math.ceil(p2.getY()));
341
			p1.setLocation(Math.max(p1.getX(), 0), Math.max(p1.getY(), 0));
342
			p2.setLocation(Math.max(p2.getX(), 0), Math.max(p2.getY(), 0));
343
			p1.setLocation(Math.min(p1.getX(), getWidth()), Math.min(p1.getY(), getHeight()));
344
			p2.setLocation(Math.min(p2.getX(), getWidth()), Math.min(p2.getY(), getHeight()));
345
			ownTransformation.transform(p1, p1);
346
			ownTransformation.transform(p2, p2);
347
		} catch (NoninvertibleTransformException e) {
348
			throw new RasterDriverException("Noninvertible transform");
349
		}
350

  
351
		Extent selectedExtent = new ExtentImpl(p1.getX(), p1.getY(), p2.getX(), p2.getY());
352

  
353
		setView(selectedExtent);
354
		int wPx = rasterBuf.getWidth();
355
		int hPx = rasterBuf.getHeight();
356
		int[] stpBuffer = new int[]{0, 0 , wPx, hPx};
357

  
358
		loadBuffer(viewRequest, wPx, hPx, rasterBuf, bandList, stpBuffer);
359

  
360
		return rasterBuf;
361
	}
362

  
363
	/*
364
	 * (non-Javadoc)
365
	 * @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)
366
	 */
367
	public Buffer getWindow(Extent extent, int bufWidth, int bufHeight,
368
			BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
369
		Point2D p1 = new Point2D.Double(extent.getULX(), extent.getULY());
370
		Point2D p2 = new Point2D.Double(extent.getLRX(), extent.getLRY());
371
		try {
372
			externalTransformation.inverseTransform(p1, p1);
373
			externalTransformation.inverseTransform(p2, p2);
374
			p1.setLocation((int)p1.getX(), (int)p1.getY());
375
			p2.setLocation((int)Math.ceil(p2.getX()), (int)Math.ceil(p2.getY()));
376
			p1.setLocation(Math.max(p1.getX(), 0), Math.max(p1.getY(), 0));
377
			p2.setLocation(Math.max(p2.getX(), 0), Math.max(p2.getY(), 0));
378
			p1.setLocation(Math.min(p1.getX(), getWidth()), Math.min(p1.getY(), getHeight()));
379
			p2.setLocation(Math.min(p2.getX(), getWidth()), Math.min(p2.getY(), getHeight()));
380
			ownTransformation.transform(p1, p1);
381
			ownTransformation.transform(p2, p2);
382
		} catch (NoninvertibleTransformException e) {
383
			throw new RasterDriverException("Noninvertible transform");
384
		}
385
		Extent selectedExtent = new ExtentImpl(p1, p2);
386
		setView(selectedExtent);
387
		int[] stpBuffer = new int[]{0, 0 , bufWidth, bufHeight};
388

  
389
		//TODO: FUNCIONALIDAD: Implementar adjustToExtent = false
390

  
391
		loadBuffer(viewRequest, bufWidth, bufHeight, rasterBuf, bandList, stpBuffer);
392
		return rasterBuf;
393
	}
394
	
395
	/*
396
	 * (non-Javadoc)
397
	 * @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)
398
	 */
399
	public Buffer getWindow(int x, int y, int w, int h, 
400
			BandList bandList, Buffer rasterBuf, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
401
		Point2D init = this.rasterToWorld(new Point2D.Double(x, y));
402
		Point2D end = this.rasterToWorld(new Point2D.Double(x + w, y + h));
403
		Extent selectedExtent = new ExtentImpl(init.getX(), init.getY(), end.getX(), end.getY());
404
		setView(selectedExtent);
405
		int[] stpBuffer = new int[]{0, 0 , rasterBuf.getWidth(), rasterBuf.getHeight()};
406

  
407
		loadBuffer(viewRequest, rasterBuf.getWidth(), rasterBuf.getHeight(), rasterBuf, bandList, stpBuffer);
408
		return rasterBuf;
409
	}
410

  
411
	/**
412
	 * Carga el buffer con las bandas RGB del raster con los par?metros especificados de extensi?n
413
	 * y tama?o de buffer. El problema de ecw es que solo podemos leer 3 bandas de una vez ya que solo disponemos
414
	 * de una llamada readLineRGBA. Para leer m?s bandas tendremos que hacer multiples llamadas a setView para leer
415
	 * 3 cada vez.
416
	 *
417
	 * Si por ejemplo tenemos un ecw de 6 bandas [0, 1, 2, 3, 4, 5] y queremos cargar un buffer con el siguiente orden
418
	 * [0, -, 2, -, 4, -] La variable readBandsFromECW har? la llamada a setView con los valores [0, 2, 4, 0, 0, 0]. La
419
	 * funci?n drawRGB ser? la encargada de hacer el switch para obtener [0, -, 2, -, 4, -].
420
	 *
421
	 * Bug#1: Si se dispone de un ecw de m?s de tres bandas podemos llamar a setView con readBandsFromECW con el orden
422
	 * que queramos, por ejemplo [3, 2, 5, 1, 0] pero para ecw de 3 bandas la llamada con las bandas cambiadas no
423
	 * hace caso. El caso de readBandsFromECW = [2, 0, 1] ser? tomado siempre como [0, 1, 2].
424
	 *
425
	 * @param selectedExtent Extensi?n seleccionada
426
	 * @param bufWidth Ancho de buffer
427
	 * @param bufHeight Alto de buffer
428
	 * @param rasterBuf Buffer de datos
429
	 */
430
	private void loadBuffer(Extent selectedExtent, int bufWidth, int bufHeight, Buffer rasterBuf, BandList bandList, int[] stpBuffer) throws ProcessInterruptedException, RasterDriverException {
431
		try{
432
			RasterTask task = RasterTaskQueue.get(Thread.currentThread().toString());
433
			
434
			int[] readBandsFromECW = new int[Math.max(file.numBands, 3)];
435
			
436
			for(int i = 0; i < readBandsFromECW.length; i ++) {
437
				readBandsFromECW[i] = i;
438
			}
439

  
440
			if(task.getEvent() != null)
441
				task.manageEvent(task.getEvent());
442

  
443
			if(bufWidth > Math.round(Math.abs(selectedExtent.width() / file.cellIncrementX)))
444
				bufWidth = (int)Math.round(Math.abs(selectedExtent.width() / file.cellIncrementX));
445
			if(bufHeight > Math.round(Math.abs(selectedExtent.height() / file.cellIncrementY)))
446
				bufHeight = (int)Math.round(Math.abs(selectedExtent.height() / file.cellIncrementY));
447
			file.setView(file.numBands, readBandsFromECW, selectedExtent.minX(), selectedExtent.maxY(), selectedExtent.maxX(), selectedExtent.minY(), bufWidth, bufHeight);
448
			
449
			//Escribimos el raster sobre un Buffer
450
			int[] pRGBArray = new int[bufWidth];
451
			drawRGB2(rasterBuf, pRGBArray, bandList, task);
452

  
453
		}catch(JNCSInvalidSetViewException exc){
454
			throw new RasterDriverException("Error setting coords");
455
		}catch (JNCSFileNotOpenException e) {
456
			throw new RasterDriverException("Error opening file");
457
		}catch (JNCSException ex) {
458
			throw new RasterDriverException("Error reading data");
459
		}
460

  
461
	}
462
	
463
	private void drawRGB2(Buffer rasterBuf, int[] pRGBArray, BandList bandList, RasterTask task) throws JNCSException, ProcessInterruptedException {
464
		int[] drawableBands = null;
465
		
466
		for (int line = 0; line < rasterBuf.getHeight(); line++) {
467
			try {
468
				file.readLineRGBA(pRGBArray);
469
				for(int col = 0; col < pRGBArray.length; col ++) {
470
					drawableBands = bandList.getBufferBandToDraw(getURIOfFirstProvider(), 0);
471
					if(drawableBands != null) {
472
						for (int i = 0; i < drawableBands.length; i++) {
473
							if(drawableBands[i] != -1)
474
								rasterBuf.setElem(line, col, drawableBands[i], (byte)((pRGBArray[col] & 0x00ff0000) >> 16));							
475
						}
476
					}
477
					drawableBands = bandList.getBufferBandToDraw(getURIOfFirstProvider(), 1);
478
					if(drawableBands != null) {
479
						for (int i = 0; i < drawableBands.length; i++) {
480
							if(drawableBands[i] != -1)
481
								rasterBuf.setElem(line, col, drawableBands[i], (byte)((pRGBArray[col] & 0x0000ff00) >> 8));
482
						}
483
					}
484
					drawableBands = bandList.getBufferBandToDraw(getURIOfFirstProvider(), 2);
485
					if(drawableBands != null) {
486
						for (int i = 0; i < drawableBands.length; i++) {
487
							if(drawableBands[i] != -1)
488
								rasterBuf.setElem(line, col, drawableBands[i], (byte)(pRGBArray[col] & 0x000000ff));
489
						}
490
					}
491
				}
492
			} catch (JNCSException exc) {
493
			}
494
			if(task.getEvent() != null)
495
				task.manageEvent(task.getEvent());
496
		}
497
		return;
498
	}
499

  
500
	@SuppressWarnings("unused")
501
	private void drawRGB(Buffer rasterBuf, int[] pRGBArray, int[] readBands, BandList bandList, RasterTask task) throws JNCSException, ProcessInterruptedException {
502
		int bandR = readBands[0];
503
		int bandG = (readBands.length > 1) ? readBands[1] : -1;
504
		int bandB = (readBands.length > 2) ? readBands[2] : -1;
505

  
506
		//********* caso especial que resuelve Bug#1 **********************
507
		if(file.numBands == 3 && bandList.getDrawableBandsCount() < 3) {
508
			for(int i = 0; i < 3; i ++) {
509
				int[] b = bandList.getBand(i).getBufferBandListToDraw();
510
				if(b != null){
511
					bandG = 1; bandR = 0; bandB = 2;
512
				}
513
			}
514
		}
515
		if(file.numBands == 3 && bandR == bandG && bandG == bandB) { //caso especial que resuelve Bug#1
516
			for(int i = 0; i < 3; i ++) {
517
				int[] b = bandList.getBand(i).getBufferBandListToDraw();
518
				if(b != null) {
519
					if(i == 0) {
520
						for (int line = 0; line < rasterBuf.getHeight(); line++) {
521
							try {
522
								file.readLineRGBA(pRGBArray);
523
								for(int col = 0; col < pRGBArray.length; col ++) {
524
									rasterBuf.setElem(line, col, bandR, (byte)((pRGBArray[col] & 0x00ff0000) >> 16));
525
									rasterBuf.setElem(line, col, bandG, (byte)((pRGBArray[col] & 0x00ff0000) >> 16));
526
									rasterBuf.setElem(line, col, bandB, (byte)((pRGBArray[col] & 0x00ff0000) >> 16));
527
								}
528
							} catch (JNCSException exc) {
529
							}
530
						}
531
						return;
532
					}
533
					if(i == 1) {
534
						for (int line = 0; line < rasterBuf.getHeight(); line++) {
535
							try {
536
								file.readLineRGBA(pRGBArray);
537
								for(int col = 0; col < pRGBArray.length; col ++) {
538
									rasterBuf.setElem(line, col, bandR, (byte)((pRGBArray[col] & 0x0000ff00) >> 8));
539
									rasterBuf.setElem(line, col, bandG, (byte)((pRGBArray[col] & 0x0000ff00) >> 8));
540
									rasterBuf.setElem(line, col, bandB, (byte)((pRGBArray[col] & 0x0000ff00) >> 8));
541
								}
542
							} catch (JNCSException exc) {
543
							}
544
						}
545
						return;
546
					}
547
					if(i == 2) {
548
						for (int line = 0; line < rasterBuf.getHeight(); line++) {
549
							try {
550
								file.readLineRGBA(pRGBArray);
551
								for(int col = 0; col < pRGBArray.length; col ++) {
552
									rasterBuf.setElem(line, col, bandR, (byte)(pRGBArray[col] & 0x000000ff));
553
									rasterBuf.setElem(line, col, bandG, (byte)(pRGBArray[col] & 0x000000ff));
554
									rasterBuf.setElem(line, col, bandB, (byte)(pRGBArray[col] & 0x000000ff));
555
								}
556
							} catch (JNCSException exc) {
557
							}
558
						}
559
						return;
560
					}
561
				}
562
				if(task.getEvent() != null)
563
					task.manageEvent(task.getEvent());
564
			}
565

  
566
		}
567
		//********* END caso especial que resuelve Bug#1 **********************
568

  
569
		if(bandR >= 0 && bandG >= 0 && bandB >= 0) {
570
			for (int line = 0; line < rasterBuf.getHeight(); line++) {
571
				try {
572
					file.readLineRGBA(pRGBArray);
573
					for(int col = 0; col < pRGBArray.length; col ++) {
574
						rasterBuf.setElem(line, col, bandR, (byte)((pRGBArray[col] & 0x00ff0000) >> 16));
575
						rasterBuf.setElem(line, col, bandG, (byte)((pRGBArray[col] & 0x0000ff00) >> 8));
576
						rasterBuf.setElem(line, col, bandB, (byte)(pRGBArray[col] & 0x000000ff));
577
					}
578
				} catch (JNCSException exc) {
579
				}
580
			}
581
			return;
582
		}
583

  
584
		if(task.getEvent() != null)
585
			task.manageEvent(task.getEvent());
586

  
587
		if(bandR >= 0 && bandG >= 0) {
588
			for (int line = 0; line < rasterBuf.getHeight(); line++) {
589
				try {
590
					file.readLineRGBA(pRGBArray);
591
					for(int col = 0; col < pRGBArray.length; col ++) {
592
						rasterBuf.setElem(line, col, bandR, (byte)((pRGBArray[col] & 0x00ff0000) >> 16));
593
						rasterBuf.setElem(line, col, bandG, (byte)((pRGBArray[col] & 0x0000ff00) >> 8));
594
					}
595
				} catch (JNCSException exc) {
596
				}
597
			}
598
			return;
599
		}
600

  
601
		if(task.getEvent() != null)
602
			task.manageEvent(task.getEvent());
603

  
604
		if(bandR >= 0){
605
			for (int line = 0; line < rasterBuf.getHeight(); line++) {
606
				try {
607
					file.readLineRGBA(pRGBArray);
608
					for(int col = 0; col < pRGBArray.length; col ++)
609
						rasterBuf.setElem(line, col, bandR, (byte)((pRGBArray[col] & 0x00ff0000) >> 16));
610
				} catch (JNCSException exc) {
611
				}
612
			}
613
			return;
614
		}
615

  
616
		if(task.getEvent() != null)
617
			task.manageEvent(task.getEvent());
618

  
619
	}
620

  
621
	public void reProject(ICoordTrans rp) {
622
	}
623

  
624
	/*
625
	 * (non-Javadoc)
626
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getBlockSize()
627
	 */
628
	public int getBlockSize() {
629
		return 0;
630
	}
631

  
632
	/*
633
	 * (non-Javadoc)
634
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#readCompleteLine(int, int)
635
	 */
636
	public Object readCompleteLine(int line, int band) throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
637
		if(line < 0 || line >= file.height || band < 0 || band >= getBandCount())
638
			throw new InvalidSetViewException("Request out of grid");
639

  
640
		Point2D begin = rasterToWorld(new Point2D.Double(0, line));
641
		Point2D end = rasterToWorld(new Point2D.Double(file.width, line + 1));
642
		int[] readBandsFromECW = new int[file.numBands];
643
		if(file.numBands <= 3) {
644
			for(int i = 0; i < file.numBands; i++)
645
				readBandsFromECW[i] = i;
646
		} else {
647
			readBandsFromECW[0] = band;
648
		}
649

  
650
		Extent e = new ExtentImpl(begin.getX(), begin.getY(), end.getX(), end.getY());
651

  
652
		try {
653
			int[] value = new int[file.width];
654
			file.setView(file.numBands, readBandsFromECW, e.minX(), e.maxY(), e.maxX(), e.minY(), file.width, 1);
655
			file.readLineRGBA(value);
656

  
657
			if(file.numBands <= 3) {
658
				switch(getDataType()[0]) {
659
				case Buffer.TYPE_BYTE: byte[] b = new byte[file.width];
660
										switch(band) {
661
										case 0: for(int i = 0; i < file.width; i ++)
662
													b[i] = (byte)(((value[i] & 0x00ff0000) >> 16) & 0xff);
663
												break;
664
										case 1: for(int i = 0; i < file.width; i ++)
665
													b[i] = (byte)(((value[i] & 0x0000ff00) >> 8) & 0xff);
666
												break;
667
										case 2: for(int i = 0; i < file.width; i ++)
668
													b[i] = (byte)((value[i] & 0x000000ff) & 0xff);
669
												break;
670
										}
671
										return b;
672
				}
673
			}else {
674
				switch(getDataType()[0]) {
675
				case Buffer.TYPE_BYTE: byte[] b = new byte[file.width];
676
										for(int i = 0; i < file.width; i ++)
677
											b[i] = (byte)(((value[i] & 0x00ff0000) >> 16) & 0xff);
678
										break;
679
				}
680
			}
681
			//TODO: FUNCIONALIDAD: Ecw con otro tipo de dato != Byte
682
		} catch (JNCSFileNotOpenException e1) {
683
			throw new FileNotOpenException("Error en jecw: JNCSFileNotOpenException");
684
		} catch (JNCSInvalidSetViewException e1) {
685
			throw new FileNotOpenException("Error en jecw: JNCSInvalidSetViewException");
686
		} catch (JNCSException e1) {
687
			throw new RasterDriverException("Error la lectura de datos ecw");
688
		}
689

  
690
		return null;
691
	}
692

  
693
	/*
694
	 * (non-Javadoc)
695
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#readBlock(int, int)
696
	 */
697
	public Object readBlock(int pos, int blockHeight, double scale) throws InvalidSetViewException, FileNotOpenException, RasterDriverException, ProcessInterruptedException {
698
		RasterTask task = RasterTaskQueue.get(Thread.currentThread().toString());
699
		if(pos < 0)
700
			throw new InvalidSetViewException("Request out of grid");
701

  
702
		if((pos + blockHeight) > file.height)
703
			blockHeight = Math.abs(file.height - pos);
704

  
705
		Point2D begin = rasterToWorld(new Point2D.Double(0, pos));
706
		Point2D end = rasterToWorld(new Point2D.Double(file.width, pos + blockHeight));
707
		int[] readBandsFromECW = new int[file.numBands];
708

  
709
		for(int i = 0; i < file.numBands; i++)
710
			readBandsFromECW[i] = i;
711

  
712
		byte[][][] buf = new byte[file.numBands][blockHeight][file.width];
713
		Extent e = new ExtentImpl(begin.getX(), begin.getY(), end.getX(), end.getY());
714
		e = rasterUtil.calculateAdjustedView(getExtent(), e);
715

  
716
		try {
717
			int[] value = new int[file.width];
718
			file.setView(file.numBands, readBandsFromECW, e.minX(), e.maxY(), e.maxX(), e.minY(), file.width, blockHeight);
719

  
720
			if(file.numBands <= 3) {
721
				for (int row = 0; row < blockHeight; row++) {
722
					file.readLineRGBA(value);
723
					switch(getDataType()[0]) {
724
					case Buffer.TYPE_BYTE:
725
						if(buf.length >= 3) {
726
							for(int col = 0; col < file.width; col ++) {
727
								buf[0][row][col] = (byte)(((value[col] & 0x00ff0000) >> 16) & 0xff);
728
								buf[1][row][col] = (byte)(((value[col] & 0x0000ff00) >> 8) & 0xff);
729
								buf[2][row][col] = (byte)((value[col] & 0x000000ff) & 0xff);
730
							}
731
						} else { //Si es monobanda solo se usa cualquiera uno de los tres valores
732
							for(int col = 0; col < file.width; col ++) {
733
								buf[0][row][col] = (byte)(((value[col] & 0x00ff0000) >> 16) & 0xff);
734
							}
735
						}
736
						break;
737
					}
738
				}
739

  
740
				if(task.getEvent() != null)
741
					task.manageEvent(task.getEvent());
742

  
743
			} else {
744
				//TODO: FUNCIONALIDAD: file.numBands > 3
745
			}
746

  
747
			//TODO: FUNCIONALIDAD: Ecw con otro tipo de dato != Byte
748
		} catch (JNCSFileNotOpenException e1) {
749
			throw new FileNotOpenException("Error en jecw: JNCSFileNotOpenException");
750
		} catch (JNCSInvalidSetViewException e1) {
751
			throw new FileNotOpenException("Error en jecw: JNCSInvalidSetViewException");
752
		} catch (JNCSException e1) {
753
			throw new RasterDriverException("Error la lectura de datos ecw");
754
		}
755

  
756
		return buf;
757
	}
758

  
759
	/*
760
	 * (non-Javadoc)
761
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getData(int, int, int)
762
	 */
763
	public Object getData(int x, int y, int band)throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
764
		if(x < 0 || y < 0 || x >= file.width || y >= file.height)
765
			throw new InvalidSetViewException("Request out of grid");
766

  
767
		Point2D begin = new Point2D.Double(x, y);
768
		Point2D end = new Point2D.Double(x + 1, y + 1);
769

  
770
		ownTransformation.transform(begin, begin);
771
		ownTransformation.transform(end, end);
772

  
773
		int[] readBandsFromECW = new int[file.numBands];
774
		if(file.numBands <= 3){
775
			for(int i = 0; i < file.numBands; i++)
776
				readBandsFromECW[i] = i;
777
		}else{
778
			readBandsFromECW[0] = band;
779
		}
780

  
781
		Extent e = new ExtentImpl(begin.getX(), begin.getY(), end.getX(), end.getY());
782
		try {
783
			int[] value = new int[1];
784
			file.setView(file.numBands, readBandsFromECW, e.minX(), e.maxY(), e.maxX(), e.minY(), 1, 1);
785
			file.readLineRGBA(value);
786
			if(file.numBands <= 3){
787
				switch(band){
788
				case 0: return new Integer((((value[0] & 0x00ff0000) >> 16) & 0xffffffff));
789
				case 1: return new Integer((((value[0] & 0x0000ff00) >> 8) & 0xffffffff));
790
				case 2: return new Integer((((value[0] & 0x000000ff)) & 0xffffffff));
791
				}
792
			}
793
			return new Integer((((value[0] & 0x00ff0000) >> 16) & 0xffffffff));
794
		} catch (JNCSFileNotOpenException e1) {
795
			throw new FileNotOpenException("Error en jecw: JNCSFileNotOpenException");
796
		} catch (JNCSInvalidSetViewException e1) {
797
			throw new FileNotOpenException("Error en jecw: JNCSInvalidSetViewException");
798
		} catch (JNCSException e1) {
799
			throw new RasterDriverException("Error reading ecw data");
800
		}
801
	}
802

  
803
	/*
804
	 * (non-Javadoc)
805
	 * @see com.ermapper.ecw.JNCSProgressiveUpdate#refreshUpdate(int, int, double, double, double, double)
806
	 */
807
	public void refreshUpdate(int arg0, int arg1, double arg2, double arg3, double arg4, double arg5) {
808
	}
809

  
810
	/*
811
	 * (non-Javadoc)
812
	 * @see com.ermapper.ecw.JNCSProgressiveUpdate#refreshUpdate(int, int, int, int, int, int)
813
	 */
814
	public void refreshUpdate(int arg0, int arg1, int arg2, int arg3, int arg4, int arg5) {
815
	}
816

  
817
	/*
818
	 * (non-Javadoc)
819
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getColorInterpretation()
820
	 */
821
	public DataStoreColorInterpretation getColorInterpretation(){
822
		if(colorInterpr == null) {
823
			colorInterpr = new DataStoreColorInterpretation();
824
			colorInterpr.initColorInterpretation(getBandCount());
825
			if(getBandCount() == 1)
826
				colorInterpr.setColorInterpValue(0, DataStoreColorInterpretation.GRAY_BAND);
827
			if(getBandCount() >= 3) {
828
				colorInterpr.setColorInterpValue(0, DataStoreColorInterpretation.RED_BAND);
829
				colorInterpr.setColorInterpValue(1, DataStoreColorInterpretation.GREEN_BAND);
830
				colorInterpr.setColorInterpValue(2, DataStoreColorInterpretation.BLUE_BAND);
831
			}
832
		}
833
		return colorInterpr;
834
	}
835

  
836
	/*
837
	 * (non-Javadoc)
838
	 * @see org.gvsig.raster.impl.provider.RasterProvider#getOverviewCount(int)
839
	 */
840
	public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
841
		if(band >= getBandCount())
842
			throw new BandAccessException("Wrong band");
843
		return 0;
844
	}
845

  
846
	/*
847
	 * (non-Javadoc)
848
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewWidth(int, int)
849
	 */
850
	public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException {
851
		if (band >= getBandCount())
852
			throw new BandAccessException("Wrong band");
853
		return 0;
854
	}
855

  
856
	/*
857
	 * (non-Javadoc)
858
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewHeight(int, int)
859
	 */
860
	public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
861
		if (band >= getBandCount())
862
			throw new BandAccessException("Wrong band");
863
		return 0;
864
	}
865

  
866
	/*
867
	 * (non-Javadoc)
868
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isOverviewsSupported()
869
	 */
870
	public boolean isOverviewsSupported() {
871
		return false;
872
	}
873

  
874
	
875
	public String getStringProjection() throws RasterDriverException{
876
		return file.projection;
877
	}
878

  
879
	/*
880
	 * (non-Javadoc)
881
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWktProjection()
882
	 */
883
	public String getWktProjection() {
884
		return null;
885
	}
886
	
887
	/*
888
	 * (non-Javadoc)
889
	 * @see org.gvsig.fmap.dal.spi.DataStoreProvider#getName()
890
	 */
891
	public String getName() {
892
		return NAME;
893
	}
894
	
895
	/*
896
	 * (non-Javadoc)
897
	 * @see org.gvsig.raster.impl.provider.RasterProvider#setStatus(org.gvsig.raster.impl.provider.RasterProvider)
898
	 */
899
	public void setStatus(RasterProvider provider) {
900
		if(provider instanceof ErmapperProvider) {
901
			//Not implemented yet
902
		}
903
	}
904
	
905
	/*
906
	 * (non-Javadoc)
907
	 * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isSupersamplingSupported()
908
	 */
909
	public boolean isSupersamplingSupported() {
910
		return false;
911
	}
912
	
913
	/*
914
	 * (non-Javadoc)
915
	 * @see org.gvsig.raster.impl.provider.RasterProvider#getTileServer()
916
	 */
917
	public TileServer getTileServer() {
918
		if(tileServer == null)
919
			tileServer = new FileTileServer(this);
920
		return tileServer;
921
	}
922
	
923
}
0 924

  
org.gvsig.raster.ermapper/tags/buildNumber_47/org.gvsig.raster.ermapper.io/src/main/java/org/gvsig/raster/ermapper/io/ErmapperNewRasterStoreParameters.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.ermapper.io;
23

  
24
import org.gvsig.raster.impl.store.AbstractNewRasterStoreParameters;
25

  
26
/**
27
 * Parameters for creating a Ermapper store
28
 * @author Nacho Brodin (nachobrodin@gmail.com)
29
 */
30
public class ErmapperNewRasterStoreParameters extends AbstractNewRasterStoreParameters {
31

  
32
	public String getDataStoreName() {
33
		return ErmapperProvider.NAME;
34
	}
35

  
36
	public String getDescription() {
37
		return ErmapperProvider.DESCRIPTION;
38
	}
39

  
40
}
41

  
0 42

  
org.gvsig.raster.ermapper/tags/buildNumber_47/org.gvsig.raster.ermapper.io/src/main/java/org/gvsig/raster/ermapper/io/ErmapperFilesystemServerExplorer.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.ermapper.io;
29

  
30
import java.awt.geom.AffineTransform;
31
import java.io.File;
32
import java.io.IOException;
33

  
34
import org.gvsig.fmap.dal.DALLocator;
35
import org.gvsig.fmap.dal.DataManager;
36
import org.gvsig.fmap.dal.DataServerExplorer;
37
import org.gvsig.fmap.dal.DataStoreParameters;
38
import org.gvsig.fmap.dal.NewDataStoreParameters;
39
import org.gvsig.fmap.dal.coverage.RasterLocator;
40
import org.gvsig.fmap.dal.coverage.datastruct.Params;
41
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
42
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
43
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
44
import org.gvsig.fmap.dal.coverage.store.DataServerWriter;
45
import org.gvsig.fmap.dal.coverage.store.RasterWriter;
46
import org.gvsig.fmap.dal.coverage.store.parameter.NewRasterStoreParameters;
47
import org.gvsig.fmap.dal.exception.CreateException;
48
import org.gvsig.fmap.dal.exception.DataException;
49
import org.gvsig.fmap.dal.exception.RemoveException;
50
import org.gvsig.fmap.dal.serverexplorer.filesystem.impl.AbstractFilesystemServerExplorerProvider;
51
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProviderServices;
52
import org.gvsig.raster.impl.store.AbstractRasterFileDataParameters;
53
import org.gvsig.tools.locator.LocatorException;
54

  
55
public class ErmapperFilesystemServerExplorer extends AbstractFilesystemServerExplorerProvider {
56
	
57
	/*
58
	 * (non-Javadoc)
59
	 * @see org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProvider#canCreate()
60
	 */
61
	public boolean canCreate() {
62
		return false;
63
	}
64

  
65
	/*
66
	 * (non-Javadoc)
67
	 * @see org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProvider#canCreate(org.gvsig.fmap.dal.NewDataStoreParameters)
68
	 */
69
	public boolean canCreate(NewDataStoreParameters parameters) {
70
		return false;
71
	}
72

  
73
	/*
74
	 * (non-Javadoc)
75
	 * @see org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProvider#create(org.gvsig.fmap.dal.NewDataStoreParameters, boolean)
76
	 */
77
	public void create(NewDataStoreParameters parameters, boolean overwrite)
78
			throws CreateException {
79
		NewRasterStoreParameters p = null;
80
		if(parameters instanceof NewRasterStoreParameters)
81
			 p = (NewRasterStoreParameters)parameters;
82
		
83
		DataServerWriter dataWriter = p.getDataServer();
84
		if(dataWriter == null)
85
			dataWriter = RasterLocator.getManager().createDataServerWriter();
86
		dataWriter.setBuffer(p.getBuffer(), p.getBand());
87
		Params params;
88
		try {
89
			if(p.getDriverParams() != null)
90
				params = p.getDriverParams();
91
			else
92
				params = RasterLocator.getManager().createWriter(p.getFileName()).getParams();
93
			
94
			AffineTransform affineTransform = p.getAffineTransform();
95
			if(affineTransform == null) {
96
				if(p.getBuffer().getDataExtent() != null) {
97
					double x = p.getBuffer().getDataExtent().getMinX();
98
					double y = p.getBuffer().getDataExtent().getMaxY();
99
					double pixelSizeX = p.getBuffer().getDataExtent().getWidth() / p.getBuffer().getWidth();
100
					double pixelSizeY = p.getBuffer().getDataExtent().getHeight() / p.getBuffer().getHeight();
101
					affineTransform = new AffineTransform(pixelSizeX, 0, 0, pixelSizeY, x, y);
102
				} else {
103
					affineTransform = new AffineTransform();
104
				}
105
			}
106
			
107
			RasterWriter writer = RasterLocator.getManager().createWriter(
108
					dataWriter, 
109
					p.getPath() + File.separator + p.getFileName(),
110
					p.getBand() < 0 ? p.getBuffer().getBandCount() : 1,  
111
					affineTransform, 
112
					p.getBuffer().getWidth(),
113
					p.getBuffer().getHeight(), 
114
					p.getBuffer().getDataType(), 
115
					params, 
116
					null);
117
			if(p.getColorInterpretation() != null)
118
				writer.setColorBandsInterpretation(p.getColorInterpretation());
119
			writer.setWkt(p.getWktProjection());
120
			
121
			writer.dataWrite();
122
			writer.writeClose();
123
		} catch (LocatorException e) {
124
			throw new CreateException("", e);
125
		} catch (NotSupportedExtensionException e) {
126
			throw new CreateException("", e);
127
		} catch (RasterDriverException e) {
128
			throw new CreateException("", e);
129
		} catch (ProcessInterruptedException e) {
130
			//Fin del proceso
131
		} catch (IOException e) {
132
			throw new CreateException("", e);
133
		}
134
	}
135

  
136
	/*
137
	 * (non-Javadoc)
138
	 * @see org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProvider#getCreateParameters()
139
	 */
140
	public NewDataStoreParameters getCreateParameters() throws DataException {
141
		return new ErmapperNewRasterStoreParameters();
142
	}
143

  
144
	/*
145
	 * (non-Javadoc)
146
	 * @see org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProvider#initialize(org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProviderServices)
147
	 */
148
	public void initialize(
149
			FilesystemServerExplorerProviderServices serverExplorer) {
150
	}
151
	
152
	/*
153
	 * (non-Javadoc)
154
	 * @see org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProvider#remove(org.gvsig.fmap.dal.DataStoreParameters)
155
	 */
156
	public void remove(DataStoreParameters parameters) throws RemoveException {
157
		throw new UnsupportedOperationException();
158
	}
159

  
160
	/*
161
	 * (non-Javadoc)
162
	 * @see org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemFileFilter#getDataStoreProviderName()
163
	 */
164
	public String getDataStoreProviderName() {
165
		return ErmapperProvider.NAME;
166
	}
167

  
168
	/*
169
	 * (non-Javadoc)
170
	 * @see java.io.FileFilter#accept(java.io.File)
171
	 */
172
	public boolean accept(File pathname) {
173
		return RasterLocator.getManager().isExtensionSupported(pathname.getAbsolutePath(), ErmapperProvider.class);
174
	}
175

  
176
	/*
177
	 * (non-Javadoc)
178
	 * @see org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemFileFilter#getDescription()
179
	 */
180
	public String getDescription() {
181
		return ErmapperProvider.DESCRIPTION;
182
	}
183

  
184
	public DataStoreParameters getParameters(File file) throws DataException {
185
		DataManager manager = DALLocator.getDataManager();
186
		AbstractRasterFileDataParameters params = (AbstractRasterFileDataParameters) manager
187
				.createStoreParameters(this.getDataStoreProviderName());
188
		params.setFile(file);
189
		return params;
190
	}
191

  
192
	public int getMode() {
193
		return DataServerExplorer.MODE_RASTER;
194
	}
195
}
0 196

  
org.gvsig.raster.ermapper/tags/buildNumber_47/org.gvsig.raster.ermapper.io/src/main/java/org/gvsig/raster/ermapper/io/ErmapperWriter.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.ermapper.io;
23

  
24
import java.awt.geom.AffineTransform;
25
import java.awt.geom.Point2D;
26
import java.io.File;
27
import java.io.IOException;
28

  
29
import org.cresques.cts.IProjection;
30
import org.gvsig.fmap.dal.coverage.RasterLibrary;
31
import org.gvsig.fmap.dal.coverage.RasterLocator;
32
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
33
import org.gvsig.fmap.dal.coverage.datastruct.Params;
34
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
35
import org.gvsig.fmap.dal.coverage.process.CancelEvent;
36
import org.gvsig.fmap.dal.coverage.process.TaskEventManager;
37
import org.gvsig.fmap.dal.coverage.store.DataServerWriter;
38
import org.gvsig.fmap.dal.coverage.store.ExternalCancellable;
39
import org.gvsig.raster.impl.store.ParamImpl;
40
import org.gvsig.raster.impl.store.WriteFileFormatFeatures;
41
import org.gvsig.raster.impl.store.writer.DefaultRasterWriter;
42
import org.gvsig.raster.util.DefaultProviderServices;
43
import org.gvsig.tools.ToolsLocator;
44
import org.gvsig.tools.extensionpoint.ExtensionPoint;
45
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
46

  
47
import es.gva.cit.jecwcompress.EcwException;
48
import es.gva.cit.jecwcompress.JniObject;
49
import es.gva.cit.jecwcompress.NCSEcwCompressClient;
50
import es.gva.cit.jecwcompress.ReadCallBack;
51
/**
52
 * Driver para la compresi?n en formato Ecw.
53
 *
54
 * Puede exportar un fichero desde un GeoRasterFile en cualquier formato soportado
55
 * por los drivers de lectura a uno en formato Ecw.
56
 *
57
 * Puede salvar a disco en formato Ecw obteniendo los datos que van siendo servidos
58
 * desde el cliente. Este cliente debe implementar un DataServerWriter o tener un objeto
59
 * que lo implemente. Inicialmente le pasar? los par?metros de la imagen de salida
60
 * y cuando el driver comience a escribir le ir? solicitando m?s a trav?s del m?todo
61
 * readData de DataServerWriter. El cliente ser? el que lleve el control de lo que va
62
 * sirviendo y lo que le queda por servir.
63
 * @author Nacho Brodin (brodin_ign@gva.es)
64
 */
65
public class ErmapperWriter extends DefaultRasterWriter {
66

  
67
	public static void register() {
68
		DefaultProviderServices pInfo = (DefaultProviderServices)RasterLocator.getManager().getProviderServices();
69
		ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
70
		ExtensionPoint point = extensionPoints.get("RasterWriter");
71
		WriteFileFormatFeatures features = null;
72

  
73
		String os = System.getProperties().getProperty("os.version");
74
		if (os.startsWith("2.4")){
75
			point.append("ecw", "", ErmapperWriter.class);
76
			features = new WriteFileFormatFeatures("Ecw", "ecw", new int[]{3}, null, ErmapperWriter.class);
77
			pInfo.getFileFeature().put("ecw", features);
78
		}
79
		point.append("jp2", "", ErmapperWriter.class);
80
		features = new WriteFileFormatFeatures("Jpeg2000", "jp2", new int[]{3}, null, ErmapperWriter.class);
81
		pInfo.getFileFeature().put("jp2", features);
82
	}
83

  
84
	public final int 				windowSizeX = 386;
85
	public final int 				windowSizeY = 220;
86
	public final int 				panelSizeX = 358;
87
	public final int 				panelSizeY = 125;
88
	public final String 			panelLayout = "BorderLayout";
89
	private NCSEcwCompressClient 	compressclient = null;
90
	private Reader 					readerObj;
91
	private double 					pixelSizeX;
92
	private double 					pixelSizeY;
93
	private double 					geoCoordOrigenX;
94
	private double 					geoCoordOrigenY;
95
	private boolean 				consulta = false;
96

  
97
	/**
98
	 * Carga los par?metros de este driver.
99
	 */
100
	public void loadParams() {
101
		WriteFileFormatFeatures wfff = new WriteFileFormatFeatures();
102
		wfff.loadParams();
103
		driverParams = wfff.getParams();
104

  
105
		driverParams.setParam(	"compression",
106
				new Integer(10),
107
				Params.SLIDER,
108
				new String[]{ "1", "20", "10", "1", "5" }); //min, max, valor defecto, intervalo peque?o, intervalo grande;
109

  
110
		driverParams.setParam(	"format",
111
				new Integer(4),
112
				Params.CHOICE,
113
				new String[]{ "NONE", "UINT8", "YUV", "MULTI", "RGB"});
114
	}
115
	
116
	/*
117
	 * (non-Javadoc)
118
	 * @see org.gvsig.fmap.dal.coverage.store.RasterWriter#getProviderName()
119
	 */
120
	public String getProviderName() {
121
		return ErmapperProvider.NAME;
122
	}
123

  
124
	/**
125
	 * Constructor para la obtenci?n de par?metros del driver.
126
	 */
127
	public ErmapperWriter(String fileName) {
128
		DefaultProviderServices pInfo = (DefaultProviderServices)RasterLocator.getManager().getProviderServices();
129
		ident = fileUtil.getExtensionFromFileName(fileName);
130
		driver = ((WriteFileFormatFeatures)pInfo.getFileFeature().get(ident)).getDriverName();
131

  
132
		loadParams();
133

  
134
		consulta = true;
135
	}
136

  
137
	/**
138
	 * Constructor para la lectura de datos desde el objeto cliente a partir de un
139
	 * viewport dado.
140
	 * @param dataWriter Objeto que sirve datos para el escritor
141
	 * @param outFileName Fichero de salida
142
	 * @param nBands N?mero de bandas
143
	 * @param at
144
	 * @param outSizeX
145
	 * @param outSizeY
146
	 * @param dataType
147
	 * @param params
148
	 * @param proj
149
	 * @param geo
150
	 * @throws EcwException
151
	 * @throws IOException
152
	 */
153
	public ErmapperWriter(	DataServerWriter dataWriter,
154
			String outFileName,
155
			Integer nBands,
156
			AffineTransform at,
157
			Integer outSizeX,
158
			Integer outSizeY,
159
			Integer dataType,
160
			Params params,
161
			IProjection proj,
162
			Boolean geo) throws EcwException, IOException {
163
		DefaultProviderServices pInfo = (DefaultProviderServices)RasterLocator.getManager().getProviderServices();
164
		//La libreria de ECW no se traga caracteres raros al escribir. Los cambiamos por X de momento y ya se apa?a el usuario
165

  
166
		String ext = fileUtil.getExtensionFromFileName(outFileName);
167
		String fname = outFileName.substring(outFileName.lastIndexOf(File.separator) + 1, outFileName.lastIndexOf(".")).replaceAll("[^a-zA-Z0-9_]", "X");
168
		outFileName = outFileName.substring(0, outFileName.lastIndexOf(File.separator) + 1) + fname + "." + ext;
169

  
170
		this.proj = proj;
171
		ident = fileUtil.getExtensionFromFileName(outFileName);
172
		driver = ((WriteFileFormatFeatures)pInfo.getFileFeature().get(ident)).getDriverName();
173
		this.dataType = dataType.intValue();
174

  
175
		if (nBands.intValue() <= 0)
176
			throw new EcwException("N?mero de bandas erroneo.");
177

  
178
		this.outFileName = outFileName;
179
		this.dataWriter = dataWriter;
180

  
181
		this.nBands = nBands.intValue();
182

  
183
		this.sizeWindowX = outSizeX.intValue();
184
		this.sizeWindowY = outSizeY.intValue();
185

  
186
		//Calculamos la georeferenciaci?n a partir del extend pasado por el cliente.
187
		geoCoordOrigenX = at.getTranslateX();
188
		geoCoordOrigenY = at.getTranslateY();
189

  
190
		pixelSizeX = (at.getScaleX() > 0) ? at.getScaleX() : -at.getScaleX();
191
		pixelSizeY = (at.getScaleY() < 0) ? at.getScaleY() : -at.getScaleY();
192

  
193
		String outRmf = fileUtil.getNameWithoutExtension(outFileName);
194
		if(geo.booleanValue())
195
			rasterUtil.saveGeoInfo(outRmf, at, new Point2D.Double(sizeWindowX, sizeWindowY));
196

  
197
		if (pixelSizeX == 0)
198
			pixelSizeX = 1.0;
199

  
200
		if (pixelSizeY == 0)
201
			pixelSizeY = 1.0;
202

  
203
		if(params == null)
204
			loadParams();
205
		else
206
			driverParams = params;
207

  
208
		init();
209
	}
210

  
211
	/**
212
	 * Inicializaci?n de los par?metros del compresor que ser?n obtenidos
213
	 * de PxRaster.
214
	 * @throws EcwException
215
	 */
216
	private void init() throws EcwException {
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff