svn-gvsig-desktop / branches / v2_0_0_prep / extensions / org.gvsig.image.extension / src / main / java / org / gvsig / arcims / image / fmap / layers / FRasterLyrArcIMS.java @ 32321
History | View | Annotate | Download (37.8 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 |
|
23 |
/*
|
24 |
* AUTHORS (In addition to CIT):
|
25 |
* 2010 Prodevelop S.L. main development
|
26 |
* http://www.prodevelop.es
|
27 |
*/
|
28 |
|
29 |
package org.gvsig.arcims.image.fmap.layers; |
30 |
|
31 |
import java.awt.Dimension; |
32 |
import java.awt.Graphics2D; |
33 |
import java.awt.Point; |
34 |
import java.awt.Rectangle; |
35 |
import java.awt.event.ActionEvent; |
36 |
import java.awt.event.ActionListener; |
37 |
import java.awt.geom.AffineTransform; |
38 |
import java.awt.geom.NoninvertibleTransformException; |
39 |
import java.awt.geom.Rectangle2D; |
40 |
import java.awt.image.BufferedImage; |
41 |
import java.awt.image.DataBuffer; |
42 |
import java.io.File; |
43 |
import java.io.IOException; |
44 |
import java.net.URL; |
45 |
import java.util.ArrayList; |
46 |
import java.util.HashMap; |
47 |
import java.util.Iterator; |
48 |
import java.util.List; |
49 |
import java.util.Map; |
50 |
import java.util.Vector; |
51 |
|
52 |
import javax.print.attribute.PrintRequestAttributeSet; |
53 |
import javax.swing.ImageIcon; |
54 |
|
55 |
import org.cresques.cts.IProjection; |
56 |
import org.cresques.geo.ViewPortData; |
57 |
import org.cresques.px.Extent; |
58 |
import org.gvsig.andami.PluginServices; |
59 |
import org.gvsig.arcims.image.fmap.drivers.ArcImsImageDriver; |
60 |
import org.gvsig.arcims.image.fmap.listeners.FRasterLyrArcIMSListener; |
61 |
import org.gvsig.fmap.crs.CRSFactory; |
62 |
import org.gvsig.fmap.dal.exception.ReadException; |
63 |
import org.gvsig.fmap.geom.primitive.impl.Envelope2D; |
64 |
import org.gvsig.fmap.mapcontext.ViewPort; |
65 |
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException; |
66 |
import org.gvsig.fmap.mapcontext.layers.FLayer; |
67 |
import org.gvsig.fmap.mapcontext.layers.Tiling; |
68 |
import org.gvsig.fmap.raster.layers.FLyrRasterSE; |
69 |
import org.gvsig.fmap.raster.layers.IRasterLayerActions; |
70 |
import org.gvsig.raster.dataset.CompositeDataset; |
71 |
import org.gvsig.raster.dataset.IBuffer; |
72 |
import org.gvsig.raster.dataset.MosaicNotValidException; |
73 |
import org.gvsig.raster.dataset.MultiRasterDataset; |
74 |
import org.gvsig.raster.grid.Grid; |
75 |
import org.gvsig.raster.grid.GridPalette; |
76 |
import org.gvsig.raster.grid.GridTransparency; |
77 |
import org.gvsig.raster.grid.filter.FilterTypeException; |
78 |
import org.gvsig.raster.grid.filter.RasterFilterList; |
79 |
import org.gvsig.raster.grid.filter.RasterFilterListManager; |
80 |
import org.gvsig.raster.grid.filter.bands.ColorTableFilter; |
81 |
import org.gvsig.raster.grid.filter.bands.ColorTableListManager; |
82 |
import org.gvsig.remoteclient.arcims.ArcImsProtImageHandler; |
83 |
import org.gvsig.remoteclient.arcims.ArcImsProtocolHandler; |
84 |
import org.gvsig.remoteclient.arcims.ArcImsStatus; |
85 |
import org.gvsig.remoteclient.arcims.utils.MyCancellable; |
86 |
import org.gvsig.remoteclient.arcims.utils.ServiceInfoTags; |
87 |
import org.gvsig.remoteclient.arcims.utils.ServiceInformation; |
88 |
import org.gvsig.remoteclient.arcims.utils.ServiceInformationLayer; |
89 |
import org.gvsig.remoteclient.utils.Utilities; |
90 |
import org.gvsig.tools.exception.DriverException; |
91 |
import org.gvsig.tools.task.Cancellable; |
92 |
import org.gvsig.utils.swing.threads.DefaultCancellableMonitorable; |
93 |
import org.slf4j.Logger; |
94 |
import org.slf4j.LoggerFactory; |
95 |
|
96 |
/**
|
97 |
* This class implements an ArcIMS raster layer.
|
98 |
*
|
99 |
* @author jldominguez
|
100 |
*/
|
101 |
public class FRasterLyrArcIMS extends FLyrRasterSE { |
102 |
|
103 |
private static Logger logger = LoggerFactory |
104 |
.getLogger(FRasterLyrArcIMS.class); |
105 |
public static final String SCALE_CHANGED_COMMAND = "SCALE_HAS_CHANGED"; |
106 |
private MyCancellable myCanc;
|
107 |
private URL host; |
108 |
private String service; |
109 |
private String serviceType; |
110 |
private Rectangle2D fullExtent; |
111 |
private boolean firstLoad = false; |
112 |
private ArcImsStatus arcimsStatus = new ArcImsStatus(); |
113 |
private String SRS; |
114 |
private String layerQuery; |
115 |
private ArcImsImageDriver imageDriver;
|
116 |
private VisualStatusArcIms visualStatus = new VisualStatusArcIms(); |
117 |
private int transparency = -1; |
118 |
private boolean arcImsTransparency = true; |
119 |
private String format; |
120 |
|
121 |
private RasterFilterList filterList = null; |
122 |
private GridTransparency gridTransparency = null; |
123 |
private int[] renderBands = null; |
124 |
private FLyrRasterSE layerRaster = null; |
125 |
private ArrayList filterArguments = null; |
126 |
|
127 |
private int posX = 0; |
128 |
private int posY = 0; |
129 |
private double posXWC = 0; |
130 |
private double posYWC = 0; |
131 |
private List<ActionListener> actionListeners = new ArrayList<ActionListener>(); |
132 |
private int maxTileWidth = 1023; |
133 |
private int maxTileHeight = 1023; |
134 |
|
135 |
private Grid grid = null; |
136 |
|
137 |
private boolean nameQueryChange = false; |
138 |
private List<FRasterLyrArcIMSListener> listeners = new ArrayList<FRasterLyrArcIMSListener>(); |
139 |
private boolean tiled = false; |
140 |
private int[] tileSize = new int[2]; |
141 |
private ActionEvent scaleChangedEvent = new ActionEvent(this, |
142 |
ActionEvent.ACTION_PERFORMED, SCALE_CHANGED_COMMAND);
|
143 |
|
144 |
public FRasterLyrArcIMS() {
|
145 |
myCanc = new MyCancellable(new DefaultCancellableMonitorable()); |
146 |
} |
147 |
|
148 |
/**
|
149 |
* The extCatalogYNomenclator needs this creator.
|
150 |
*
|
151 |
* @param p
|
152 |
* a Map object with the following keys:
|
153 |
*
|
154 |
* (key, object type returned) ---------------------------
|
155 |
* "host", String (with or without the servlet path, example:
|
156 |
* "http://www.geographynetwork.com") "service_name", String
|
157 |
* (remote service name) "srs", String (coordinate system)
|
158 |
* "layer_name", String (local layer's name)
|
159 |
*
|
160 |
* @return a FRasterLyrArcIMS layer
|
161 |
*/
|
162 |
public FRasterLyrArcIMS(Map m) throws Exception { |
163 |
myCanc = new MyCancellable(new DefaultCancellableMonitorable()); |
164 |
|
165 |
String _host = ""; |
166 |
|
167 |
try {
|
168 |
_host = (String) m.get("host"); |
169 |
|
170 |
String _service_name = (String) m.get("service_name"); |
171 |
String _srs = (String) m.get("srs"); |
172 |
String _image_format = "JPG"; |
173 |
String _layer_name = (String) m.get("layer_name"); |
174 |
|
175 |
// in case layer_name is missing or equals the empty string:
|
176 |
if ((_layer_name == null) || (_layer_name.length() == 0)) { |
177 |
_layer_name = _service_name; |
178 |
} |
179 |
|
180 |
// ----------------------------
|
181 |
URL _true_host = ArcImsProtocolHandler.getUrlWithServlet(new URL( |
182 |
_host)); |
183 |
IProjection _true_srs = CRSFactory.getCRS(_srs); |
184 |
|
185 |
ArcImsImageDriver _drv = new ArcImsImageDriver(_true_host
|
186 |
.toString(), _service_name, ServiceInfoTags.vIMAGESERVICE); |
187 |
|
188 |
if (!_drv.connect(myCanc)) {
|
189 |
throw new Exception("Unable to connect to host ", |
190 |
new Exception(_host)); |
191 |
} |
192 |
|
193 |
setDriver(_drv); |
194 |
setHost(_true_host); |
195 |
setService(_service_name); |
196 |
setServiceType(ServiceInfoTags.vIMAGESERVICE); |
197 |
setServiceInformationInStatus(_drv.getClient() |
198 |
.getServiceInformation()); |
199 |
|
200 |
ServiceInformation _si = getArcimsStatus().getServiceInfo(); |
201 |
|
202 |
if ((_si.getFeaturecoordsys() == null) |
203 |
|| (_si.getFeaturecoordsys().equals(""))) {
|
204 |
_si.setFeaturecoordsys(_true_srs.getAbrev().substring( |
205 |
ServiceInfoTags.vINI_SRS.length()).trim()); |
206 |
logger.warn("Server provides no SRS. ");
|
207 |
} |
208 |
|
209 |
setFullExtent(((ArcImsProtImageHandler) _drv.getClient() |
210 |
.getHandler()).getServiceExtent(_true_srs, |
211 |
getArcimsStatus())); |
212 |
|
213 |
// JPG
|
214 |
setFormat(_image_format); |
215 |
setTransparency(0);
|
216 |
|
217 |
// =================================== query
|
218 |
int layercount = _si.getLayers().size();
|
219 |
String _layer_query = ""; |
220 |
|
221 |
for (int i = 0; i < layercount; i++) { |
222 |
if (isTrueString(((ServiceInformationLayer) _si.getLayer(i))
|
223 |
.getVisible())) { |
224 |
_layer_query = _layer_query |
225 |
+ ","
|
226 |
+ ((ServiceInformationLayer) _si.getLayer(i)) |
227 |
.getId(); |
228 |
} |
229 |
} |
230 |
|
231 |
if (_layer_query.length() == 0) { |
232 |
throw new Exception("No layers are visible by default "); |
233 |
} else {
|
234 |
_layer_query = _layer_query.substring(1);
|
235 |
} |
236 |
|
237 |
// ===================================
|
238 |
setLayerQuery(_layer_query); |
239 |
setProjection(_true_srs); |
240 |
setName(_layer_name); |
241 |
} catch (Exception ex) { |
242 |
throw new Exception("While creating FRasterLyrArcIMS from Map", ex); |
243 |
} |
244 |
} |
245 |
|
246 |
/**
|
247 |
* Gets the driver object onto which <tt>getMap()</tt> and
|
248 |
* <tt>getFeatureInfo()</tt> requests are passed. If the driver was not
|
249 |
* created, this methdo creates it with the server's URL and the service
|
250 |
* name.
|
251 |
*
|
252 |
* @return the driver that actually performs the requests.
|
253 |
*/
|
254 |
public ArcImsImageDriver getDriver() {
|
255 |
if (imageDriver == null) { |
256 |
imageDriver = new ArcImsImageDriver(host.toString(), service,
|
257 |
this.serviceType);
|
258 |
} |
259 |
|
260 |
return imageDriver;
|
261 |
} |
262 |
|
263 |
/**
|
264 |
* Gets the transformation matrix to be written in the georeference file.
|
265 |
* The second and the third coefficients will always be zero (it doesn't
|
266 |
* implement image rotation)
|
267 |
*
|
268 |
* @param bBox
|
269 |
* Image's size and position (user's coordinates)
|
270 |
* @param sz
|
271 |
* Images' size in pixels
|
272 |
* @return the worldfile, as a String
|
273 |
* @throws IOException
|
274 |
*/
|
275 |
public String getDataWorldFile(Rectangle2D bBox, Dimension sz) |
276 |
throws IOException { |
277 |
StringBuffer data = new StringBuffer(); |
278 |
data.append(((bBox.getMaxX() - bBox.getMinX()) / (sz.getWidth() - 1))
|
279 |
+ "\n");
|
280 |
data.append("0.0\n");
|
281 |
data.append("0.0\n");
|
282 |
data.append("-"
|
283 |
+ ((bBox.getMaxY() - bBox.getMinY()) / (sz.getHeight() - 1))
|
284 |
+ "\n");
|
285 |
|
286 |
// data.append((bBox.getMaxY() - bBox.getMinY()) / (sz.getHeight() - 1)
|
287 |
// + "\n");
|
288 |
data.append("" + bBox.getMinX() + "\n"); |
289 |
|
290 |
// data.append("" + bBox.getMinY() + "\n");
|
291 |
data.append("" + bBox.getMaxY() + "\n"); |
292 |
|
293 |
return data.toString();
|
294 |
} |
295 |
|
296 |
/**
|
297 |
* This method must be invoqued with <b>true</b> if the layer must show its
|
298 |
* transparency. The level of transparency is set by another method.
|
299 |
*
|
300 |
* @param t
|
301 |
* Whether or not the transparency must be shown.
|
302 |
*/
|
303 |
public void setArcImsTransparency(boolean t) { |
304 |
this.arcImsTransparency = t;
|
305 |
} |
306 |
|
307 |
/**
|
308 |
* Drawing method invoqued from outside the plugin.
|
309 |
*
|
310 |
* @param g
|
311 |
* graphic object on which drawing is made.
|
312 |
* @param vp
|
313 |
* the view
|
314 |
* @param cancel
|
315 |
* allows drawing abortion
|
316 |
* @throws Exception
|
317 |
*/
|
318 |
private void drawTile(Graphics2D g, ViewPort vp, Cancellable cancel, |
319 |
double scale) throws Exception { |
320 |
// This is the extent that will be requested
|
321 |
Envelope2D env = (Envelope2D) vp.getAdjustedEnvelope(); |
322 |
double xmin = env.getMinimum(0); |
323 |
double ymin = env.getMinimum(1); |
324 |
double w = env.getMaximum(0) - xmin; |
325 |
double h = env.getMaximum(1) - ymin; |
326 |
Rectangle2D bBox = new Rectangle2D.Double(xmin, ymin, w, h); |
327 |
Dimension sz = vp.getImageSize();
|
328 |
|
329 |
try {
|
330 |
arcimsStatus.setEnvelope(bBox); |
331 |
arcimsStatus.setFormat(getFormat()); |
332 |
arcimsStatus.setHeight(vp.getImageHeight()); |
333 |
arcimsStatus.setWidth(vp.getImageWidth()); |
334 |
arcimsStatus.setLayerIds(Utilities.createVector(layerQuery, ",")); |
335 |
arcimsStatus.setServer(host.toString()); |
336 |
arcimsStatus.setService(service); |
337 |
arcimsStatus.setSrs(this.getProjection().getAbrev());
|
338 |
arcimsStatus.setTransparency(this.arcImsTransparency);
|
339 |
|
340 |
// We need to cast because driver returns an Object
|
341 |
File f = (File) getDriver().getMap(arcimsStatus); |
342 |
|
343 |
int lastp = f.getPath().lastIndexOf("."); |
344 |
String noext = f.getPath().substring(0, lastp); |
345 |
|
346 |
String nameWorldFile = noext + getExtensionWordFile(getFormat());
|
347 |
|
348 |
org.gvsig.andami.Utilities.createTemp(nameWorldFile, this
|
349 |
.getDataWorldFile(bBox, sz)); |
350 |
|
351 |
// ------------------------------ START
|
352 |
ViewPortData vpData = new ViewPortData(vp.getProjection(),
|
353 |
new Extent(bBox), sz);
|
354 |
vpData.setMat(vp.getAffineTransform()); |
355 |
|
356 |
// ------------------------------ END
|
357 |
rasterProcess(f, g, vp, scale, cancel); |
358 |
} catch (Exception e) { |
359 |
Exception de = new Exception("While drawing tile: " |
360 |
+ e.getMessage()); |
361 |
logger.error("While drawing tile: " + e.getMessage());
|
362 |
throw de;
|
363 |
} |
364 |
} |
365 |
|
366 |
/**
|
367 |
* Drawing method invoqued from gvSIG to draw this layer. Uses a
|
368 |
* <tt>Tiling</tt> object to prevent downloading images too large to be
|
369 |
* retrieved (pixel count limit)
|
370 |
*
|
371 |
* @param image
|
372 |
* used to speed up drawing process
|
373 |
* @param g
|
374 |
* graphic object on which drawing is make
|
375 |
* @param viewPort
|
376 |
* the view's properties
|
377 |
* @param cancel
|
378 |
* allows drawing abortion
|
379 |
* @param scale
|
380 |
* the current scale
|
381 |
*
|
382 |
* @throws DriverException
|
383 |
*/
|
384 |
public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort, |
385 |
Cancellable cancel, double scale) throws ReadException { |
386 |
if (!isVisible()) {
|
387 |
return;
|
388 |
} |
389 |
|
390 |
if (!isWithinScale(scale)) {
|
391 |
return;
|
392 |
} |
393 |
|
394 |
visualStatus.width = viewPort.getImageWidth(); |
395 |
visualStatus.height = viewPort.getImageHeight(); |
396 |
visualStatus.minX = viewPort.getEnvelope().getLowerCorner().getX(); |
397 |
visualStatus.minY = viewPort.getEnvelope().getLowerCorner().getY(); |
398 |
visualStatus.maxX = viewPort.getEnvelope().getUpperCorner().getX(); |
399 |
visualStatus.maxY = viewPort.getEnvelope().getUpperCorner().getY(); |
400 |
|
401 |
setTileDimensions(viewPort); |
402 |
|
403 |
java.awt.geom.Point2D p = viewPort.getOffset(); |
404 |
Rectangle r = new Rectangle((int) p.getX(), (int) p.getY(), viewPort |
405 |
.getImageWidth() - 1, viewPort.getImageHeight() - 1); |
406 |
Tiling tiles = new Tiling(maxTileWidth, maxTileHeight, r);
|
407 |
tiles.setAffineTransform((AffineTransform) viewPort
|
408 |
.getAffineTransform().clone()); |
409 |
|
410 |
tiled = false;
|
411 |
|
412 |
try {
|
413 |
// enableAwake();
|
414 |
enableStopped(); |
415 |
} catch (Exception e1) { |
416 |
throw new ReadException("Error changing awake state", e1); |
417 |
} |
418 |
|
419 |
if (tiles.getNumTiles() > 1) { |
420 |
tiled = true;
|
421 |
tileSize[0] = tiles.getMaxTileWidth();
|
422 |
tileSize[1] = tiles.getMaxTileHeight();
|
423 |
|
424 |
MultiRasterDataset[][] datasets = new MultiRasterDataset[tiles |
425 |
.getNumRows()][tiles.getNumCols()]; |
426 |
IBuffer[][] buf = new IBuffer[tiles.getNumRows()][tiles |
427 |
.getNumCols()]; |
428 |
|
429 |
// more than one tile ----------------------
|
430 |
for (int tileNr = 0; tileNr < tiles.getNumTiles(); tileNr++) { |
431 |
// drawing part
|
432 |
try {
|
433 |
ViewPort vp = tiles.getTileViewPort(viewPort, tileNr); |
434 |
drawTile(g, vp, cancel, scale); |
435 |
|
436 |
if (layerRaster != null) { |
437 |
datasets[(int) (tileNr / tiles.getNumCols())][tileNr
|
438 |
% tiles.getNumCols()] = (MultiRasterDataset) layerRaster |
439 |
.getDataSource().newDataset(); |
440 |
buf[(int) (tileNr / tiles.getNumCols())][tileNr
|
441 |
% tiles.getNumCols()] = layerRaster.getRender() |
442 |
.getLastRenderBuffer(); |
443 |
} |
444 |
} catch (NoninvertibleTransformException e) { |
445 |
logger.error("Non invertible matrix! ", e);
|
446 |
} catch (Exception de) { |
447 |
logger.error("While drawing tile: " + de.getMessage());
|
448 |
this.setAvailable(false); |
449 |
} |
450 |
} |
451 |
|
452 |
try {
|
453 |
if (datasets != null && datasets[0][0] != null) { |
454 |
dataset = new CompositeDataset(datasets);
|
455 |
initializeRasterLayer(datasets, buf); |
456 |
} |
457 |
} catch (MosaicNotValidException e) {
|
458 |
throw new ReadException("No hay continuidad en el mosaico.", e); |
459 |
} catch (LoadLayerException e) {
|
460 |
throw new ReadException("Error inicializando la capa.", e); |
461 |
} catch (InterruptedException e) { |
462 |
throw new ReadException("Error interrupcion.", e); |
463 |
} |
464 |
|
465 |
// more than one tile ----------------------
|
466 |
|
467 |
} else {
|
468 |
|
469 |
// one tile --------------------------------
|
470 |
try {
|
471 |
ViewPort vp = tiles.getTileViewPort(viewPort, 0);
|
472 |
drawTile(g, vp, cancel, scale); |
473 |
|
474 |
dataset = layerRaster.getDataSource(); |
475 |
getRender().setLastRenderBuffer( |
476 |
layerRaster.getRender().getLastRenderBuffer()); |
477 |
initializeRasterLayer(null, new IBuffer[][] { { layerRaster |
478 |
.getRender().getLastRenderBuffer() } }); |
479 |
|
480 |
} catch (NoninvertibleTransformException e) { |
481 |
logger.error("Non invertible matrix! ");
|
482 |
} catch (Exception de) { |
483 |
logger.error("While drawing tile: " + de.getMessage());
|
484 |
this.setAvailable(false); |
485 |
} |
486 |
// catch (LoadLayerException e) {
|
487 |
// logger.error("While drawing: " + e.getMessage());
|
488 |
// this.setAvailable(false);
|
489 |
// } catch (InterruptedException e) {
|
490 |
// logger.error("While drawing: " + e.getMessage());
|
491 |
// }
|
492 |
|
493 |
// one tile --------------------------------
|
494 |
|
495 |
} |
496 |
|
497 |
// the status needs to be reset because the drawTile
|
498 |
// method had changed its extent and dimension:
|
499 |
Envelope2D enve = (Envelope2D) viewPort.getEnvelope(); |
500 |
arcimsStatus.setEnvelope(enve); |
501 |
arcimsStatus.setHeight(viewPort.getImageHeight()); |
502 |
arcimsStatus.setWidth(viewPort.getImageWidth()); |
503 |
|
504 |
callActionListeners(scaleChangedEvent); |
505 |
|
506 |
if (nameQueryChange) {
|
507 |
callNameOrQueryListeners(); |
508 |
nameQueryChange = false;
|
509 |
} |
510 |
|
511 |
disableStopped(); |
512 |
} |
513 |
|
514 |
private void setTileDimensions(ViewPort vp) { |
515 |
maxTileHeight = vp.getImageHeight(); |
516 |
|
517 |
try {
|
518 |
maxTileWidth = Integer.parseInt(arcimsStatus.getServiceInfo()
|
519 |
.getImagelimit_pixelcount()) |
520 |
/ maxTileHeight; |
521 |
maxTileWidth--; |
522 |
} catch (NumberFormatException nfe) { |
523 |
logger |
524 |
.error( |
525 |
"getImagelimit_pixelcount() returned a non parseable string. maxTileWidth was set to 100.",
|
526 |
nfe); |
527 |
maxTileWidth = 100;
|
528 |
} |
529 |
|
530 |
logger.info("Tile size = [ " + maxTileWidth + " , " + maxTileHeight |
531 |
+ " ]");
|
532 |
} |
533 |
|
534 |
/**
|
535 |
* Gets the georeference file extension depending on the image's format.
|
536 |
*
|
537 |
* @param f
|
538 |
* raster file format
|
539 |
* @return georeference file extension (".wld", ".tfw", etc)
|
540 |
*/
|
541 |
private String getExtensionWordFile(String f) { |
542 |
String extWorldFile = ".wld"; |
543 |
|
544 |
if (f.equals("tif") || f.equals("tiff")) { |
545 |
extWorldFile = ".tfw";
|
546 |
} |
547 |
|
548 |
if (f.equals("jpeg")) { |
549 |
extWorldFile = ".jpgw";
|
550 |
} |
551 |
|
552 |
return extWorldFile;
|
553 |
} |
554 |
|
555 |
/**
|
556 |
* Loads and draws the raster using the library
|
557 |
*
|
558 |
* @param filePath
|
559 |
* Ruta al fichero en disco
|
560 |
* @param g
|
561 |
* Graphics2D
|
562 |
* @param vp
|
563 |
* ViewPort
|
564 |
* @param scale
|
565 |
* Escala para el draw
|
566 |
* @param cancel
|
567 |
* Cancelaci?n para el draw
|
568 |
* @throws ReadDriverException
|
569 |
* @throws LoadLayerException
|
570 |
*/
|
571 |
private void rasterProcess(File file, Graphics2D g, ViewPort vp, |
572 |
double scale, Cancellable cancel) throws ReadException, |
573 |
LoadLayerException, FilterTypeException { |
574 |
|
575 |
// Cerramos el dataset asociado a la capa si est? abierto.
|
576 |
if (layerRaster != null) { |
577 |
layerRaster.setRemoveRasterFlag(true);
|
578 |
layerRaster.getDataSource().close(); |
579 |
} |
580 |
|
581 |
// Cargamos el dataset con el raster de disco.
|
582 |
layerRaster = FLyrRasterSE.createLayer("", file.getAbsolutePath(), vp
|
583 |
.getProjection()); |
584 |
layerRaster.getRender() |
585 |
.setBufferFactory(layerRaster.getBufferFactory()); |
586 |
|
587 |
// Obtenemos la tabla de color del raster abierto ya que se le va a
|
588 |
// sustituir la lista
|
589 |
// de filtros y el de tabla de color no queremos sustituirlo.
|
590 |
RasterFilterList rasterFilterList = layerRaster.getRender() |
591 |
.getFilterList(); |
592 |
ColorTableFilter ct = (ColorTableFilter) rasterFilterList |
593 |
.getFilterByBaseClass(ColorTableFilter.class); |
594 |
Object param = null; |
595 |
if (ct != null) |
596 |
param = ct.getParam("colorTable");
|
597 |
|
598 |
// En caso de cargar un proyecto con XMLEntity se crean los filtros
|
599 |
if (filterArguments != null) { |
600 |
RasterFilterList fl = new RasterFilterList();
|
601 |
fl.addEnvParam("IStatistics", layerRaster.getDataSource()
|
602 |
.getStatistics()); |
603 |
fl.addEnvParam("MultiRasterDataset", layerRaster.getDataSource());
|
604 |
fl.setInitDataType(layerRaster.getDataType()[0]);
|
605 |
RasterFilterListManager filterListManager = new RasterFilterListManager(
|
606 |
fl); |
607 |
filterListManager.createFilterListFromStrings(filterArguments); |
608 |
filterArguments = null;
|
609 |
filterList = fl; |
610 |
} |
611 |
|
612 |
// Como el raster se carga a cada zoom el render se crea nuevamente y la
|
613 |
// lista de
|
614 |
// filtros siempre estar? vacia a cada visualizaci?n. Para evitarlo
|
615 |
// tenemos que
|
616 |
// guardar la lista de filtro aplicada en la visualizaci?n anterior.
|
617 |
if (this.filterList != null) { |
618 |
// Si ten?a tabla de color le asignamos la original
|
619 |
if (param != null && param instanceof GridPalette) { |
620 |
this.filterList.remove(ColorTableFilter.class);
|
621 |
RasterFilterListManager filterManager = new RasterFilterListManager(
|
622 |
filterList); |
623 |
ColorTableListManager ctm = new ColorTableListManager(
|
624 |
filterManager); |
625 |
ctm.addColorTableFilter((GridPalette) param); |
626 |
filterList.move(ColorTableFilter.class, 0);
|
627 |
filterList.controlTypes(); |
628 |
} |
629 |
layerRaster.getRender().setFilterList(filterList); |
630 |
} |
631 |
if (gridTransparency != null) |
632 |
layerRaster.getRender().setLastTransparency(gridTransparency); |
633 |
if (this.renderBands != null) |
634 |
layerRaster.getRender().setRenderBands(renderBands); |
635 |
|
636 |
// Dibujamos
|
637 |
layerRaster.draw(null, g, vp, cancel, scale);
|
638 |
|
639 |
// La primera vez asignamos la lista de filtros asociada al
|
640 |
// renderizador. Guardamos una referencia
|
641 |
// en esta clase para que a cada zoom no se pierda.
|
642 |
if (this.filterList == null) |
643 |
filterList = layerRaster.getRender().getFilterList(); |
644 |
if (this.gridTransparency == null) |
645 |
gridTransparency = layerRaster.getRender().getLastTransparency(); |
646 |
if (this.renderBands == null) |
647 |
renderBands = layerRaster.getRender().getRenderBands(); |
648 |
|
649 |
} |
650 |
|
651 |
/*
|
652 |
* public void repaintRaster(Graphics2D g, ViewPort vp, File file) {
|
653 |
* rasterProcess(file, g, vp, scale, cancel); rasterProcess(g, vpData,
|
654 |
* file); }
|
655 |
*/
|
656 |
|
657 |
public String getFormat() { |
658 |
return format;
|
659 |
} |
660 |
|
661 |
public void setFormat(String f) { |
662 |
format = f; |
663 |
} |
664 |
|
665 |
/**
|
666 |
* Gets a series of attributes that describe the layer's raster: Filename,
|
667 |
* Filesize, Height, Width and Bands.
|
668 |
*
|
669 |
* @return A list of 2-element arrays { "Attribute name" , Value }
|
670 |
*/
|
671 |
public ArrayList getAttributes() { |
672 |
|
673 |
// if (rasterFile != null) {
|
674 |
// ArrayList attr = new ArrayList();
|
675 |
// Object[][] a = {
|
676 |
// {
|
677 |
// "Filename",
|
678 |
// rasterFile.getName()
|
679 |
// .substring(rasterFile.getName()
|
680 |
// .lastIndexOf("/") + 1,
|
681 |
// rasterFile.getName().length())
|
682 |
// },
|
683 |
// { "Filesize", new Long(rasterFile.getFileSize()) },
|
684 |
// {
|
685 |
// "Width",
|
686 |
// new Integer((new Double(this.getWidth())).intValue())
|
687 |
// },
|
688 |
// {
|
689 |
// "Height",
|
690 |
// new Integer((new Double(this.getHeight())).intValue())
|
691 |
// },
|
692 |
// { "Bands", new Integer(rasterFile.getBandCount()) }
|
693 |
// };
|
694 |
//
|
695 |
// for (int i = 0; i < a.length; i++) {
|
696 |
// attr.add(a[i]);
|
697 |
// }
|
698 |
//
|
699 |
// return attr;
|
700 |
// }
|
701 |
|
702 |
return null; |
703 |
} |
704 |
|
705 |
/**
|
706 |
*
|
707 |
/** Invoqued from gvSIG to draw this layer on a printable map. Uses a
|
708 |
* <tt>Tiling</tt> object to prevent downloading images too large to be
|
709 |
* retrieved (pixel count limit).
|
710 |
*
|
711 |
* @param g
|
712 |
* graphic object on which drawing is make
|
713 |
* @param viewPort
|
714 |
* the view's properties
|
715 |
* @param cancel
|
716 |
* allows drawing abortion
|
717 |
* @param scale
|
718 |
* the current scale
|
719 |
*
|
720 |
* @throws DriverException
|
721 |
*/
|
722 |
public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel, |
723 |
double scale, PrintRequestAttributeSet properties) |
724 |
throws ReadException {
|
725 |
draw(null, g, viewPort, cancel, scale);
|
726 |
} |
727 |
|
728 |
public HashMap getProperties() { |
729 |
HashMap info = new HashMap(); |
730 |
String[] layerNames = getLayerQuery().split(","); |
731 |
Vector layers = new Vector(layerNames.length); |
732 |
|
733 |
try {
|
734 |
if (((ArcImsImageDriver) getDriver()).connect(myCanc)) {
|
735 |
info.put("layerName", this.getName()); |
736 |
info.put("serverUrl", this.getHost()); |
737 |
info.put("serviceName", this.getService()); |
738 |
info.put("serviceType", this.getServiceType()); |
739 |
info.put("format", this.format); |
740 |
|
741 |
for (int i = 0; i < layerNames.length; i++) |
742 |
layers.add(layerNames[i]); |
743 |
|
744 |
info.put("layerIds", layers);
|
745 |
|
746 |
return info;
|
747 |
} |
748 |
} catch (Exception e) { |
749 |
logger |
750 |
.error("Error while reading FRasterLyrArcIMS properties. ",
|
751 |
e); |
752 |
} |
753 |
|
754 |
return null; |
755 |
} |
756 |
|
757 |
public double getHeight() { |
758 |
return visualStatus.height;
|
759 |
} |
760 |
|
761 |
public double getMaxX() { |
762 |
return visualStatus.maxX;
|
763 |
} |
764 |
|
765 |
public double getMaxY() { |
766 |
return visualStatus.maxY;
|
767 |
} |
768 |
|
769 |
public double getMinX() { |
770 |
return visualStatus.minX;
|
771 |
} |
772 |
|
773 |
public double getMinY() { |
774 |
return visualStatus.minY;
|
775 |
} |
776 |
|
777 |
public int[] getPixel(double wcx, double wcy) { |
778 |
return null; |
779 |
} |
780 |
|
781 |
public double getWidth() { |
782 |
return visualStatus.width;
|
783 |
} |
784 |
|
785 |
public void setPos(int x, int y) { |
786 |
this.posX = x;
|
787 |
this.posY = y;
|
788 |
} |
789 |
|
790 |
public void setPosWC(double x, double y) { |
791 |
this.posXWC = x;
|
792 |
this.posYWC = y;
|
793 |
} |
794 |
|
795 |
// /**
|
796 |
// *
|
797 |
// * @return XMLEntity.
|
798 |
// * @throws XMLException
|
799 |
// */
|
800 |
// public XMLEntity getXMLEntity() throws XMLException {
|
801 |
// XMLEntity xml = super.getXMLEntity();
|
802 |
//
|
803 |
// xml.putProperty("fullExtent", StringUtilities.rect2String(fullExtent));
|
804 |
// xml.putProperty("host", host.toExternalForm());
|
805 |
// xml.putProperty("serviceName", service);
|
806 |
// xml.putProperty("serviceType", serviceType);
|
807 |
// xml.putProperty("layerQuery", layerQuery);
|
808 |
// xml.putProperty("format", format);
|
809 |
//
|
810 |
// if (status != null) {
|
811 |
// status.getXMLEntity(xml, true, this);
|
812 |
// } else {
|
813 |
// status = new StatusLayerRaster();
|
814 |
// status.getXMLEntity(xml, true, this);
|
815 |
// }
|
816 |
//
|
817 |
// xml.putProperty("arcims_transparency", arcImsTransparency);
|
818 |
//
|
819 |
// int cnt = 0;
|
820 |
// boolean ex = true;
|
821 |
// String kn = "raster.file";
|
822 |
// while (ex) {
|
823 |
// kn = "raster.file" + cnt;
|
824 |
// try {
|
825 |
// xml.getStringArrayProperty(kn);
|
826 |
// xml.remove(kn);
|
827 |
// } catch (Exception exc) {
|
828 |
// ex = false;
|
829 |
// }
|
830 |
// cnt++;
|
831 |
// }
|
832 |
//
|
833 |
// return xml;
|
834 |
// }
|
835 |
|
836 |
// /**
|
837 |
// *
|
838 |
// * @param xml
|
839 |
// * XMLEntity
|
840 |
// *
|
841 |
// * @throws XMLException
|
842 |
// * @throws DriverException
|
843 |
// * @throws DriverIOException
|
844 |
// */
|
845 |
// public void setXMLEntity(XMLEntity xml) throws XMLException {
|
846 |
//
|
847 |
// super.setXMLEntity(xml);
|
848 |
//
|
849 |
// fullExtent = StringUtilities.string2Rect(xml
|
850 |
// .getStringProperty("fullExtent"));
|
851 |
//
|
852 |
// try {
|
853 |
// host = new URL(xml.getStringProperty("host"));
|
854 |
// } catch (MalformedURLException e) {
|
855 |
// logger.error("Whle reading XML file ", e);
|
856 |
// throw new Exception(e);
|
857 |
// }
|
858 |
//
|
859 |
// this.layerQuery = xml.getStringProperty("layerQuery");
|
860 |
// this.service = xml.getStringProperty("serviceName");
|
861 |
// this.serviceType = xml.getStringProperty("serviceType");
|
862 |
// this.format = xml.getStringProperty("format");
|
863 |
//
|
864 |
// FMapRasterArcImsDriver drv = new FMapRasterArcImsDriver(
|
865 |
// host.toString(), service, serviceType);
|
866 |
//
|
867 |
// if (!drv.connect(myCanc)) {
|
868 |
// logger.error("Error while loading service information. ");
|
869 |
// }
|
870 |
//
|
871 |
// ArcImsClientP cli = (ArcImsClientP) drv.getClient();
|
872 |
// ServiceInformation si = cli.getServiceInformation();
|
873 |
// this.arcimsStatus.setServiceInformation(si);
|
874 |
//
|
875 |
// if (xml.contains("arcims_transparency")) {
|
876 |
// this.arcImsTransparency = xml
|
877 |
// .getBooleanProperty("arcims_transparency");
|
878 |
// }
|
879 |
//
|
880 |
// String claseStr = StatusLayerRaster.defaultClass;
|
881 |
//
|
882 |
// if (xml.contains("raster.class")) {
|
883 |
// claseStr = xml.getStringProperty("raster.class");
|
884 |
// }
|
885 |
//
|
886 |
// if (status != null) {
|
887 |
// status.setXMLEntity(xml, this);
|
888 |
// } else {
|
889 |
// // When we load a project
|
890 |
// if ((claseStr != null) && !claseStr.equals("")) {
|
891 |
// try {
|
892 |
// Class clase = Class.forName(claseStr);
|
893 |
// Constructor constr = clase.getConstructor(null);
|
894 |
// status = (IStatusRaster) constr.newInstance(null);
|
895 |
//
|
896 |
// if (status != null) {
|
897 |
// status.setXMLEntity(xml, this);
|
898 |
// filterArguments = status.getFilterArguments();
|
899 |
// gridTransparency = status.getTransparency();
|
900 |
// renderBands = status.getRenderBands();
|
901 |
//
|
902 |
// }
|
903 |
// } catch (ClassNotFoundException exc) {
|
904 |
// logger.error("Whle reading XML file ", exc);
|
905 |
// } catch (InstantiationException exc) {
|
906 |
// logger.error("Whle reading XML file ", exc);
|
907 |
// } catch (IllegalAccessException exc) {
|
908 |
// logger.error("Whle reading XML file ", exc);
|
909 |
// } catch (NoSuchMethodException exc) {
|
910 |
// logger.error("Whle reading XML file ", exc);
|
911 |
// } catch (InvocationTargetException exc) {
|
912 |
// logger.error("Whle reading XML file ", exc);
|
913 |
// }
|
914 |
// }
|
915 |
// }
|
916 |
//
|
917 |
// firstLoad = true;
|
918 |
// }
|
919 |
|
920 |
public Vector getLayerScaleInfoVector() { |
921 |
Vector v = new Vector(); |
922 |
String id;
|
923 |
|
924 |
for (int i = 0; i < arcimsStatus.getLayerIds().size(); i++) { |
925 |
id = (String) arcimsStatus.getLayerIds().get(i);
|
926 |
v.add(getScaleInfo(id)); |
927 |
} |
928 |
|
929 |
return v;
|
930 |
} |
931 |
|
932 |
public LayerScaleData getScaleInfo(String theId) { |
933 |
ServiceInformation si; |
934 |
ServiceInformationLayer sil; |
935 |
int noflayers;
|
936 |
long true_max_scale;
|
937 |
long true_min_scale;
|
938 |
|
939 |
LayerScaleData theLayerScaleData = null;
|
940 |
|
941 |
si = arcimsStatus.getServiceInfo(); |
942 |
|
943 |
int _dpi = si.getScreen_dpi();
|
944 |
String mapUnits = si.getMapunits();
|
945 |
|
946 |
noflayers = si.getLayers().size(); |
947 |
|
948 |
for (int i = 0; i < noflayers; i++) { |
949 |
sil = (ServiceInformationLayer) si.getLayer(i); |
950 |
|
951 |
if ((sil.getId().compareTo(theId)) == 0) { |
952 |
true_max_scale = LayerScaleData |
953 |
.getTrueScaleFromRelativeScaleAndMapUnits(sil |
954 |
.getMaxscale(), mapUnits, _dpi); |
955 |
true_min_scale = LayerScaleData |
956 |
.getTrueScaleFromRelativeScaleAndMapUnits(sil |
957 |
.getMinscale(), mapUnits, _dpi); |
958 |
theLayerScaleData = new LayerScaleData(sil.getName(), sil
|
959 |
.getId(), true_min_scale, true_max_scale, sil.getType()); |
960 |
} |
961 |
} |
962 |
|
963 |
return theLayerScaleData;
|
964 |
} |
965 |
|
966 |
public void addActionlistener(ActionListener al) { |
967 |
if (actionListeners.contains(al)) {
|
968 |
return;
|
969 |
} |
970 |
|
971 |
actionListeners.add(al); |
972 |
} |
973 |
|
974 |
public void removeActionlistener(ActionListener al) { |
975 |
actionListeners.remove(al); |
976 |
} |
977 |
|
978 |
private void callActionListeners(ActionEvent ae) { |
979 |
ActionListener al;
|
980 |
|
981 |
for (int i = 0; i < actionListeners.size(); i++) { |
982 |
al = (ActionListener) actionListeners.get(i);
|
983 |
al.actionPerformed(ae); |
984 |
} |
985 |
} |
986 |
|
987 |
public long getScale() { |
988 |
return getMapContext().getScaleView();
|
989 |
} |
990 |
|
991 |
public int getMaxTileHeight() { |
992 |
return maxTileHeight;
|
993 |
} |
994 |
|
995 |
public void setMaxTileHeight(int maxTileHeight) { |
996 |
this.maxTileHeight = maxTileHeight;
|
997 |
} |
998 |
|
999 |
public int getMaxTileWidth() { |
1000 |
return maxTileWidth;
|
1001 |
} |
1002 |
|
1003 |
public void setMaxTileWidth(int maxTileWidth) { |
1004 |
this.maxTileWidth = maxTileWidth;
|
1005 |
} |
1006 |
|
1007 |
public void setServiceInformationInStatus(ServiceInformation si) { |
1008 |
this.arcimsStatus.setServiceInformation(si);
|
1009 |
} |
1010 |
|
1011 |
/**
|
1012 |
* This is the <tt>getDriver</tt> method. The <tt>getDriver</tt> method will
|
1013 |
* be implemented by sub-classes.
|
1014 |
*
|
1015 |
* @param d
|
1016 |
* the new driver.
|
1017 |
*/
|
1018 |
public void setDriver(ArcImsImageDriver d) { |
1019 |
imageDriver = d; |
1020 |
} |
1021 |
|
1022 |
public ArcImsStatus getArcimsStatus() {
|
1023 |
return arcimsStatus;
|
1024 |
} |
1025 |
|
1026 |
public void setArcimsStatus(ArcImsStatus as) { |
1027 |
arcimsStatus = as; |
1028 |
} |
1029 |
|
1030 |
public boolean isFirstLoad() { |
1031 |
return firstLoad;
|
1032 |
} |
1033 |
|
1034 |
public void setFirstLoad(boolean fl) { |
1035 |
firstLoad = fl; |
1036 |
} |
1037 |
|
1038 |
public URL getHost() { |
1039 |
return host;
|
1040 |
} |
1041 |
|
1042 |
public void setHost(URL h) { |
1043 |
host = h; |
1044 |
} |
1045 |
|
1046 |
public String getLayerQuery() { |
1047 |
return layerQuery;
|
1048 |
} |
1049 |
|
1050 |
public void setLayerQuery(String lQuery) { |
1051 |
this.layerQuery = lQuery;
|
1052 |
|
1053 |
if (layerQuery.substring(0, 1).compareTo(",") == 0) { |
1054 |
layerQuery = layerQuery.substring(1);
|
1055 |
} |
1056 |
} |
1057 |
|
1058 |
public String getService() { |
1059 |
return service;
|
1060 |
} |
1061 |
|
1062 |
public void setService(String s) { |
1063 |
service = s; |
1064 |
} |
1065 |
|
1066 |
public String getServiceType() { |
1067 |
return serviceType;
|
1068 |
} |
1069 |
|
1070 |
public void setServiceType(String st) { |
1071 |
serviceType = st; |
1072 |
} |
1073 |
|
1074 |
public String getSRS() { |
1075 |
return SRS;
|
1076 |
} |
1077 |
|
1078 |
public void setSRS(String srs) { |
1079 |
SRS = srs; |
1080 |
} |
1081 |
|
1082 |
public void setFullExtent(Rectangle2D fe) { |
1083 |
fullExtent = fe; |
1084 |
} |
1085 |
|
1086 |
public Rectangle2D getFullExtent() { |
1087 |
return fullExtent;
|
1088 |
} |
1089 |
|
1090 |
public boolean getArcImsTransparency() { |
1091 |
return arcImsTransparency;
|
1092 |
} |
1093 |
|
1094 |
public int getTransparency() { |
1095 |
return transparency;
|
1096 |
} |
1097 |
|
1098 |
public void setTransparency(int transparency) { |
1099 |
this.transparency = transparency;
|
1100 |
} |
1101 |
|
1102 |
public int getPosX() { |
1103 |
return posX;
|
1104 |
} |
1105 |
|
1106 |
public void setPosX(int posX) { |
1107 |
this.posX = posX;
|
1108 |
} |
1109 |
|
1110 |
public double getPosXWC() { |
1111 |
return posXWC;
|
1112 |
} |
1113 |
|
1114 |
public void setPosXWC(double posXWC) { |
1115 |
this.posXWC = posXWC;
|
1116 |
} |
1117 |
|
1118 |
public int getPosY() { |
1119 |
return posY;
|
1120 |
} |
1121 |
|
1122 |
public void setPosY(int posY) { |
1123 |
this.posY = posY;
|
1124 |
} |
1125 |
|
1126 |
public double getPosYWC() { |
1127 |
return posYWC;
|
1128 |
} |
1129 |
|
1130 |
public void setPosYWC(double posYWC) { |
1131 |
this.posYWC = posYWC;
|
1132 |
} |
1133 |
|
1134 |
public void setFormatInStatus(String imgFormat) { |
1135 |
arcimsStatus.setFormat(imgFormat); |
1136 |
} |
1137 |
|
1138 |
/**
|
1139 |
* This method invoques the <tt>FMapRasterArcImsDriver</tt>'s
|
1140 |
* <tt>getFeatureInfo</tt> method with the given coordinates as a parameter
|
1141 |
*
|
1142 |
* @param p
|
1143 |
* the corrdinates of the screen pixel to be queried
|
1144 |
*
|
1145 |
* @return the data retrieved for that pixel
|
1146 |
* @throws DriverException
|
1147 |
*/
|
1148 |
public Iterator getInfo(Point p, double tolerance, Cancellable cancel) |
1149 |
throws ReadException {
|
1150 |
// StringXMLItem[] resp = new StringXMLItem[1];
|
1151 |
// String respStr;
|
1152 |
//
|
1153 |
// if (((FMapRasterArcImsDriver) driver).isQueryable()) {
|
1154 |
// try {
|
1155 |
// respStr = ((FMapRasterArcImsDriver) driver).getFeatureInfo(
|
1156 |
// arcimsStatus, (int) p.getX(), (int) p.getY(),
|
1157 |
// Integer.MAX_VALUE);
|
1158 |
// } catch (ArcImsException e) {
|
1159 |
// ReadException de = new ReadException(
|
1160 |
// "While getting feature info. ", e);
|
1161 |
// logger.error("In query by point ", e);
|
1162 |
// throw de;
|
1163 |
// }
|
1164 |
// } else {
|
1165 |
// ReadException de = new ReadException("Layer not queriable.",
|
1166 |
// new Exception("Layer not queriable."));
|
1167 |
// throw de;
|
1168 |
// }
|
1169 |
//
|
1170 |
// System.err.println(resp); // TODO BORRAR ESTO
|
1171 |
// resp[0] = new StringXMLItem(respStr, this);
|
1172 |
|
1173 |
return null; |
1174 |
} |
1175 |
|
1176 |
public boolean isTiled() { |
1177 |
return tiled;
|
1178 |
} |
1179 |
|
1180 |
public int[] getTileSize() { |
1181 |
return tileSize;
|
1182 |
} |
1183 |
|
1184 |
private boolean isTrueString(String visible) { |
1185 |
if (visible.compareToIgnoreCase("true") == 0) { |
1186 |
return true; |
1187 |
} |
1188 |
|
1189 |
return false; |
1190 |
} |
1191 |
|
1192 |
public void callNameOrQueryListeners() { |
1193 |
for (int i = 0; i < listeners.size(); i++) { |
1194 |
((FRasterLyrArcIMSListener) listeners.get(i)).thingsHaveChanged( |
1195 |
getLayerQuery(), getName()); |
1196 |
} |
1197 |
} |
1198 |
|
1199 |
public void addNameOrQueryListener(FRasterLyrArcIMSListener l) { |
1200 |
if (!listeners.contains(l)) {
|
1201 |
listeners.add(l); |
1202 |
} |
1203 |
} |
1204 |
|
1205 |
public void removeNameOrQueryListener(FRasterLyrArcIMSListener l) { |
1206 |
listeners.remove(l); |
1207 |
} |
1208 |
|
1209 |
public void setNameQueryChange(boolean c) { |
1210 |
nameQueryChange = c; |
1211 |
} |
1212 |
|
1213 |
public String getTocImageIcon() { |
1214 |
// String resp = null;
|
1215 |
//
|
1216 |
// try {
|
1217 |
// resp = createImageIcon("images/esrilogo.png");
|
1218 |
// } catch (Exception ex) {
|
1219 |
// }
|
1220 |
//
|
1221 |
// if (resp == null) {
|
1222 |
// return super.getTocImageIcon();
|
1223 |
// } else {
|
1224 |
// return resp;
|
1225 |
// }
|
1226 |
return "images/esrilogo.png"; |
1227 |
} |
1228 |
|
1229 |
protected ImageIcon createImageIcon(String path) { |
1230 |
java.net.URL imgURL = createExtensionUrl(path); |
1231 |
|
1232 |
if (imgURL != null) { |
1233 |
return new ImageIcon(imgURL); |
1234 |
} else {
|
1235 |
logger.error("File not found: " + path);
|
1236 |
|
1237 |
return null; |
1238 |
} |
1239 |
} |
1240 |
|
1241 |
protected java.net.URL createExtensionUrl(String path) { |
1242 |
return PluginServices.getPluginServices(
|
1243 |
"es.prodevelop.cit.gvsig.arcims").getClassLoader().getResource(
|
1244 |
path); |
1245 |
|
1246 |
// return getClass().getClassLoader().getResource(path);
|
1247 |
} |
1248 |
|
1249 |
public Grid getGrid() {
|
1250 |
return grid;
|
1251 |
} |
1252 |
|
1253 |
private class VisualStatusArcIms { |
1254 |
/**
|
1255 |
* Width and height of the image or the group of tiles if it have them.
|
1256 |
* It's the same dimensions of the viewport
|
1257 |
*/
|
1258 |
private int width = 0; |
1259 |
|
1260 |
/**
|
1261 |
* Width and height of the image or the group of tiles if it have them.
|
1262 |
* It's the same dimensions of the viewport
|
1263 |
*/
|
1264 |
private int height = 0; |
1265 |
private double minX = 0D; |
1266 |
private double minY = 0D; |
1267 |
private double maxX = 0D; |
1268 |
private double maxY = 0D; |
1269 |
private int bandCount = 0; |
1270 |
private int dataType = DataBuffer.TYPE_UNDEFINED; |
1271 |
} |
1272 |
|
1273 |
public RasterFilterList getRenderFilterList() {
|
1274 |
return (filterList != null) ? filterList : getRender().getFilterList(); |
1275 |
} |
1276 |
|
1277 |
/*
|
1278 |
* (non-Javadoc)
|
1279 |
*
|
1280 |
* @see
|
1281 |
* org.gvsig.raster.hierarchy.IRasterRendering#setRenderFilterList(org.gvsig
|
1282 |
* .raster.grid.filter.RasterFilterList)
|
1283 |
*/
|
1284 |
public void setRenderFilterList(RasterFilterList filterList) { |
1285 |
this.filterList = filterList;
|
1286 |
super.getRender().setFilterList(filterList);
|
1287 |
} |
1288 |
|
1289 |
public void setRenderBands(int[] renderBands) { |
1290 |
this.renderBands = renderBands;
|
1291 |
getRender().setRenderBands(renderBands); |
1292 |
} |
1293 |
|
1294 |
/**
|
1295 |
* Actions that are taken after setting the data sources for the raster
|
1296 |
* layer
|
1297 |
*
|
1298 |
* @throws LoadLayerException
|
1299 |
* @throws InterruptedException
|
1300 |
*/
|
1301 |
private void initializeRasterLayer(MultiRasterDataset[][] datasets, |
1302 |
IBuffer[][] buf) throws LoadLayerException, InterruptedException { |
1303 |
if (this.filterList != null) |
1304 |
getRender().setFilterList(filterList); |
1305 |
if (this.gridTransparency != null) |
1306 |
getRender().setLastTransparency(gridTransparency); |
1307 |
if (this.renderBands != null) |
1308 |
getRender().setRenderBands(renderBands); |
1309 |
if (datasets != null) { |
1310 |
String[][] names = new String[datasets.length][datasets[0].length]; |
1311 |
for (int i = 0; i < datasets.length; i++) |
1312 |
for (int j = 0; j < datasets[i].length; j++) |
1313 |
names[i][j] = datasets[i][j].getDataset(0)[0].getFName(); |
1314 |
super.setLoadParams(names);
|
1315 |
} |
1316 |
super.init();
|
1317 |
if (buf != null) { |
1318 |
int drawablesBandCount = layerRaster.getDataSource().getBands()
|
1319 |
.getDrawableBandsCount(); |
1320 |
IBuffer buff = null;
|
1321 |
if (dataset instanceof CompositeDataset) |
1322 |
buff = ((CompositeDataset) dataset).generateBuffer(buf, |
1323 |
drawablesBandCount); |
1324 |
else
|
1325 |
buff = buf[0][0]; |
1326 |
getRender().setLastRenderBuffer(buff); |
1327 |
} |
1328 |
} |
1329 |
|
1330 |
public GridTransparency getRenderTransparency() {
|
1331 |
return (gridTransparency != null) ? gridTransparency : getRender() |
1332 |
.getLastTransparency(); |
1333 |
} |
1334 |
|
1335 |
public boolean isActionEnabled(int action) { |
1336 |
switch (action) {
|
1337 |
case IRasterLayerActions.ZOOM_PIXEL_RESOLUTION:
|
1338 |
case IRasterLayerActions.FLYRASTER_BAR_TOOLS:
|
1339 |
case IRasterLayerActions.BANDS_FILE_LIST:
|
1340 |
case IRasterLayerActions.COLOR_TABLE:
|
1341 |
case IRasterLayerActions.GEOLOCATION:
|
1342 |
case IRasterLayerActions.PANSHARPENING:
|
1343 |
return false; |
1344 |
case IRasterLayerActions.REMOTE_ACTIONS:
|
1345 |
return true; |
1346 |
} |
1347 |
|
1348 |
return super.isActionEnabled(action); |
1349 |
} |
1350 |
|
1351 |
public int[] getRenderBands() { |
1352 |
return (renderBands != null) ? renderBands : getRender() |
1353 |
.getRenderBands(); |
1354 |
} |
1355 |
|
1356 |
/*
|
1357 |
* (non-Javadoc)
|
1358 |
*
|
1359 |
* @see org.gvsig.fmap.raster.layers.FLyrRasterSE#cloneLayer()
|
1360 |
*/
|
1361 |
public FLayer cloneLayer() throws Exception { |
1362 |
FRasterLyrArcIMS layer = new FRasterLyrArcIMS();
|
1363 |
layer.setHost(this.getHost());
|
1364 |
layer.setName(this.getName());
|
1365 |
layer.setSRS(this.getSRS());
|
1366 |
layer.setFormat(this.getFormat());
|
1367 |
layer.setFullExtent(this.fullExtent);
|
1368 |
layer.setDriver(this.getDriver());
|
1369 |
layer.setLayerQuery(this.layerQuery);
|
1370 |
layer.setArcimsStatus(this.getArcimsStatus());
|
1371 |
layer.visualStatus = this.visualStatus;
|
1372 |
layer.setProjection(this.getProjection());
|
1373 |
|
1374 |
ArrayList filters = getRender().getFilterList().getStatusCloned();
|
1375 |
if (layer.getRender().getFilterList() == null) |
1376 |
layer.getRender().setFilterList(new RasterFilterList());
|
1377 |
layer.getRender().getFilterList().setStatus(filters); |
1378 |
|
1379 |
return layer;
|
1380 |
} |
1381 |
|
1382 |
} |