gvsig-raster / org.gvsig.raster / trunk / org.gvsig.raster / org.gvsig.raster.lib / org.gvsig.raster.lib.impl / src / main / java / org / gvsig / raster / impl / store / AbstractRasterDataStore.java @ 1868
History | View | Annotate | Download (36.7 KB)
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.impl.store; |
23 |
|
24 |
import java.awt.geom.Point2D; |
25 |
import java.awt.geom.Rectangle2D; |
26 |
import java.io.File; |
27 |
import java.util.Iterator; |
28 |
import java.util.List; |
29 |
import java.util.Set; |
30 |
|
31 |
import org.cresques.cts.ICoordTrans; |
32 |
import org.gvsig.fmap.dal.DataManager; |
33 |
import org.gvsig.fmap.dal.DataQuery; |
34 |
import org.gvsig.fmap.dal.DataServerExplorer; |
35 |
import org.gvsig.fmap.dal.DataSet; |
36 |
import org.gvsig.fmap.dal.DataStore; |
37 |
import org.gvsig.fmap.dal.DataStoreParameters; |
38 |
import org.gvsig.fmap.dal.coverage.RasterLibrary; |
39 |
import org.gvsig.fmap.dal.coverage.RasterLocator; |
40 |
import org.gvsig.fmap.dal.coverage.dataset.Buffer; |
41 |
import org.gvsig.fmap.dal.coverage.datastruct.Extent; |
42 |
import org.gvsig.fmap.dal.coverage.datastruct.GeoPointList; |
43 |
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException; |
44 |
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException; |
45 |
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException; |
46 |
import org.gvsig.fmap.dal.coverage.exception.RmfSerializerException; |
47 |
import org.gvsig.fmap.dal.coverage.grid.render.Render; |
48 |
import org.gvsig.fmap.dal.coverage.process.vector.Vectorization; |
49 |
import org.gvsig.fmap.dal.coverage.store.RasterDataStore; |
50 |
import org.gvsig.fmap.dal.coverage.store.RasterQuery; |
51 |
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters; |
52 |
import org.gvsig.fmap.dal.coverage.store.parameter.RasterFileStoreParameters; |
53 |
import org.gvsig.fmap.dal.coverage.store.props.ColorTable; |
54 |
import org.gvsig.fmap.dal.coverage.store.props.TimeSeries; |
55 |
import org.gvsig.fmap.dal.coverage.util.RasterUtils; |
56 |
import org.gvsig.fmap.dal.exception.DataException; |
57 |
import org.gvsig.fmap.dal.exception.InitializeException; |
58 |
import org.gvsig.fmap.dal.exception.ValidateDataParametersException; |
59 |
import org.gvsig.fmap.dal.raster.CoverageSelection; |
60 |
import org.gvsig.fmap.dal.raster.CoverageStore; |
61 |
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider; |
62 |
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProviderServices; |
63 |
import org.gvsig.fmap.dal.resource.Resource; |
64 |
import org.gvsig.fmap.dal.spi.DataStoreInitializer; |
65 |
import org.gvsig.fmap.dal.spi.DataStoreProvider; |
66 |
import org.gvsig.metadata.MetadataLocator; |
67 |
import org.gvsig.metadata.MetadataManager; |
68 |
import org.gvsig.metadata.exceptions.MetadataException; |
69 |
import org.gvsig.raster.cache.tile.Tile; |
70 |
import org.gvsig.raster.cache.tile.exception.TileGettingException; |
71 |
import org.gvsig.raster.impl.DefaultRasterManager; |
72 |
import org.gvsig.raster.impl.buffer.DefaultRasterQuery; |
73 |
import org.gvsig.raster.impl.datastruct.ExtentImpl; |
74 |
import org.gvsig.raster.impl.grid.render.DefaultRender; |
75 |
import org.gvsig.raster.impl.process.vector.PotraceVectorization; |
76 |
import org.gvsig.raster.impl.provider.RasterProvider; |
77 |
import org.gvsig.tools.ToolsLocator; |
78 |
import org.gvsig.tools.dispose.impl.AbstractDisposable; |
79 |
import org.gvsig.tools.dynobject.DelegatedDynObject; |
80 |
import org.gvsig.tools.dynobject.DynClass; |
81 |
import org.gvsig.tools.dynobject.DynObject; |
82 |
import org.gvsig.tools.dynobject.DynObjectManager; |
83 |
import org.gvsig.tools.dynobject.DynStruct; |
84 |
import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException; |
85 |
import org.gvsig.tools.dynobject.exception.DynMethodException; |
86 |
import org.gvsig.tools.exception.BaseException; |
87 |
import org.gvsig.tools.observer.impl.DelegateWeakReferencingObservable; |
88 |
import org.gvsig.tools.undo.command.Command; |
89 |
import org.gvsig.tools.visitor.Visitor; |
90 |
|
91 |
/**
|
92 |
* Default implementation for RasterDataSource
|
93 |
*
|
94 |
* @author Nacho Brodin (nachobrodin@gmail.com)
|
95 |
*/
|
96 |
public abstract class AbstractRasterDataStore extends AbstractDisposable |
97 |
implements RasterDataStore, CoverageStoreProviderServices, QueryableRaster, DataStoreInitializer {
|
98 |
public static final String PERSISTENT_NAME = "AbstractRasterDataStore_Persistent"; |
99 |
public static final String PERSISTENT_DESCRIPTION = "AbstractRasterDataStore Persistent"; |
100 |
protected DefaultRasterQuery currentQuery = null; |
101 |
/**
|
102 |
* Lista de paletas asociadas a las bandas cargadas en el DataSource. Estas son calculadas
|
103 |
* en las funciones que asignan las bandas a dibujar (addDrawableBands)
|
104 |
*/
|
105 |
private ColorTable[] palette = null; |
106 |
/**
|
107 |
* Extensi?n de los datos del buffer
|
108 |
*/
|
109 |
protected Extent dataExtent = null; |
110 |
/**
|
111 |
* Ancho y alto en pixeles del ?ltimo buffer asignado
|
112 |
*/
|
113 |
protected double nWidth = 0; |
114 |
protected double nHeight = 0; |
115 |
protected double[] step = null; |
116 |
private Buffer lastBuffer = null; |
117 |
|
118 |
private DataManager dataManager = null; |
119 |
protected DataStoreParameters parameters = null; |
120 |
private DelegatedDynObject metadata = null; |
121 |
private RasterUtils util = null; |
122 |
private DelegateWeakReferencingObservable
|
123 |
delegateObservable = new DelegateWeakReferencingObservable(this); |
124 |
private Render render = null; |
125 |
/**
|
126 |
* Flag que fuerza al buffer de solo lectura
|
127 |
*/
|
128 |
protected boolean readOnly = false; |
129 |
protected ICoordTrans coordTrans = null; |
130 |
|
131 |
public AbstractRasterDataStore() {
|
132 |
util = RasterLocator.getManager().getRasterUtils(); |
133 |
} |
134 |
|
135 |
/*
|
136 |
* (non-Javadoc)
|
137 |
* @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#queryBuffer(org.gvsig.fmap.dal.coverage.store.RasterQuery)
|
138 |
*/
|
139 |
public Buffer query(RasterQuery query) throws ProcessInterruptedException, RasterDriverException, InvalidSetViewException { |
140 |
Object[] obj = queryArray(query); |
141 |
if(obj != null && obj.length > 0 && obj[0] instanceof Buffer) |
142 |
return ((Buffer)obj[0]); |
143 |
return null; |
144 |
} |
145 |
|
146 |
|
147 |
/*
|
148 |
* (non-Javadoc)
|
149 |
* @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#query(org.gvsig.fmap.dal.coverage.store.RasterQuery)
|
150 |
*/
|
151 |
public Object[] queryArray(RasterQuery query) |
152 |
throws ProcessInterruptedException, RasterDriverException,
|
153 |
InvalidSetViewException { |
154 |
Object[] result = null; |
155 |
currentQuery = (DefaultRasterQuery)query; |
156 |
DefaultRasterQuery q = currentQuery; |
157 |
|
158 |
if(q.getDrawableBands() != null) |
159 |
setQueryDrawableBands(q.getDrawableBands()); |
160 |
else
|
161 |
setQueryAllDrawableBands(); |
162 |
|
163 |
setMemoryBuffer(q.isMemoryBuffer()); |
164 |
readOnly = q.isReadOnly(); |
165 |
Buffer buf = null; |
166 |
|
167 |
//*****************************************
|
168 |
//All data
|
169 |
//*****************************************
|
170 |
if(q.getType() == DefaultRasterQuery.TYPE_ENTIRE) {
|
171 |
step = null;
|
172 |
dataExtent = getExtent(); |
173 |
q.setAreaOfInterest(0, 0, (int)getWidth(), (int)getHeight(), -1, -1); |
174 |
q.setAreaOfInterest(); //Vuelve a poner el tipo correcto
|
175 |
buf = getWindowPx(q); |
176 |
buf.setDataExtent( |
177 |
new Rectangle2D.Double(dataExtent.getULX(), dataExtent.getULY() - (dataExtent.getMax().getY() - dataExtent.getMin().getY()), |
178 |
dataExtent.getMax().getX() - dataExtent.getMin().getX(), |
179 |
dataExtent.getMax().getY() - dataExtent.getMin().getY())); |
180 |
} |
181 |
|
182 |
//*****************************************
|
183 |
//Real coordinates without resampling
|
184 |
//*****************************************
|
185 |
if(q.getType() == DefaultRasterQuery.TYPE_COORDS) {
|
186 |
buf = setAreaOfInterestInWC(q); |
187 |
buf.setDataExtent(new Rectangle2D.Double(q.getX(), q.getY(), q.getW(), q.getH())); |
188 |
} |
189 |
|
190 |
//*****************************************
|
191 |
//Real coordinates with resampling
|
192 |
//*****************************************
|
193 |
if(q.getType() == DefaultRasterQuery.TYPE_COORDS_SIZE) {
|
194 |
buf = setAreaOfInterestInWC(q); |
195 |
buf.setDataExtent(new Rectangle2D.Double(q.getBBox().getULX(), q.getBBox().getULY(), |
196 |
q.getBBox().getLRX() - q.getBBox().getULX(), q.getBBox().getLRY() - q.getBBox().getULY())); |
197 |
} |
198 |
|
199 |
//*****************************************
|
200 |
//Tiled
|
201 |
//*****************************************
|
202 |
if(q.getType() == DefaultRasterQuery.TYPE_COORDS_SIZE_TILED) {
|
203 |
step = null;
|
204 |
dataExtent = new ExtentImpl(q.getBBox().getULX(), q.getBBox().getULY(),
|
205 |
q.getBBox().getLRX(), q.getBBox().getLRY()); |
206 |
((RasterDataParameters)getParameters()).setAlphaBand(currentQuery.getAlphaBandNumber()); |
207 |
getWindowTiled(q); |
208 |
} |
209 |
|
210 |
//*****************************************
|
211 |
//Pixel coordinates with and without resampling
|
212 |
//*****************************************
|
213 |
if(q.getType() == DefaultRasterQuery.TYPE_PX || q.getType() == DefaultRasterQuery.TYPE_PX_SIZE) {
|
214 |
buf = getWindowPx(q); |
215 |
} |
216 |
|
217 |
result = new Object[]{buf}; |
218 |
|
219 |
//*****************************************
|
220 |
//Request only one tile
|
221 |
//*****************************************
|
222 |
if(q.getType() == DefaultRasterQuery.TYPE_ONE_TILE) {
|
223 |
if(isTiled()) {
|
224 |
try {
|
225 |
Tile t = getTile(q); |
226 |
result = t.getData(); |
227 |
} catch (TileGettingException e) {
|
228 |
throw new RasterDriverException("Problems getting the tile", e); |
229 |
} |
230 |
} else {
|
231 |
buf = setAreaOfInterestInWC(q); |
232 |
buf.setDataExtent(new Rectangle2D.Double(q.getBBox().getULX(), q.getBBox().getULY(), |
233 |
q.getBBox().getLRX() - q.getBBox().getULX(), q.getBBox().getLRY() - q.getBBox().getULY())); |
234 |
result = new Object[]{buf}; |
235 |
} |
236 |
} |
237 |
|
238 |
if(q.isStoredLastBuffer())
|
239 |
lastBuffer = buf; |
240 |
else
|
241 |
lastBuffer = null;
|
242 |
q.storeLastBuffer(false);
|
243 |
|
244 |
if(result != null && result.length > 0 && result[0] instanceof Buffer) { |
245 |
((Buffer)result[0]).setStore(this); |
246 |
if(getNoDataValue() != null && getNoDataValue().isDefined()) |
247 |
((Buffer)result[0]).setNoDataValue(getNoDataValue()); |
248 |
return result;
|
249 |
} |
250 |
return null; |
251 |
} |
252 |
|
253 |
/**
|
254 |
* Gets a resampled window of data using world coordinates and buffer size.
|
255 |
* @param q
|
256 |
* @return
|
257 |
*/
|
258 |
public abstract Buffer getWindowWithResampling(DefaultRasterQuery q) throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException ; |
259 |
|
260 |
/**
|
261 |
* Gets a resampled window of data using world. The buffer size variable will be ignored and the final size will
|
262 |
* be calculated using the pixel size.
|
263 |
* @param q
|
264 |
* @return
|
265 |
*/
|
266 |
public abstract Buffer getWindowWithoutResampling(DefaultRasterQuery q) throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException ; |
267 |
|
268 |
/**
|
269 |
* Asigna el ?rea de interes en coordenadas del mundo real. Si las coordenadas exceden del tama?o de la imagen
|
270 |
* estas coordenadas son ajustadas el extent.
|
271 |
* @param x Coordenada X, esquina superior izquierda
|
272 |
* @param y Coordenada Y, esquina superior izquierda
|
273 |
* @param w Ancho del ?rea
|
274 |
* @param h Alto del ?rea
|
275 |
* @throws ArrayIndexOutOfBoundsException
|
276 |
* @throws InvalidSetViewException
|
277 |
*/
|
278 |
protected Buffer setAreaOfInterestInWC(DefaultRasterQuery q) |
279 |
throws RasterDriverException, InvalidSetViewException, ProcessInterruptedException {
|
280 |
if(q.getType() == DefaultRasterQuery.TYPE_COORDS) {
|
281 |
step = null;
|
282 |
dataExtent = new ExtentImpl(q.getX(), q.getY(), q.getX() + q.getW(), q.getY() - q.getH());
|
283 |
Extent adjustedDataExtent = util.calculateAdjustedView(dataExtent, getAffineTransform(), getWidth(), getHeight()); |
284 |
q.setAreaOfInterest(adjustedDataExtent.getMin().getX(), adjustedDataExtent.getMax().getY(), adjustedDataExtent.width(), adjustedDataExtent.height()); |
285 |
q.setAdjustToExtent(currentQuery.isAdjustToExtent()); |
286 |
return getWindowWithoutResampling(q);
|
287 |
} |
288 |
|
289 |
if( q.getType() == DefaultRasterQuery.TYPE_COORDS_SIZE ||
|
290 |
q.getType() == DefaultRasterQuery.TYPE_ONE_TILE) { |
291 |
step = null;
|
292 |
dataExtent = q.getBBox();//new ExtentImpl(q.getBBox().getULX(), q.getBBox().getULY(), q.getBBox().getLRX(), q.getBBox().getLRY());
|
293 |
Extent adjustedDataExtent = util.calculateAdjustedView(dataExtent, getAffineTransform(), getWidth(), getHeight()); |
294 |
|
295 |
//Caso 3D: La petici?n no se ajusta al ?rea y se rellena el exterior con NoData
|
296 |
if(!currentQuery.isAdjustToExtent() && !util.isInside(dataExtent, getExtent())) {
|
297 |
return requestFillingWithNoData(dataExtent, adjustedDataExtent, q.getBufWidth(), q.getBufHeight());
|
298 |
} |
299 |
|
300 |
q.setBBox(adjustedDataExtent); |
301 |
|
302 |
//Esta secci?n es para que no supersamplee el driver y pueda hacerse en el cliente
|
303 |
if(!currentQuery.isSupersamplingLoadingBuffer()) {
|
304 |
Point2D p1 = worldToRaster(new Point2D.Double(adjustedDataExtent.getULX(), adjustedDataExtent.getULY())); |
305 |
Point2D p2 = worldToRaster(new Point2D.Double(adjustedDataExtent.getLRX(), adjustedDataExtent.getLRY())); |
306 |
nWidth = Math.abs(p1.getX() - p2.getX());
|
307 |
nHeight = Math.abs(p1.getY() - p2.getY());
|
308 |
|
309 |
if(q.getBufWidth() > Math.ceil(nWidth) && q.getBufHeight() > Math.ceil(nHeight)) { |
310 |
step = calcSteps(adjustedDataExtent.getULX(), adjustedDataExtent.getULY(), adjustedDataExtent.getLRX(), adjustedDataExtent.getLRY(), nWidth, nHeight, q.getBufWidth(), q.getBufHeight()); |
311 |
q.setBufWidth(-1);
|
312 |
q.setBufHeight(-1);
|
313 |
return getWindowWC(q);
|
314 |
} |
315 |
} |
316 |
q.setAdjustToExtent(true);
|
317 |
return getWindowWithResampling(q);
|
318 |
} |
319 |
return null; |
320 |
} |
321 |
|
322 |
/*
|
323 |
* (non-Javadoc)
|
324 |
* @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getAdjustedToExtent(org.gvsig.fmap.dal.coverage.datastruct.Extent)
|
325 |
*/
|
326 |
public Extent adjustToExtent(Extent e) {
|
327 |
Extent currentExtent = this.getExtent();
|
328 |
|
329 |
double minx = e.getMin().getX() < currentExtent.getMin().getX() ? currentExtent.getMin().getX() : e.getMin().getX();
|
330 |
double maxx = e.getMax().getX() > currentExtent.getMax().getX() ? currentExtent.getMax().getX() : e.getMax().getX();
|
331 |
double miny = e.getMin().getY() < currentExtent.getMin().getY() ? currentExtent.getMin().getY() : e.getMin().getY();
|
332 |
double maxy = e.getMax().getY() > currentExtent.getMax().getY() ? currentExtent.getMax().getY() : e.getMax().getY();
|
333 |
|
334 |
return new ExtentImpl(minx, maxy, maxx, miny); |
335 |
} |
336 |
|
337 |
public String getFullName() { |
338 |
return getName();
|
339 |
} |
340 |
|
341 |
/*
|
342 |
* (non-Javadoc)
|
343 |
* @see org.gvsig.fmap.dal.coverage.buffer.RasterDataSource#getLastBuffer()
|
344 |
*/
|
345 |
public Buffer getLastBuffer() { |
346 |
return lastBuffer;
|
347 |
} |
348 |
|
349 |
/*
|
350 |
* (non-Javadoc)
|
351 |
* @see org.gvsig.fmap.dal.coverage.buffer.RasterDataSource#getStep()
|
352 |
*/
|
353 |
public double[] getStep() { |
354 |
return step;
|
355 |
} |
356 |
|
357 |
/**
|
358 |
* Para este GeoRasterFile asigna que bandas se pintaran
|
359 |
* sobre el RasterBuf cuando se haga un update. Cada posici?n del vector es una banda
|
360 |
* del rasterBuf y el contenido de esa posici?n es la banda de la imagen que se dibujar?
|
361 |
* sobre ese RasterBuf.
|
362 |
* @param drawableBands Array con las bandas a dibujar.
|
363 |
* @return array con tantos elementos como bandas a dibujar. El valor contenido es el fichero del
|
364 |
* dataset multifichero al que corresponde la banda.
|
365 |
*/
|
366 |
private void setQueryDrawableBands(int[] drawableBands) { |
367 |
//clearDrawableBands();
|
368 |
setDrawableBands(drawableBands); |
369 |
|
370 |
int[] files = new int[drawableBands.length]; |
371 |
palette = new ColorTable[drawableBands.length];
|
372 |
|
373 |
for(int i = 0; i< drawableBands.length; i++) { |
374 |
if(drawableBands[i] < 0 || drawableBands[i] >= getBandCount()) |
375 |
continue;
|
376 |
//addDrawableBand(i, drawableBands[i]);
|
377 |
String fileName = getBands().getBand(drawableBands[i]).getFileName();
|
378 |
files[i] = getBands().getFileNumber(fileName); |
379 |
palette[i] = getColorTable(fileName); |
380 |
} |
381 |
} |
382 |
|
383 |
/**
|
384 |
* Para este GeoRasterFile asigna que bandas se pintaran
|
385 |
* sobre el RasterBuf cuando se haga un update. Cada posici?n del vector es una banda
|
386 |
* del rasterBuf y el contenido de esa posici?n es la banda de la imagen que se dibujar?
|
387 |
* sobre ese RasterBuf. Esta llamada asigna todas las bandas dibujables en su orden natural.
|
388 |
* @return array con tantos elementos como bandas a dibujar. El valor contenido es el fichero del
|
389 |
* dataset multifichero al que corresponde la banda.
|
390 |
*/
|
391 |
public int[] setQueryAllDrawableBands() { |
392 |
clearDrawableBands(); |
393 |
|
394 |
int[] list = new int[getBandCount()]; |
395 |
for(int i = 0; i< getBandCount(); i++) |
396 |
list[i] = i; |
397 |
setDrawableBands(list); |
398 |
|
399 |
int[] files = new int[getBandCount()]; |
400 |
palette = new ColorTable[getBandCount()];
|
401 |
|
402 |
for(int i = 0; i< getBandCount(); i++) { |
403 |
addDrawableBand(i, i); |
404 |
String fileName = getBands().getBand(i).getFileName();
|
405 |
files[i] = getBands().getFileNumber(fileName); |
406 |
palette[i] = getColorTable(fileName); |
407 |
} |
408 |
return files;
|
409 |
} |
410 |
|
411 |
/**
|
412 |
* M?todo que crea un buffer con la extensi?n que se ha pedido completa y sin ajustar
|
413 |
* a la extensi?n del raster. La zona que tenga informaci?n del raster se rellenara con
|
414 |
* esta y la que quede vacia se rellenar? con valores NoData. El ancho y alto del buffer corresponden
|
415 |
* a toda la zona solicitada, tanto la que cae dentro como la rellena con Nodata
|
416 |
*
|
417 |
* @param rasterBuf Buffer de salida.
|
418 |
* @throws InvalidSetViewException
|
419 |
*/
|
420 |
private Buffer requestFillingWithNoData(Extent requestExtent, Extent fitExtent, int bufWidth, int bufHeight) |
421 |
throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
|
422 |
double error = 0.01; |
423 |
//Upper Left
|
424 |
double distWcX = Math.abs(fitExtent.getMin().getX() - dataExtent.getMin().getX()); |
425 |
distWcX = (distWcX > error) ? distWcX : 0;
|
426 |
double distWcY = Math.abs(fitExtent.getMax().getY() - dataExtent.getMax().getY()); |
427 |
distWcY = (distWcY > error) ? distWcY : 0;
|
428 |
//Pixel inicial del buffer donde se empieza a dibujar. Redondeamos por arriba pq lo que sobra se pone NoData
|
429 |
double initPxX = Math.ceil((distWcX * bufWidth) / requestExtent.width()); |
430 |
double initPxY = Math.ceil((distWcY * bufHeight) / requestExtent.height()); |
431 |
|
432 |
//Lower Right
|
433 |
distWcX = Math.abs(fitExtent.getMax().getX() - dataExtent.getMin().getX());
|
434 |
distWcX = (distWcX > error) ? distWcX : 0;
|
435 |
distWcY = Math.abs(fitExtent.getMin().getY() - dataExtent.getMax().getY());
|
436 |
distWcY = (distWcY > error) ? distWcY : 0;
|
437 |
//Pixel final del buffer donde se dibuja. Redondeamos por abajo pq lo que sobra se pone NoData
|
438 |
double endPxX = Math.floor((distWcX * bufWidth) / requestExtent.width()); |
439 |
double endPxY = Math.floor((distWcY * bufHeight) / requestExtent.height()); |
440 |
|
441 |
int copyX = (int)Math.abs(endPxX - initPxX); |
442 |
int copyY = (int)Math.abs(endPxY - initPxY); |
443 |
|
444 |
DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery(); |
445 |
q.setBBox(fitExtent); |
446 |
q.setBufWidth(copyX); |
447 |
q.setBufHeight(copyY); |
448 |
q.setAdjustToExtent(true);
|
449 |
Buffer rasterBuf = getWindowWithResampling(q);
|
450 |
|
451 |
Buffer buf = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], bufWidth, bufHeight, rasterBuf.getBandCount(), true); |
452 |
buf.setNoDataValue(currentQuery.getNoDataValueToFill()); |
453 |
for(int i = 0; i < buf.getBandCount(); i++) { |
454 |
switch(buf.getDataType()) {
|
455 |
case Buffer.TYPE_BYTE:buf.assign(i, |
456 |
buf.getNoDataValue().isDefined() ? buf.getNoDataValue().getValue().byteValue() : RasterLibrary.defaultByteNoDataValue); |
457 |
break;
|
458 |
case Buffer.TYPE_SHORT:buf.assign(i, |
459 |
buf.getNoDataValue().isDefined() ? buf.getNoDataValue().getValue().shortValue() : RasterLibrary.defaultShortNoDataValue); |
460 |
break;
|
461 |
case Buffer.TYPE_INT:buf.assign(i, |
462 |
buf.getNoDataValue().isDefined() ? buf.getNoDataValue().getValue().intValue() : RasterLibrary.defaultIntegerNoDataValue); |
463 |
break;
|
464 |
case Buffer.TYPE_FLOAT:buf.assign(i, |
465 |
buf.getNoDataValue().isDefined() ? buf.getNoDataValue().getValue().floatValue() : RasterLibrary.defaultFloatNoDataValue); |
466 |
break;
|
467 |
case Buffer.TYPE_DOUBLE:buf.assign(i, |
468 |
buf.getNoDataValue().isDefined() ? buf.getNoDataValue().getValue().doubleValue() : RasterLibrary.defaultDoubleNoDataValue); |
469 |
break;
|
470 |
} |
471 |
} |
472 |
|
473 |
switch(rasterBuf.getDataType()) {
|
474 |
case Buffer.TYPE_BYTE: |
475 |
for (int iBand = 0; iBand < rasterBuf.getBandCount(); iBand++) |
476 |
for (int row = 0; row < copyY; row++) |
477 |
for (int col = 0; col < copyX; col++) |
478 |
buf.setElem((int)(row + initPxY), (int)(col + initPxX), |
479 |
iBand, |
480 |
rasterBuf.getElemByte(row, col, iBand)); |
481 |
break;
|
482 |
case Buffer.TYPE_SHORT: |
483 |
case Buffer.TYPE_USHORT: |
484 |
for (int iBand = 0; iBand < rasterBuf.getBandCount(); iBand++) |
485 |
for (int row = 0; row < copyY; row++) |
486 |
for (int col = 0; col < copyX; col++) |
487 |
buf.setElem((int)(row + initPxY), (int)(col + initPxX), |
488 |
iBand, |
489 |
rasterBuf.getElemShort(row, col, iBand)); |
490 |
break;
|
491 |
case Buffer.TYPE_INT: |
492 |
for (int iBand = 0; iBand < rasterBuf.getBandCount(); iBand++) |
493 |
for (int row = 0; row < copyY; row++) |
494 |
for (int col = 0; col < copyX; col++) |
495 |
buf.setElem((int)(row + initPxY), (int)(col + initPxX), |
496 |
iBand, |
497 |
rasterBuf.getElemInt(row, col, iBand)); |
498 |
break;
|
499 |
case Buffer.TYPE_FLOAT: |
500 |
for (int iBand = 0; iBand < rasterBuf.getBandCount(); iBand++) |
501 |
for (int row = 0; row < copyY; row++) |
502 |
for (int col = 0; col < copyX; col++) |
503 |
buf.setElem((int)(row + initPxY), (int)(col + initPxX), |
504 |
iBand, |
505 |
rasterBuf.getElemFloat(row, col, iBand)); |
506 |
break;
|
507 |
case Buffer.TYPE_DOUBLE: |
508 |
for (int iBand = 0; iBand < rasterBuf.getBandCount(); iBand++) |
509 |
for (int row = 0; row < copyY; row++) |
510 |
for (int col = 0; col < copyX; col++) |
511 |
buf.setElem((int)(row + initPxY), (int)(col + initPxX), |
512 |
iBand, |
513 |
rasterBuf.getElemDouble(row, col, iBand)); |
514 |
break;
|
515 |
} |
516 |
return buf;
|
517 |
} |
518 |
|
519 |
public TimeSeries getTimeSerials() throws RmfSerializerException { |
520 |
if(getProvider() instanceof RasterProvider) |
521 |
return ((RasterProvider)getProvider()).getTimeSerials();
|
522 |
return null; |
523 |
} |
524 |
|
525 |
public void setTimeSerials(TimeSeries serialInfo) throws RmfSerializerException { |
526 |
if(getProvider() instanceof RasterProvider) |
527 |
((RasterProvider)getProvider()).setTimeSerials(serialInfo); |
528 |
} |
529 |
|
530 |
public abstract void saveColorTableToRmf(ColorTable table) throws RmfSerializerException; |
531 |
|
532 |
public abstract void saveGeoPointListToRmf(GeoPointList pointList) throws RmfSerializerException; |
533 |
|
534 |
public abstract void saveROIFileListToRmf(List<File> fileList) throws RmfSerializerException; |
535 |
|
536 |
/**
|
537 |
* Saves information about serials
|
538 |
* @param object to save
|
539 |
* @throws RmfSerializerException
|
540 |
*/
|
541 |
public abstract void saveSerialInfoToRmf(TimeSeries serialInfo) throws RmfSerializerException; |
542 |
|
543 |
/**
|
544 |
* Loads information about serials
|
545 |
* @param object to load
|
546 |
* @throws RmfSerializerException
|
547 |
*/
|
548 |
public abstract boolean loadSerialInfoFromRmf(TimeSeries serialInfo); |
549 |
|
550 |
/*
|
551 |
* (non-Javadoc)
|
552 |
* @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#createVectorizeObject(org.gvsig.fmap.dal.coverage.store.RasterDataStore)
|
553 |
*/
|
554 |
public Vectorization createVectorizeObject() throws RasterDriverException, ProcessInterruptedException { |
555 |
return new PotraceVectorization((RasterDataStore)this); |
556 |
} |
557 |
|
558 |
/*
|
559 |
* (non-Javadoc)
|
560 |
* @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getRender()
|
561 |
*/
|
562 |
public Render getRender() {
|
563 |
if(render == null) |
564 |
render = new DefaultRender(this); |
565 |
return render;
|
566 |
} |
567 |
|
568 |
/*
|
569 |
* (non-Javadoc)
|
570 |
* @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getRender()
|
571 |
*/
|
572 |
public void setRender(Render render) { |
573 |
this.render = render;
|
574 |
} |
575 |
|
576 |
|
577 |
/*
|
578 |
* (non-Javadoc)
|
579 |
* @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isFileSupported(java.lang.String)
|
580 |
*/
|
581 |
public boolean isFileSupported(String fName) { |
582 |
return RasterLocator.getManager().getProviderServices().isExtensionSupported(fName);
|
583 |
} |
584 |
|
585 |
/**
|
586 |
* Registers metadata definition
|
587 |
* @throws MetadataException
|
588 |
*/
|
589 |
public static void registerMetadataDefinition() throws MetadataException { |
590 |
MetadataManager manager = MetadataLocator.getMetadataManager(); |
591 |
|
592 |
if(manager == null) |
593 |
return;
|
594 |
|
595 |
if( manager.getDefinition(METADATA_DEFINITION_NAME) == null ) { |
596 |
DynStruct defnition = manager.addDefinition( |
597 |
METADATA_DEFINITION_NAME, |
598 |
METADATA_DEFINITION_NAME |
599 |
); |
600 |
defnition.extend( |
601 |
MetadataManager.METADATA_NAMESPACE, |
602 |
DataStore.METADATA_DEFINITION_NAME |
603 |
); |
604 |
} |
605 |
} |
606 |
|
607 |
/*
|
608 |
* (non-Javadoc)
|
609 |
* @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getSourceType()
|
610 |
*/
|
611 |
public int getSourceType() { |
612 |
return ((RasterProvider)getProvider()).getSourceType();
|
613 |
} |
614 |
|
615 |
//****************************************************
|
616 |
//****Implementing DataStoreImplementation methods****
|
617 |
//****************************************************
|
618 |
|
619 |
/*
|
620 |
* (non-Javadoc)
|
621 |
* @see org.gvsig.fmap.dal.impl.DataStoreImplementation#intializePhase1(org.gvsig.fmap.dal.impl.DefaultDataManager, org.gvsig.fmap.dal.DataStoreParameters)
|
622 |
*/
|
623 |
public void intializePhase1(DataManager dataManager, |
624 |
DataStoreParameters parameters) throws InitializeException {
|
625 |
DynObjectManager dynManager = ToolsLocator.getDynObjectManager(); |
626 |
|
627 |
this.metadata = (DelegatedDynObject) dynManager
|
628 |
.createDynObject( |
629 |
MetadataLocator.getMetadataManager().getDefinition(DataStore.SPATIAL_METADATA_DEFINITION_NAME) |
630 |
); |
631 |
this.dataManager = dataManager;
|
632 |
this.parameters = parameters;
|
633 |
|
634 |
} |
635 |
|
636 |
/*
|
637 |
* (non-Javadoc)
|
638 |
* @see org.gvsig.fmap.dal.impl.DataStoreImplementation#intializePhase2(org.gvsig.fmap.dal.spi.DataStoreProvider)
|
639 |
*/
|
640 |
public void intializePhase2(DataStoreProvider provider) |
641 |
throws InitializeException {
|
642 |
} |
643 |
|
644 |
/* (non-Javadoc)
|
645 |
* @see org.gvsig.fmap.dal.raster.spi.CoverageStoreProviderServices#getManager()
|
646 |
*/
|
647 |
public DataManager getManager() {
|
648 |
return this.dataManager; |
649 |
} |
650 |
|
651 |
//****************************************************
|
652 |
//*********Implementing DataStore methods*************
|
653 |
//****************************************************
|
654 |
|
655 |
/*
|
656 |
* (non-Javadoc)
|
657 |
* @see org.gvsig.fmap.dal.DataStore#getProviderName()
|
658 |
*/
|
659 |
public String getProviderName() { |
660 |
return getProvider().getFullName();
|
661 |
} |
662 |
|
663 |
/*
|
664 |
* (non-Javadoc)
|
665 |
* @see org.gvsig.fmap.dal.DataStore#refresh()
|
666 |
*/
|
667 |
public void refresh() throws DataException { |
668 |
return;
|
669 |
} |
670 |
|
671 |
/*
|
672 |
* (non-Javadoc)
|
673 |
* @see org.gvsig.fmap.dal.DataStore#getDataSet()
|
674 |
*/
|
675 |
public DataSet getDataSet() throws DataException { |
676 |
RasterQuery query = DefaultRasterManager.getInstance().createQuery(); |
677 |
query.setSupersamplingLoadingBuffer(false);
|
678 |
query.setAreaOfInterest(); |
679 |
int[] bands = new int[getBandCount()]; |
680 |
for (int i = 0; i < bands.length; i++) { |
681 |
bands[i] = i; |
682 |
} |
683 |
query.setDrawableBands(bands); |
684 |
return getDataSet(query);
|
685 |
} |
686 |
|
687 |
/*
|
688 |
* (non-Javadoc)
|
689 |
* @see org.gvsig.fmap.dal.DataStore#getDataSet(org.gvsig.fmap.dal.DataQuery)
|
690 |
*/
|
691 |
public DataSet getDataSet(DataQuery dataQuery) throws DataException { |
692 |
if(dataQuery instanceof RasterQuery) { |
693 |
Object[] obj = null; |
694 |
try {
|
695 |
obj = queryArray((RasterQuery)dataQuery); |
696 |
} catch (ProcessInterruptedException e) {
|
697 |
} catch (InvalidSetViewException e) {
|
698 |
throw new RasterDriverException("", e); |
699 |
} |
700 |
if(obj != null && obj.length > 0 && obj[0] instanceof Buffer) |
701 |
return (Buffer)obj[0]; |
702 |
} |
703 |
return null; |
704 |
} |
705 |
|
706 |
/*
|
707 |
* (non-Javadoc)
|
708 |
* @see org.gvsig.fmap.dal.DataStore#accept(org.gvsig.tools.visitor.Visitor, org.gvsig.fmap.dal.DataQuery)
|
709 |
*/
|
710 |
public void accept(Visitor visitor, DataQuery dataQuery) |
711 |
throws BaseException {
|
712 |
} |
713 |
|
714 |
/*
|
715 |
* (non-Javadoc)
|
716 |
* @see org.gvsig.fmap.dal.DataStore#getDataSet(org.gvsig.tools.observer.Observer)
|
717 |
*/
|
718 |
public void getDataSet(org.gvsig.tools.observer.Observer observer) throws DataException { |
719 |
RasterQuery query = DefaultRasterManager.getInstance().createQuery(); |
720 |
query.setSupersamplingLoadingBuffer(false);
|
721 |
query.setAreaOfInterest(); |
722 |
int[] bands = new int[getBandCount()]; |
723 |
for (int i = 0; i < bands.length; i++) { |
724 |
bands[i] = i; |
725 |
} |
726 |
query.setDrawableBands(bands); |
727 |
getDataSet(query, observer); |
728 |
} |
729 |
|
730 |
/*
|
731 |
* (non-Javadoc)
|
732 |
* @see org.gvsig.fmap.dal.DataStore#getDataSet(org.gvsig.fmap.dal.DataQuery, org.gvsig.tools.observer.Observer)
|
733 |
*/
|
734 |
public void getDataSet(DataQuery dataQuery, org.gvsig.tools.observer.Observer observer) throws DataException { |
735 |
if(dataQuery instanceof RasterQuery) { |
736 |
Object[] obj = null; |
737 |
try {
|
738 |
obj = queryArray((RasterQuery)dataQuery); |
739 |
} catch (ProcessInterruptedException e) {
|
740 |
} catch (InvalidSetViewException e) {
|
741 |
throw new RasterDriverException("", e); |
742 |
} |
743 |
if(obj != null && obj.length > 0 && obj[0] instanceof Buffer) |
744 |
observer.update(this, obj[0]); |
745 |
} |
746 |
} |
747 |
|
748 |
/*
|
749 |
* (non-Javadoc)
|
750 |
* @see org.gvsig.fmap.dal.DataStore#getSelection()
|
751 |
*/
|
752 |
public DataSet getSelection() throws DataException { |
753 |
return null; |
754 |
} |
755 |
|
756 |
/*
|
757 |
* (non-Javadoc)
|
758 |
* @see org.gvsig.fmap.dal.DataStore#setSelection(org.gvsig.fmap.dal.DataSet)
|
759 |
*/
|
760 |
public void setSelection(DataSet selection) throws DataException { |
761 |
} |
762 |
|
763 |
/*
|
764 |
* (non-Javadoc)
|
765 |
* @see org.gvsig.fmap.dal.DataStore#createSelection()
|
766 |
*/
|
767 |
public DataSet createSelection() throws DataException { |
768 |
return null; |
769 |
} |
770 |
|
771 |
/*
|
772 |
* (non-Javadoc)
|
773 |
* @see org.gvsig.fmap.dal.DataStore#getChildren()
|
774 |
*/
|
775 |
@SuppressWarnings("unchecked") |
776 |
public Iterator getChildren() { |
777 |
return null; |
778 |
} |
779 |
|
780 |
/*
|
781 |
* (non-Javadoc)
|
782 |
* @see org.gvsig.fmap.dal.DataStore#getExplorer()
|
783 |
*/
|
784 |
public DataServerExplorer getExplorer() throws DataException, ValidateDataParametersException { |
785 |
return null; |
786 |
} |
787 |
|
788 |
/*
|
789 |
* (non-Javadoc)
|
790 |
* @see org.gvsig.fmap.dal.DataStore#createQuery()
|
791 |
*/
|
792 |
public DataQuery createQuery() {
|
793 |
return new DefaultRasterQuery(); |
794 |
} |
795 |
|
796 |
//****************************************************
|
797 |
//*********Implementing Metadata methods*************
|
798 |
//****************************************************
|
799 |
|
800 |
/*
|
801 |
* (non-Javadoc)
|
802 |
* @see org.gvsig.metadata.Metadata#getMetadataID()
|
803 |
*/
|
804 |
public Object getMetadataID() { |
805 |
if(parameters != null && parameters instanceof RasterFileStoreParameters) |
806 |
return ((RasterFileStoreParameters)parameters).getFile();
|
807 |
if(parameters != null && parameters instanceof RasterDataParameters) |
808 |
return ((RasterDataParameters)parameters).getURI();
|
809 |
return null; |
810 |
} |
811 |
|
812 |
/*
|
813 |
* (non-Javadoc)
|
814 |
* @see org.gvsig.metadata.Metadata#getMetadataChildren()
|
815 |
*/
|
816 |
@SuppressWarnings("unchecked") |
817 |
public Set getMetadataChildren() { |
818 |
return null; |
819 |
} |
820 |
|
821 |
//****************************************************
|
822 |
//*********Implementing Disposable methods************
|
823 |
//****************************************************
|
824 |
|
825 |
/*
|
826 |
* (non-Javadoc)
|
827 |
* @see org.gvsig.tools.dispose.impl.AbstractDisposable#doDispose()
|
828 |
*/
|
829 |
public void doDispose() { |
830 |
|
831 |
} |
832 |
|
833 |
//****************************************************
|
834 |
//*********Implementing Visitable methods*************
|
835 |
//****************************************************
|
836 |
|
837 |
/*
|
838 |
* (non-Javadoc)
|
839 |
* @see org.gvsig.tools.visitor.Visitable#accept(org.gvsig.tools.visitor.Visitor)
|
840 |
*/
|
841 |
public void accept(Visitor visitor) throws BaseException { |
842 |
|
843 |
} |
844 |
|
845 |
//****************************************************
|
846 |
//****Implementing ComplexObservable methods**********
|
847 |
//****************************************************
|
848 |
|
849 |
/*
|
850 |
* (non-Javadoc)
|
851 |
* @see org.gvsig.tools.observer.ComplexObservable#disableNotifications()
|
852 |
*/
|
853 |
public void disableNotifications() { |
854 |
|
855 |
} |
856 |
|
857 |
/*
|
858 |
* (non-Javadoc)
|
859 |
* @see org.gvsig.tools.observer.ComplexObservable#enableNotifications()
|
860 |
*/
|
861 |
public void enableNotifications() { |
862 |
|
863 |
} |
864 |
|
865 |
/*
|
866 |
* (non-Javadoc)
|
867 |
* @see org.gvsig.tools.observer.ComplexObservable#beginComplexNotification()
|
868 |
*/
|
869 |
public void beginComplexNotification() { |
870 |
|
871 |
} |
872 |
|
873 |
/*
|
874 |
* (non-Javadoc)
|
875 |
* @see org.gvsig.tools.observer.ComplexObservable#endComplexNotification()
|
876 |
*/
|
877 |
public void endComplexNotification() { |
878 |
|
879 |
} |
880 |
|
881 |
//****************************************************
|
882 |
//********Implementing Observable methods*************
|
883 |
//****************************************************
|
884 |
|
885 |
/*
|
886 |
* (non-Javadoc)
|
887 |
* @see org.gvsig.tools.observer.Observable#addObserver(org.gvsig.tools.observer.Observer)
|
888 |
*/
|
889 |
public void addObserver(org.gvsig.tools.observer.Observer o) { |
890 |
|
891 |
} |
892 |
|
893 |
/*
|
894 |
* (non-Javadoc)
|
895 |
* @see org.gvsig.tools.observer.Observable#deleteObserver(org.gvsig.tools.observer.Observer)
|
896 |
*/
|
897 |
public void deleteObserver(org.gvsig.tools.observer.Observer o) { |
898 |
|
899 |
} |
900 |
|
901 |
/*
|
902 |
* (non-Javadoc)
|
903 |
* @see org.gvsig.tools.observer.Observable#deleteObservers()
|
904 |
*/
|
905 |
public void deleteObservers() { |
906 |
|
907 |
} |
908 |
|
909 |
//****************************************************
|
910 |
//********Implementing DynObject methods*************
|
911 |
//****************************************************
|
912 |
|
913 |
/*
|
914 |
* (non-Javadoc)
|
915 |
* @see org.gvsig.tools.dynobject.DynObject#getDynClass()
|
916 |
*/
|
917 |
public DynClass getDynClass() {
|
918 |
return this.metadata.getDynClass(); |
919 |
} |
920 |
|
921 |
/*
|
922 |
* (non-Javadoc)
|
923 |
* @see org.gvsig.tools.dynobject.DynObject#implement(org.gvsig.tools.dynobject.DynClass)
|
924 |
*/
|
925 |
public void implement(DynClass dynClass) { |
926 |
this.metadata.implement(dynClass);
|
927 |
} |
928 |
|
929 |
/*
|
930 |
* (non-Javadoc)
|
931 |
* @see org.gvsig.tools.dynobject.DynObject#delegate(org.gvsig.tools.dynobject.DynObject)
|
932 |
*/
|
933 |
public void delegate(DynObject dynObject) { |
934 |
this.metadata.delegate(dynObject);
|
935 |
} |
936 |
|
937 |
/*
|
938 |
* (non-Javadoc)
|
939 |
* @see org.gvsig.tools.dynobject.DynObject#getDynValue(java.lang.String)
|
940 |
*/
|
941 |
public Object getDynValue(String name) throws DynFieldNotFoundException { |
942 |
return this.metadata.getDynValue(name); |
943 |
} |
944 |
|
945 |
/*
|
946 |
* (non-Javadoc)
|
947 |
* @see org.gvsig.tools.dynobject.DynObject#setDynValue(java.lang.String, java.lang.Object)
|
948 |
*/
|
949 |
public void setDynValue(String name, Object value) throws DynFieldNotFoundException { |
950 |
this.metadata.setDynValue(name, value);
|
951 |
} |
952 |
|
953 |
/*
|
954 |
* (non-Javadoc)
|
955 |
* @see org.gvsig.tools.dynobject.DynObject#hasDynValue(java.lang.String)
|
956 |
*/
|
957 |
public boolean hasDynValue(String name) { |
958 |
return this.metadata.hasDynValue(name); |
959 |
} |
960 |
|
961 |
/*
|
962 |
* (non-Javadoc)
|
963 |
* @see org.gvsig.tools.dynobject.DynObject#invokeDynMethod(java.lang.String, org.gvsig.tools.dynobject.DynObject)
|
964 |
*/
|
965 |
public Object invokeDynMethod(String name, DynObject context) throws DynMethodException { |
966 |
return this.metadata.invokeDynMethod(this, name, context); |
967 |
} |
968 |
|
969 |
/*
|
970 |
* (non-Javadoc)
|
971 |
* @see org.gvsig.tools.dynobject.DynObject#invokeDynMethod(int, org.gvsig.tools.dynobject.DynObject)
|
972 |
*/
|
973 |
public Object invokeDynMethod(int code, DynObject context) throws DynMethodException { |
974 |
return this.metadata.invokeDynMethod(this, code, context); |
975 |
} |
976 |
|
977 |
/*
|
978 |
* (non-Javadoc)
|
979 |
* @see org.gvsig.tools.dynobject.DynObject#clear()
|
980 |
*/
|
981 |
public void clear() { |
982 |
if (metadata != null) { |
983 |
metadata.clear(); |
984 |
} |
985 |
} |
986 |
|
987 |
/*
|
988 |
* (non-Javadoc)
|
989 |
* @see org.gvsig.fmap.dal.DataStore#getParameters()
|
990 |
*/
|
991 |
public DataStoreParameters getParameters() {
|
992 |
return parameters;
|
993 |
} |
994 |
|
995 |
//***********************************************************************
|
996 |
//********Implementing CoverageStoreProviderServices methods*************
|
997 |
//***********************************************************************
|
998 |
|
999 |
public CoverageSelection createDefaultCoverageSelection()
|
1000 |
throws DataException {
|
1001 |
return null; |
1002 |
} |
1003 |
|
1004 |
/*
|
1005 |
* (non-Javadoc)
|
1006 |
* @see org.gvsig.fmap.dal.raster.spi.CoverageStoreProviderServices#getCoverageStore()
|
1007 |
*/
|
1008 |
public CoverageStore getCoverageStore() {
|
1009 |
return this; |
1010 |
} |
1011 |
|
1012 |
/*
|
1013 |
* (non-Javadoc)
|
1014 |
* @see org.gvsig.fmap.dal.raster.spi.CoverageStoreProviderServices#getProvider()
|
1015 |
*/
|
1016 |
public abstract CoverageStoreProvider getProvider(); |
1017 |
|
1018 |
/*
|
1019 |
* (non-Javadoc)
|
1020 |
* @see org.gvsig.fmap.dal.raster.spi.CoverageStoreProviderServices#notifyChange(java.lang.String)
|
1021 |
*/
|
1022 |
public void notifyChange(String notification) { |
1023 |
delegateObservable |
1024 |
.notifyObservers(new DefaultCoverageStoreNotification(
|
1025 |
this, notification));
|
1026 |
} |
1027 |
|
1028 |
/*
|
1029 |
* (non-Javadoc)
|
1030 |
* @see org.gvsig.fmap.dal.raster.spi.CoverageStoreProviderServices#notifyChange(java.lang.String, org.gvsig.fmap.dal.resource.Resource)
|
1031 |
*/
|
1032 |
public void notifyChange(String arg0, Resource arg1) { |
1033 |
/*delegateObservable.notifyObservers(new DefaultFeatureStoreNotification(
|
1034 |
this, FeatureStoreNotification.RESOURCE_CHANGED));*/
|
1035 |
} |
1036 |
|
1037 |
/*
|
1038 |
* (non-Javadoc)
|
1039 |
* @see org.gvsig.fmap.dal.raster.spi.CoverageStoreProviderServices#notifyChange(java.lang.String, org.gvsig.tools.undo.command.Command)
|
1040 |
*/
|
1041 |
public void notifyChange(String notification, Command command) { |
1042 |
delegateObservable |
1043 |
.notifyObservers(new DefaultCoverageStoreNotification(
|
1044 |
this, notification, command));
|
1045 |
} |
1046 |
|
1047 |
/*
|
1048 |
* (non-Javadoc)
|
1049 |
* @see org.gvsig.fmap.dal.spi.DataStoreProviderServices#getStore()
|
1050 |
*/
|
1051 |
public DataStore getStore() {
|
1052 |
return this; |
1053 |
} |
1054 |
|
1055 |
public void setCoordTrans(ICoordTrans t) { |
1056 |
this.coordTrans = t;
|
1057 |
} |
1058 |
|
1059 |
public void close() { |
1060 |
if(lastBuffer != null) { |
1061 |
lastBuffer.dispose(); |
1062 |
} |
1063 |
} |
1064 |
|
1065 |
/*
|
1066 |
* (non-Javadoc)
|
1067 |
* @see java.lang.Object#finalize()
|
1068 |
*/
|
1069 |
protected void finalize() throws Throwable { |
1070 |
currentQuery = null;
|
1071 |
if(palette != null) { |
1072 |
for (int i = 0; i < palette.length; i++) { |
1073 |
palette[i] = null;
|
1074 |
} |
1075 |
palette = null;
|
1076 |
} |
1077 |
dataExtent = null;
|
1078 |
step = null;
|
1079 |
lastBuffer = null;
|
1080 |
dataManager = null;
|
1081 |
parameters = null;
|
1082 |
metadata = null;
|
1083 |
util = null;
|
1084 |
delegateObservable = null;
|
1085 |
render = null;
|
1086 |
super.finalize();
|
1087 |
} |
1088 |
} |