root / trunk / libraries / libFMap / src / com / iver / cit / gvsig / fmap / layers / FLayers.java @ 2981
History | View | Annotate | Download (25.9 KB)
1 | 1100 | fjp | /* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
|
---|---|---|---|
2 | *
|
||
3 | * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
|
||
4 | *
|
||
5 | * This program is free software; you can redistribute it and/or
|
||
6 | * modify it under the terms of the GNU General Public License
|
||
7 | * as published by the Free Software Foundation; either version 2
|
||
8 | * of the License, or (at your option) any later version.
|
||
9 | *
|
||
10 | * This program is distributed in the hope that it will be useful,
|
||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
13 | * GNU General Public License for more details.
|
||
14 | *
|
||
15 | * You should have received a copy of the GNU General Public License
|
||
16 | * along with this program; if not, write to the Free Software
|
||
17 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA.
|
||
18 | *
|
||
19 | * For more information, contact:
|
||
20 | *
|
||
21 | * Generalitat Valenciana
|
||
22 | * Conselleria d'Infraestructures i Transport
|
||
23 | * Av. Blasco Ib??ez, 50
|
||
24 | * 46010 VALENCIA
|
||
25 | * SPAIN
|
||
26 | *
|
||
27 | * +34 963862235
|
||
28 | * gvsig@gva.es
|
||
29 | * www.gvsig.gva.es
|
||
30 | *
|
||
31 | * or
|
||
32 | *
|
||
33 | * IVER T.I. S.A
|
||
34 | * Salamanca 50
|
||
35 | * 46005 Valencia
|
||
36 | * Spain
|
||
37 | *
|
||
38 | * +34 963163400
|
||
39 | * dac@iver.es
|
||
40 | */
|
||
41 | 214 | fernando | package com.iver.cit.gvsig.fmap.layers; |
42 | |||
43 | 2608 | caballero | import java.awt.Graphics2D; |
44 | import java.awt.geom.Rectangle2D; |
||
45 | import java.awt.image.BufferedImage; |
||
46 | import java.io.File; |
||
47 | import java.net.MalformedURLException; |
||
48 | import java.net.URL; |
||
49 | import java.util.ArrayList; |
||
50 | 2857 | jaume | import java.util.Collections; |
51 | 2981 | fjp | import java.util.ConcurrentModificationException; |
52 | 2608 | caballero | import java.util.Iterator; |
53 | 2981 | fjp | import java.util.List; |
54 | 2608 | caballero | |
55 | import org.cresques.cts.ICoordTrans; |
||
56 | import org.cresques.cts.IProjection; |
||
57 | 2659 | fjp | import org.cresques.cts.ProjectionPool; |
58 | 2608 | caballero | import org.cresques.cts.gt2.CoordSys; |
59 | import org.cresques.cts.gt2.CoordTrans; |
||
60 | |||
61 | 1828 | fernando | import com.hardcode.driverManager.Driver; |
62 | import com.hardcode.driverManager.DriverLoadException; |
||
63 | 651 | fernando | import com.iver.cit.gvsig.fmap.DriverException; |
64 | 694 | fernando | import com.iver.cit.gvsig.fmap.FMap; |
65 | 562 | fernando | import com.iver.cit.gvsig.fmap.ViewPort; |
66 | 1453 | luisw | import com.iver.cit.gvsig.fmap.drivers.DriverIOException; |
67 | 2778 | fjp | import com.iver.cit.gvsig.fmap.drivers.VectorialDatabaseDriver; |
68 | 1828 | fernando | import com.iver.cit.gvsig.fmap.drivers.VectorialFileDriver; |
69 | 562 | fernando | import com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection; |
70 | import com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData; |
||
71 | import com.iver.cit.gvsig.fmap.operations.Cancellable; |
||
72 | import com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor; |
||
73 | 926 | fernando | import com.iver.cit.gvsig.fmap.operations.strategies.VisitException; |
74 | 2659 | fjp | import com.iver.cit.gvsig.fmap.rendering.VectorialLegend; |
75 | 894 | vcaballero | import com.iver.utiles.StringUtilities; |
76 | 562 | fernando | import com.iver.utiles.XMLEntity; |
77 | 541 | vcaballero | |
78 | 214 | fernando | /**
|
79 | * Representa un nodo interno en el ?rbol de capas
|
||
80 | */
|
||
81 | 1005 | vcaballero | public class FLayers extends FLyrDefault implements VectorialData, |
82 | LayerCollection { |
||
83 | 524 | vcaballero | //ArrayList de Listener registrados.
|
84 | private ArrayList layerListeners = new ArrayList(); |
||
85 | 2981 | fjp | private List layers = Collections.synchronizedList(new ArrayList()); |
86 | 694 | fernando | private FMap fmap;
|
87 | 1005 | vcaballero | |
88 | 524 | vcaballero | /**
|
89 | * Crea un nuevo FLayers.
|
||
90 | 1005 | vcaballero | *
|
91 | * @param fmap
|
||
92 | * @param parent
|
||
93 | 524 | vcaballero | */
|
94 | 694 | fernando | public FLayers(FMap fmap, FLayers parent) {
|
95 | setParentLayer(parent); |
||
96 | this.fmap = fmap;
|
||
97 | 524 | vcaballero | } |
98 | 257 | vcaballero | |
99 | 524 | vcaballero | /**
|
100 | * A?ade un listener de los eventos de la colecci?n de capas
|
||
101 | *
|
||
102 | 1005 | vcaballero | * @param listener
|
103 | 524 | vcaballero | */
|
104 | public void addLayerCollectionListener(LayerCollectionListener listener) { |
||
105 | layerListeners.add(listener); |
||
106 | } |
||
107 | 1005 | vcaballero | |
108 | /**
|
||
109 | * @see com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection#setAllVisibles(boolean)
|
||
110 | */
|
||
111 | public void setAllVisibles(boolean visible) { |
||
112 | 708 | fernando | FLayer lyr; |
113 | 214 | fernando | |
114 | 524 | vcaballero | for (int i = 0; i < layers.size(); i++) { |
115 | lyr = ((FLayer) layers.get(i)); |
||
116 | 708 | fernando | lyr.setVisible(visible); |
117 | 1005 | vcaballero | |
118 | if (lyr instanceof LayerCollection) { |
||
119 | 708 | fernando | ((LayerCollection) lyr).setAllVisibles(visible); |
120 | } |
||
121 | 524 | vcaballero | } |
122 | } |
||
123 | 346 | fernando | |
124 | 524 | vcaballero | /**
|
125 | 1005 | vcaballero | * Elimina un listener de los eventos de la colecci?n de capas
|
126 | 524 | vcaballero | *
|
127 | 1005 | vcaballero | * @param listener
|
128 | 524 | vcaballero | */
|
129 | public void removeLayerCollectionListener(LayerCollectionListener listener) { |
||
130 | layerListeners.remove(listener); |
||
131 | } |
||
132 | 214 | fernando | |
133 | 524 | vcaballero | /**
|
134 | 1005 | vcaballero | * A?ade una capa.
|
135 | 524 | vcaballero | *
|
136 | 1005 | vcaballero | * @param layer
|
137 | 524 | vcaballero | */
|
138 | private void doAddLayer(FLayer layer) { |
||
139 | layers.add(layer); |
||
140 | 694 | fernando | layer.setParentLayer(this);
|
141 | 524 | vcaballero | } |
142 | 270 | vcaballero | |
143 | 524 | vcaballero | /**
|
144 | * A?ade una capa al final de la lista de subcapas
|
||
145 | *
|
||
146 | 1005 | vcaballero | * @param layer
|
147 | 524 | vcaballero | *
|
148 | * @throws CancelationException
|
||
149 | */
|
||
150 | public void addLayer(FLayer layer) throws CancelationException { |
||
151 | 2608 | caballero | if (layer instanceof FLayers){ |
152 | FLayers layers=(FLayers)layer; |
||
153 | fmap.addAsCollectionListener(layers); |
||
154 | } |
||
155 | 1081 | fernando | callLayerAdding(LayerCollectionEvent.createLayerAddingEvent(layer)); |
156 | 214 | fernando | |
157 | 524 | vcaballero | doAddLayer(layer); |
158 | 404 | fjp | |
159 | 1081 | fernando | callLayerAdded(LayerCollectionEvent.createLayerAddedEvent(layer)); |
160 | 524 | vcaballero | } |
161 | 404 | fjp | |
162 | 524 | vcaballero | /**
|
163 | * Mueve una capa de la posici?n from a la posici?n to. (Se supone que
|
||
164 | * est?n dentro del mismo nivel). Para mover entre niveles, usar otro
|
||
165 | * m?todo (por hacer)
|
||
166 | *
|
||
167 | 1005 | vcaballero | * @param from origen.
|
168 | * @param to destino.
|
||
169 | 524 | vcaballero | *
|
170 | * @throws CancelationException
|
||
171 | */
|
||
172 | public void moveTo(int from, int to) throws CancelationException { |
||
173 | 2356 | vcaballero | int newfrom=layers.size()-from-1; |
174 | int newto=layers.size()-to-1; |
||
175 | FLayer aux = (FLayer) layers.get(newfrom); |
||
176 | callLayerMoving(LayerPositionEvent.createLayerMovingEvent(aux, newfrom, newto)); |
||
177 | layers.remove(newfrom); |
||
178 | layers.add(newto, aux); |
||
179 | callLayerMoved(LayerPositionEvent.createLayerMovedEvent(aux, newfrom, newto)); |
||
180 | 524 | vcaballero | } |
181 | 257 | vcaballero | |
182 | 524 | vcaballero | /**
|
183 | 1005 | vcaballero | * Borra una capa del ArrayList que contiene a las capas.
|
184 | 524 | vcaballero | *
|
185 | 1005 | vcaballero | * @param lyr FLayer.
|
186 | 524 | vcaballero | */
|
187 | private void doRemoveLayer(FLayer lyr) { |
||
188 | 2198 | vcaballero | layers.remove(lyr); |
189 | 524 | vcaballero | } |
190 | 214 | fernando | |
191 | 524 | vcaballero | /**
|
192 | 1005 | vcaballero | * Borra una capa de la colecci?n de capas.
|
193 | 524 | vcaballero | *
|
194 | 1005 | vcaballero | * @param lyr FLayer
|
195 | 524 | vcaballero | *
|
196 | 1005 | vcaballero | * @throws CancelationException
|
197 | 524 | vcaballero | */
|
198 | public void removeLayer(FLayer lyr) throws CancelationException { |
||
199 | 1081 | fernando | callLayerRemoving(LayerCollectionEvent.createLayerRemovingEvent(lyr)); |
200 | 524 | vcaballero | doRemoveLayer(lyr); |
201 | 1081 | fernando | callLayerRemoved(LayerCollectionEvent.createLayerRemovedEvent(lyr)); |
202 | 524 | vcaballero | } |
203 | 214 | fernando | |
204 | 524 | vcaballero | /**
|
205 | * Borra una FLayer del vector a partir del identificador.
|
||
206 | *
|
||
207 | * @param idLayer
|
||
208 | */
|
||
209 | public void removeLayer(int idLayer) { |
||
210 | 1081 | fernando | FLayer lyr = (FLayer) layers.get(idLayer); |
211 | callLayerRemoving(LayerCollectionEvent.createLayerRemovingEvent(lyr)); |
||
212 | 524 | vcaballero | layers.remove(idLayer); |
213 | 1081 | fernando | callLayerRemoved(LayerCollectionEvent.createLayerRemovedEvent(lyr)); |
214 | 524 | vcaballero | } |
215 | 257 | vcaballero | |
216 | 524 | vcaballero | /**
|
217 | * M?todo de conveniencia para borrar una capa con ese nombre
|
||
218 | *
|
||
219 | * @param layerName
|
||
220 | */
|
||
221 | public void removeLayer(String layerName) { |
||
222 | FLayer lyr; |
||
223 | 214 | fernando | |
224 | 524 | vcaballero | for (int i = 0; i < layers.size(); i++) { |
225 | lyr = ((FLayer) layers.get(i)); |
||
226 | 402 | fjp | |
227 | 524 | vcaballero | if (lyr.getName().compareToIgnoreCase(layerName) == 0) { |
228 | 1081 | fernando | removeLayer(i); |
229 | 214 | fernando | |
230 | 524 | vcaballero | break;
|
231 | } |
||
232 | } |
||
233 | } |
||
234 | 214 | fernando | |
235 | 524 | vcaballero | /**
|
236 | * Obtiene el array de capas visibles que penden del arbol cuya ra?z es
|
||
237 | * este nodo
|
||
238 | *
|
||
239 | 1005 | vcaballero | * @return Vector de FLayer.
|
240 | 524 | vcaballero | */
|
241 | public FLayer[] getVisibles() { |
||
242 | ArrayList array = new ArrayList(); |
||
243 | 404 | fjp | |
244 | 524 | vcaballero | for (Iterator iter = layers.iterator(); iter.hasNext();) { |
245 | if (((FLayer) iter.next()).isVisible()) {
|
||
246 | array.add((FLayer) iter.next()); |
||
247 | } |
||
248 | } |
||
249 | 404 | fjp | |
250 | 524 | vcaballero | return (FLayer[]) array.toArray(new FLayer[0]); |
251 | } |
||
252 | 404 | fjp | |
253 | 524 | vcaballero | /**
|
254 | * Obtiene el hijo i-?simo directo de esta colecci?n
|
||
255 | *
|
||
256 | 1005 | vcaballero | * @param index ?ndice.
|
257 | 524 | vcaballero | *
|
258 | 1005 | vcaballero | * @return capa seleccionada.
|
259 | 524 | vcaballero | */
|
260 | public FLayer getLayer(int index) { |
||
261 | return (FLayer) layers.get(index);
|
||
262 | } |
||
263 | 242 | vcaballero | |
264 | 524 | vcaballero | /**
|
265 | * M?todo de conveniencia para buscar una capa por su nombre Es conveniente
|
||
266 | * usar getLayer(int) siempre que se pueda, es m?s directo.
|
||
267 | *
|
||
268 | 1005 | vcaballero | * @param layerName nombre.
|
269 | 524 | vcaballero | *
|
270 | 1005 | vcaballero | * @return capa seleccionada.
|
271 | 524 | vcaballero | */
|
272 | public FLayer getLayer(String layerName) { |
||
273 | FLayer lyr; |
||
274 | 242 | vcaballero | |
275 | 524 | vcaballero | for (int i = 0; i < layers.size(); i++) { |
276 | lyr = ((FLayer) layers.get(i)); |
||
277 | 242 | vcaballero | |
278 | 524 | vcaballero | if (lyr.getName().compareToIgnoreCase(layerName) == 0) { |
279 | return lyr;
|
||
280 | } |
||
281 | } |
||
282 | 346 | fernando | |
283 | 524 | vcaballero | return null; |
284 | } |
||
285 | 346 | fernando | |
286 | 524 | vcaballero | /**
|
287 | * Obtiene el n?mero de capas que hay en su mismo nivel Es decir, no cuenta
|
||
288 | * las subcapas de un FLayers
|
||
289 | *
|
||
290 | 1005 | vcaballero | * @return n?mero de capas.
|
291 | 524 | vcaballero | */
|
292 | public int getLayersCount() { |
||
293 | return layers.size();
|
||
294 | } |
||
295 | 346 | fernando | |
296 | 524 | vcaballero | /**
|
297 | 1056 | vcaballero | * @see com.iver.cit.gvsig.fmap.layers.FLayer#draw(java.awt.image.BufferedImage,
|
298 | 524 | vcaballero | * java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort)
|
299 | */
|
||
300 | public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort, |
||
301 | 2531 | caballero | Cancellable cancel,double scale) throws DriverException { |
302 | 2411 | caballero | //double scale = getFMap().getScaleView();
|
303 | 2981 | fjp | Iterator iter = layers.iterator();
|
304 | try
|
||
305 | { |
||
306 | while (iter.hasNext())
|
||
307 | { |
||
308 | // for (int i=0; i < layers.size(); i++) {
|
||
309 | FLayer lyr = (FLayer) iter.next(); |
||
310 | // FLayer lyr = (FLayer) layers.get(i);
|
||
311 | if (lyr.isVisible()) {
|
||
312 | |||
313 | long t1 = System.currentTimeMillis(); |
||
314 | synchronized (this) { |
||
315 | //Sincronizaci?n del m?todo dibujar de cada Layer, esto es posible hacerlo de otra forma,
|
||
316 | //pero de momento se queda as?, para solucionar el refresco de una misma vista que est? a?adida en el Layout.
|
||
317 | lyr.draw(image, g, viewPort, cancel,scale); |
||
318 | } |
||
319 | long t2 = System.currentTimeMillis(); |
||
320 | System.out.println("Layer " + lyr.getName() + " " |
||
321 | + (t2-t1) + " milisecs.");
|
||
322 | } |
||
323 | } |
||
324 | if (getVirtualLayers() != null) { |
||
325 | getVirtualLayers().draw(image, g, viewPort, cancel,scale); |
||
326 | } |
||
327 | } |
||
328 | catch (ConcurrentModificationException e) |
||
329 | { |
||
330 | System.err.println(e.getMessage());
|
||
331 | } |
||
332 | 524 | vcaballero | } |
333 | |||
334 | /**
|
||
335 | 1005 | vcaballero | * @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D,
|
336 | * com.iver.cit.gvsig.fmap.ViewPort,
|
||
337 | * com.iver.cit.gvsig.fmap.operations.Cancellable)
|
||
338 | 524 | vcaballero | */
|
339 | 2531 | caballero | public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel,double scale) |
340 | 1005 | vcaballero | throws DriverException {
|
341 | 2510 | fjp | |
342 | // TODO: A la hora de imprimir, isWithinScale falla, porque est?
|
||
343 | // calculando la escala en pantalla, no para el layout.
|
||
344 | // Revisar esto.
|
||
345 | |||
346 | 650 | vcaballero | for (Iterator iter = layers.iterator(); iter.hasNext();) { |
347 | FLayer lyr = (FLayer) iter.next(); |
||
348 | 2531 | caballero | lyr.print(g, viewPort, cancel,scale); |
349 | } |
||
350 | if (getVirtualLayers() != null) { |
||
351 | getVirtualLayers().print( g, viewPort, cancel,scale); |
||
352 | } |
||
353 | 524 | vcaballero | } |
354 | |||
355 | /**
|
||
356 | * @see com.iver.cit.gvsig.fmap.layers.FLayer#getFullExtent()
|
||
357 | */
|
||
358 | 651 | fernando | public Rectangle2D getFullExtent() throws DriverException { |
359 | 524 | vcaballero | Rectangle2D rAux = null; |
360 | int i = 0; |
||
361 | |||
362 | for (Iterator iter = layers.iterator(); iter.hasNext();) { |
||
363 | 533 | vcaballero | FLayer capa = (FLayer) iter.next(); |
364 | 524 | vcaballero | |
365 | if (i == 0) { |
||
366 | rAux = capa.getFullExtent(); |
||
367 | } else {
|
||
368 | rAux.add(capa.getFullExtent()); |
||
369 | } |
||
370 | |||
371 | i++; |
||
372 | } |
||
373 | |||
374 | return rAux;
|
||
375 | } |
||
376 | 1005 | vcaballero | |
377 | 524 | vcaballero | /**
|
378 | 1005 | vcaballero | * Llama al m?todo layerAdding de los listeners dados de alta.
|
379 | 524 | vcaballero | *
|
380 | 1005 | vcaballero | * @param event
|
381 | 524 | vcaballero | *
|
382 | * @throws CancelationException
|
||
383 | */
|
||
384 | private void callLayerAdding(LayerCollectionEvent event) |
||
385 | throws CancelationException {
|
||
386 | 2284 | jmorell | ArrayList aux = (ArrayList) layerListeners.clone(); |
387 | for (Iterator iter = aux.iterator(); iter.hasNext();) { |
||
388 | 524 | vcaballero | ((LayerCollectionListener) iter.next()).layerAdding(event); |
389 | } |
||
390 | } |
||
391 | 257 | vcaballero | |
392 | 524 | vcaballero | /**
|
393 | 1005 | vcaballero | * Llama al m?todo layerRemoving de los listeners dados de alta.
|
394 | 524 | vcaballero | *
|
395 | 1005 | vcaballero | * @param event
|
396 | 524 | vcaballero | *
|
397 | * @throws CancelationException
|
||
398 | */
|
||
399 | private void callLayerRemoving(LayerCollectionEvent event) |
||
400 | throws CancelationException {
|
||
401 | 2284 | jmorell | ArrayList aux = (ArrayList) layerListeners.clone(); |
402 | for (Iterator iter = aux.iterator(); iter.hasNext();) { |
||
403 | 524 | vcaballero | ((LayerCollectionListener) iter.next()).layerRemoving(event); |
404 | } |
||
405 | } |
||
406 | 257 | vcaballero | |
407 | 524 | vcaballero | /**
|
408 | 1005 | vcaballero | * Llama al m?todo layerMoving de los listeners dados de alta.
|
409 | 524 | vcaballero | *
|
410 | 1005 | vcaballero | * @param event
|
411 | 524 | vcaballero | *
|
412 | * @throws CancelationException
|
||
413 | */
|
||
414 | private void callLayerMoving(LayerPositionEvent event) |
||
415 | throws CancelationException {
|
||
416 | 2284 | jmorell | ArrayList aux = (ArrayList) layerListeners.clone(); |
417 | for (Iterator iter = aux.iterator(); iter.hasNext();) { |
||
418 | 524 | vcaballero | ((LayerCollectionListener) iter.next()).layerMoving(event); |
419 | } |
||
420 | } |
||
421 | 353 | fernando | |
422 | 524 | vcaballero | /**
|
423 | 1005 | vcaballero | * Llama al m?todo layerAdded de los listeners dados de alta.
|
424 | 524 | vcaballero | *
|
425 | 1005 | vcaballero | * @param event
|
426 | 524 | vcaballero | */
|
427 | private void callLayerAdded(LayerCollectionEvent event) { |
||
428 | 2284 | jmorell | ArrayList aux = (ArrayList) layerListeners.clone(); |
429 | for (Iterator iter = aux.iterator(); iter.hasNext();) { |
||
430 | 524 | vcaballero | ((LayerCollectionListener) iter.next()).layerAdded(event); |
431 | } |
||
432 | } |
||
433 | 353 | fernando | |
434 | 524 | vcaballero | /**
|
435 | 1005 | vcaballero | * Llama al m?todo layerRemoved de los listeners dados de alta.
|
436 | 524 | vcaballero | *
|
437 | 1005 | vcaballero | * @param event
|
438 | 524 | vcaballero | */
|
439 | private void callLayerRemoved(LayerCollectionEvent event) { |
||
440 | 2284 | jmorell | ArrayList aux = (ArrayList) layerListeners.clone(); |
441 | for (Iterator iter = aux.iterator(); iter.hasNext();) { |
||
442 | 524 | vcaballero | ((LayerCollectionListener) iter.next()).layerRemoved(event); |
443 | } |
||
444 | } |
||
445 | 353 | fernando | |
446 | 435 | vcaballero | /**
|
447 | 1005 | vcaballero | * Llama al m?todo layerMoved de los listeners dados de alta.
|
448 | 524 | vcaballero | *
|
449 | 1005 | vcaballero | * @param event
|
450 | 524 | vcaballero | */
|
451 | private void callLayerMoved(LayerPositionEvent event) { |
||
452 | 2284 | jmorell | ArrayList aux = (ArrayList) layerListeners.clone(); |
453 | for (Iterator iter = aux.iterator(); iter.hasNext();) { |
||
454 | 524 | vcaballero | ((LayerCollectionListener) iter.next()).layerMoved(event); |
455 | } |
||
456 | } |
||
457 | |||
458 | /**
|
||
459 | 1828 | fernando | * @throws XMLException
|
460 | 435 | vcaballero | * @see com.iver.cit.gvsig.fmap.layers.FLayer#getProperties()
|
461 | */
|
||
462 | 1828 | fernando | public XMLEntity getXMLEntity() throws XMLException { |
463 | 524 | vcaballero | XMLEntity xml = super.getXMLEntity();
|
464 | xml.putProperty("numLayers", layers.size());
|
||
465 | 1005 | vcaballero | |
466 | String[] s = new String[layers.size()]; |
||
467 | |||
468 | for (int i = 0; i < layers.size(); i++) { |
||
469 | s[i] = ((FLayer) layers.get(i)).getName(); |
||
470 | 558 | vcaballero | } |
471 | 1005 | vcaballero | |
472 | xml.putProperty("LayerNames", s);
|
||
473 | |||
474 | 524 | vcaballero | for (int i = 0; i < layers.size(); i++) { |
475 | xml.addChild(((FLayer) layers.get(i)).getXMLEntity()); |
||
476 | 435 | vcaballero | } |
477 | 524 | vcaballero | |
478 | 435 | vcaballero | return xml;
|
479 | } |
||
480 | 341 | fernando | |
481 | 435 | vcaballero | /**
|
482 | 1056 | vcaballero | * DOCUMENT ME!
|
483 | *
|
||
484 | * @param xml DOCUMENT ME!
|
||
485 | *
|
||
486 | * @throws XMLException
|
||
487 | *
|
||
488 | 435 | vcaballero | * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#setXMLEntity(com.iver.utiles.XMLEntity)
|
489 | */
|
||
490 | 2183 | fernando | public void setXMLEntity03(XMLEntity xml) throws XMLException { |
491 | super.setXMLEntity03(xml);
|
||
492 | |||
493 | int numLayers = xml.getIntProperty("numLayers"); |
||
494 | |||
495 | String[] s = xml.getStringArrayProperty("LayerNames"); |
||
496 | try {
|
||
497 | for (int i = 0; i < numLayers; i++) { |
||
498 | FLayer layer = null;
|
||
499 | |||
500 | String className = xml.getChild(i).getStringProperty("className"); |
||
501 | |||
502 | if (className.equals(FLyrVect.class.getName())) {
|
||
503 | if (xml.getChild(i).contains("file")) { |
||
504 | |||
505 | layer = LayerFactory.createLayer(s[i], |
||
506 | (VectorialFileDriver)LayerFactory.getDM().getDriver(xml.getChild(i).getStringProperty("driverName")),
|
||
507 | new File(xml.getChild(i).getStringProperty("file")), |
||
508 | this.getFMap().getViewPort().getProjection());
|
||
509 | |||
510 | } else if (true) { |
||
511 | //TODO falta por implementar
|
||
512 | } else if (true) { |
||
513 | //TODO falta por implementar
|
||
514 | } |
||
515 | |||
516 | layer.setXMLEntity03(xml.getChild(i)); |
||
517 | // Comprobar que la proyecci?n es la misma que la de FMap
|
||
518 | // Si no lo es, es una capa que est? reproyectada al vuelo
|
||
519 | IProjection proj = layer.getProjection(); |
||
520 | if (proj != null) |
||
521 | if (proj != fmap.getProjection())
|
||
522 | { |
||
523 | ICoordTrans ct = new CoordTrans((CoordSys) proj,
|
||
524 | (CoordSys) fmap.getProjection()); |
||
525 | layer.setCoordTrans(ct); |
||
526 | System.err.println("coordTrans = " + |
||
527 | proj.getAbrev() + " " +
|
||
528 | fmap.getProjection().getAbrev()); |
||
529 | } |
||
530 | |||
531 | } else if (className.equals(FLyrWMS.class.getName())) { |
||
532 | try {
|
||
533 | layer = LayerFactory.createLayer(s[i], |
||
534 | StringUtilities.string2Rect( |
||
535 | xml.getChild(i).getStringProperty("fullExtent")),
|
||
536 | new URL(xml.getChild(i).getStringProperty("host")), |
||
537 | xml.getChild(i).getStringProperty("format"),
|
||
538 | xml.getChild(i).getStringProperty("layerQuery"),
|
||
539 | xml.getChild(i).getStringProperty("infoLayerQuery"),
|
||
540 | xml.getChild(i).getStringProperty("srs"));
|
||
541 | } catch (MalformedURLException e) { |
||
542 | throw new XMLException(e); |
||
543 | } |
||
544 | } else if (className.equals((FLyrRaster.class.getName()))) { |
||
545 | //if (xml.getChild(i).contains("file")) {
|
||
546 | /*layer = LayerFactory.createLayer(s[i],
|
||
547 | xml.getChild(i).getStringProperty("driverName"),
|
||
548 | new File(xml.getChild(i).getStringProperty("file")),
|
||
549 | this.getFMap().getViewPort().getProjection());*/
|
||
550 | layer = new FLyrRaster();
|
||
551 | layer.setName(s[i]); |
||
552 | if (!xml.getChild(i).contains("proj")) |
||
553 | ((FLyrRaster)layer).setProjection(this.getFMap().getViewPort().getProjection());
|
||
554 | layer.setXMLEntity03(xml.getChild(i)); |
||
555 | try {
|
||
556 | layer.load(); |
||
557 | } catch (DriverIOException e) {
|
||
558 | throw new XMLException(e); |
||
559 | } |
||
560 | |||
561 | 2234 | vcaballero | }else if (className.equals((FLayers.class.getName()))) { |
562 | layer = new FLayers(getFMap(),this); |
||
563 | layer.setXMLEntity(xml.getChild(i)); |
||
564 | 2183 | fernando | } else {
|
565 | // Capas Nuevas (externas)
|
||
566 | try {
|
||
567 | Class clase = Class.forName(className); |
||
568 | layer = (FLayer) clase.newInstance(); |
||
569 | layer.setName(s[i]); |
||
570 | layer.setXMLEntity03(xml.getChild(i)); |
||
571 | try {
|
||
572 | layer.load(); |
||
573 | } catch (DriverIOException e) {
|
||
574 | throw new XMLException(e); |
||
575 | } |
||
576 | } catch (Exception e) { |
||
577 | //e.printStackTrace();
|
||
578 | throw new XMLException(e); |
||
579 | } |
||
580 | } |
||
581 | |||
582 | 2234 | vcaballero | this.addLayer(layer);
|
583 | 2183 | fernando | } |
584 | } catch (DriverException e) {
|
||
585 | throw new XMLException(e); |
||
586 | } catch (DriverLoadException e) {
|
||
587 | throw new XMLException(e); |
||
588 | } |
||
589 | |||
590 | } |
||
591 | |||
592 | /**
|
||
593 | * DOCUMENT ME!
|
||
594 | *
|
||
595 | * @param xml DOCUMENT ME!
|
||
596 | *
|
||
597 | * @throws XMLException
|
||
598 | *
|
||
599 | * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#setXMLEntity(com.iver.utiles.XMLEntity)
|
||
600 | */
|
||
601 | 1056 | vcaballero | public void setXMLEntity(XMLEntity xml) throws XMLException { |
602 | 442 | vcaballero | super.setXMLEntity(xml);
|
603 | 1005 | vcaballero | |
604 | 894 | vcaballero | int numLayers = xml.getIntProperty("numLayers"); |
605 | 524 | vcaballero | |
606 | 1005 | vcaballero | String[] s = xml.getStringArrayProperty("LayerNames"); |
607 | 1060 | fjp | try {
|
608 | for (int i = 0; i < numLayers; i++) { |
||
609 | FLayer layer = null;
|
||
610 | |||
611 | String className = xml.getChild(i).getStringProperty("className"); |
||
612 | |||
613 | if (className.equals(FLyrVect.class.getName())) {
|
||
614 | 1828 | fernando | String type = xml.getChild(i).getStringProperty("type"); |
615 | if ("vectorial".equals(type)){ |
||
616 | 2411 | caballero | //String recordsetName = xml.getChild(i).getStringProperty("recordset-name");
|
617 | 2659 | fjp | IProjection proj = null;
|
618 | if (xml.getChild(i).contains("proj")) { |
||
619 | proj = ProjectionPool.get(xml.getChild(i).getStringProperty("proj"));
|
||
620 | } |
||
621 | else
|
||
622 | { |
||
623 | proj = this.getFMap().getViewPort().getProjection();
|
||
624 | } |
||
625 | 1828 | fernando | if (xml.getChild(i).contains("file")) { |
626 | Driver d;
|
||
627 | try {
|
||
628 | d = LayerFactory.getDM().getDriver(xml.getChild(i).getStringProperty("driverName"));
|
||
629 | } catch (DriverLoadException e1) {
|
||
630 | throw new XMLException(e1); |
||
631 | } |
||
632 | layer = LayerFactory.createLayer(s[i], (VectorialFileDriver) d, |
||
633 | new File(xml.getChild(i).getStringProperty("file")), |
||
634 | 2659 | fjp | proj); |
635 | 1828 | fernando | |
636 | 2778 | fjp | } |
637 | if (xml.getChild(i).contains("db")) { |
||
638 | |||
639 | String driverName = xml.getChild(i).getStringProperty("db"); |
||
640 | VectorialDatabaseDriver driver; |
||
641 | try {
|
||
642 | driver = (VectorialDatabaseDriver) LayerFactory.getDM().getDriver(driverName); |
||
643 | driver.setXMLEntity(xml.getChild(i).getChild(2));
|
||
644 | layer = LayerFactory.createDBLayer(driver, s[i], proj); |
||
645 | } catch (DriverLoadException e) {
|
||
646 | e.printStackTrace(); |
||
647 | throw new XMLException(e); |
||
648 | } |
||
649 | } |
||
650 | |||
651 | 1828 | fernando | } else if ("raster".equals(type)) { |
652 | /* if (xml.getChild(i).contains("file")) {
|
||
653 | Driver d = LayerFactory.getDM().getDriver(xml.getChild(i).getStringProperty("driverName"));
|
||
654 | layer = LayerFactory.createLayer(s[i],
|
||
655 | ,
|
||
656 | new File(xml.getChild(i).getStringProperty("file")),
|
||
657 | this.getFMap().getViewPort().getProjection());
|
||
658 | |||
659 | }
|
||
660 | */ }
|
||
661 | 1060 | fjp | |
662 | layer.setXMLEntity(xml.getChild(i)); |
||
663 | 2659 | fjp | |
664 | 1417 | fjp | |
665 | 1060 | fjp | } else if (className.equals(FLyrWMS.class.getName())) { |
666 | try {
|
||
667 | layer = LayerFactory.createLayer(s[i], |
||
668 | StringUtilities.string2Rect( |
||
669 | xml.getChild(i).getStringProperty("fullExtent")),
|
||
670 | new URL(xml.getChild(i).getStringProperty("host")), |
||
671 | xml.getChild(i).getStringProperty("format"),
|
||
672 | 1416 | fernando | xml.getChild(i).getStringProperty("layerQuery"),
|
673 | 1060 | fjp | xml.getChild(i).getStringProperty("infoLayerQuery"),
|
674 | xml.getChild(i).getStringProperty("srs"));
|
||
675 | 2183 | fernando | layer.setXMLEntity(xml.getChild(i)); |
676 | 1060 | fjp | } catch (MalformedURLException e) { |
677 | throw new XMLException(e); |
||
678 | } |
||
679 | } else if (className.equals((FLyrRaster.class.getName()))) { |
||
680 | //if (xml.getChild(i).contains("file")) {
|
||
681 | 1453 | luisw | /*layer = LayerFactory.createLayer(s[i],
|
682 | 1005 | vcaballero | xml.getChild(i).getStringProperty("driverName"),
|
683 | new File(xml.getChild(i).getStringProperty("file")),
|
||
684 | 1453 | luisw | this.getFMap().getViewPort().getProjection());*/
|
685 | layer = new FLyrRaster();
|
||
686 | layer.setName(s[i]); |
||
687 | 1472 | luisw | if (!xml.getChild(i).contains("proj")) |
688 | ((FLyrRaster)layer).setProjection(this.getFMap().getViewPort().getProjection());
|
||
689 | 1453 | luisw | layer.setXMLEntity(xml.getChild(i)); |
690 | try {
|
||
691 | layer.load(); |
||
692 | } catch (DriverIOException e) {
|
||
693 | throw new XMLException(e); |
||
694 | } |
||
695 | 1060 | fjp | |
696 | 2198 | vcaballero | }else if (className.equals((FLayers.class.getName()))) { |
697 | layer = new FLayers(getFMap(),this); |
||
698 | layer.setXMLEntity(xml.getChild(i)); |
||
699 | 1488 | luisw | } else {
|
700 | // Capas Nuevas (externas)
|
||
701 | try {
|
||
702 | Class clase = Class.forName(className); |
||
703 | layer = (FLayer) clase.newInstance(); |
||
704 | layer.setName(s[i]); |
||
705 | layer.setXMLEntity(xml.getChild(i)); |
||
706 | try {
|
||
707 | layer.load(); |
||
708 | } catch (DriverIOException e) {
|
||
709 | throw new XMLException(e); |
||
710 | } |
||
711 | } catch (Exception e) { |
||
712 | 1503 | luisw | //e.printStackTrace();
|
713 | 1488 | luisw | throw new XMLException(e); |
714 | } |
||
715 | 894 | vcaballero | } |
716 | 1060 | fjp | |
717 | 2198 | vcaballero | this.addLayer(layer);
|
718 | 2659 | fjp | // Comprobar que la proyecci?n es la misma que la de FMap
|
719 | // Si no lo es, es una capa que est? reproyectada al vuelo
|
||
720 | IProjection proj = layer.getProjection(); |
||
721 | if ((proj != null)) |
||
722 | if (proj != getFMap().getProjection())
|
||
723 | { |
||
724 | ICoordTrans ct = new CoordTrans((CoordSys) proj,
|
||
725 | (CoordSys) getFMap().getProjection()); |
||
726 | // TODO: REVISAR CON LUIS
|
||
727 | // Se lo fijamos a todas, luego cada una que se reproyecte
|
||
728 | // si puede, o que no haga nada
|
||
729 | layer.setCoordTrans(ct); |
||
730 | // NOTA: DESPU?S DE ESTO DEBER?AMOS CREAR LAS ETIQUETAS
|
||
731 | // SI ES NECESARIO.
|
||
732 | // TODO: REVISAR A FONDO ESTO, PORQUE LAS ETIQUETAS SE CREAN
|
||
733 | // 2 VECES SI HAY REPROYECC?N
|
||
734 | if (layer instanceof FLyrVect) |
||
735 | { |
||
736 | FLyrVect lyrVect = (FLyrVect)layer; |
||
737 | VectorialLegend legend = (VectorialLegend) lyrVect.getLegend(); |
||
738 | if (legend.getLabelField() != null) { |
||
739 | lyrVect.createLabelLayer(lyrVect.getRecordset()); |
||
740 | } |
||
741 | |||
742 | } |
||
743 | } |
||
744 | |||
745 | 894 | vcaballero | } |
746 | 1060 | fjp | } catch (DriverException e) {
|
747 | throw new XMLException(e); |
||
748 | 435 | vcaballero | } |
749 | 1060 | fjp | |
750 | 435 | vcaballero | } |
751 | 562 | fernando | |
752 | /**
|
||
753 | 1005 | vcaballero | * @see com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData#process(com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor,
|
754 | 2969 | fjp | * FBitSet)
|
755 | 562 | fernando | */
|
756 | 2969 | fjp | public void process(FeatureVisitor visitor, FBitSet subset) |
757 | 1005 | vcaballero | throws DriverException, VisitException {
|
758 | 562 | fernando | for (Iterator iter = layers.iterator(); iter.hasNext();) { |
759 | FLayer layer = (FLayer) iter.next(); |
||
760 | 1005 | vcaballero | |
761 | 562 | fernando | if (layer instanceof VectorialData) { |
762 | ((VectorialData) layer).process(visitor, subset); |
||
763 | } |
||
764 | } |
||
765 | } |
||
766 | |||
767 | /**
|
||
768 | * @see com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData#process(com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor)
|
||
769 | */
|
||
770 | 1005 | vcaballero | public void process(FeatureVisitor visitor) |
771 | throws DriverException, VisitException {
|
||
772 | 562 | fernando | for (Iterator iter = layers.iterator(); iter.hasNext();) { |
773 | FLayer layer = (FLayer) iter.next(); |
||
774 | 1005 | vcaballero | |
775 | if (layer.isActive()) {
|
||
776 | 661 | fjp | if (layer instanceof VectorialData) { |
777 | ((VectorialData) layer).process(visitor); |
||
778 | } |
||
779 | 1005 | vcaballero | } |
780 | 562 | fernando | } |
781 | } |
||
782 | 694 | fernando | |
783 | /**
|
||
784 | * @see com.iver.cit.gvsig.fmap.layers.FLayer#getFMap()
|
||
785 | */
|
||
786 | public FMap getFMap() {
|
||
787 | return fmap;
|
||
788 | } |
||
789 | 885 | fjp | |
790 | /* (non-Javadoc)
|
||
791 | * @see com.iver.cit.gvsig.fmap.layers.FLayer#setCoordTrans(org.cresques.cts.ICoordTrans)
|
||
792 | */
|
||
793 | public void setCoordTrans(ICoordTrans ct) { |
||
794 | super.setCoordTrans(ct);
|
||
795 | 1005 | vcaballero | |
796 | 885 | fjp | for (Iterator iter = layers.iterator(); iter.hasNext();) { |
797 | FLayer layer = (FLayer) iter.next(); |
||
798 | layer.setCoordTrans(ct); |
||
799 | 1005 | vcaballero | } |
800 | 885 | fjp | } |
801 | 1005 | vcaballero | |
802 | /**
|
||
803 | * @see com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection#setAllActives(boolean)
|
||
804 | */
|
||
805 | public void setAllActives(boolean active) { |
||
806 | FLayer lyr; |
||
807 | |||
808 | for (int i = 0; i < layers.size(); i++) { |
||
809 | lyr = ((FLayer) layers.get(i)); |
||
810 | lyr.setActive(active); |
||
811 | |||
812 | if (lyr instanceof LayerCollection) { |
||
813 | ((LayerCollection) lyr).setAllActives(active); |
||
814 | } |
||
815 | } |
||
816 | } |
||
817 | |||
818 | /**
|
||
819 | * @see com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection#getActives()
|
||
820 | */
|
||
821 | public FLayer[] getActives() { |
||
822 | ArrayList ret = new ArrayList(); |
||
823 | |||
824 | for (int i = 0; i < layers.size(); i++) { |
||
825 | if (((FLayer) layers.get(i)).isActive()) {
|
||
826 | ret.add(layers.get(i)); |
||
827 | 2234 | vcaballero | }else{
|
828 | if (layers.get(i) instanceof FLayers){ |
||
829 | FLayer[] lyrs=((FLayers) layers.get(i)).getActives();
|
||
830 | for (int j=0;j<lyrs.length;j++){ |
||
831 | ret.add(lyrs[j]); |
||
832 | } |
||
833 | } |
||
834 | 1005 | vcaballero | } |
835 | } |
||
836 | |||
837 | return (FLayer[]) ret.toArray(new FLayer[0]); |
||
838 | } |
||
839 | 1176 | fjp | |
840 | /* (non-Javadoc)
|
||
841 | * @see com.iver.cit.gvsig.fmap.layers.FLayer#getMinScale()
|
||
842 | */
|
||
843 | public double getMinScale() { |
||
844 | return -1; // La visibilidad o no la controla cada capa |
||
845 | // dentro de una colecci?n
|
||
846 | } |
||
847 | |||
848 | /* (non-Javadoc)
|
||
849 | * @see com.iver.cit.gvsig.fmap.layers.FLayer#getMaxScale()
|
||
850 | */
|
||
851 | public double getMaxScale() { |
||
852 | return -1; |
||
853 | } |
||
854 | public void setMinScale(double minScale) |
||
855 | { |
||
856 | for (Iterator iter = layers.iterator(); iter.hasNext();) { |
||
857 | FLayer lyr = (FLayer) iter.next(); |
||
858 | lyr.setMinScale(minScale); |
||
859 | } |
||
860 | } |
||
861 | public void setMaxScale(double maxScale) |
||
862 | { |
||
863 | for (Iterator iter = layers.iterator(); iter.hasNext();) { |
||
864 | FLayer lyr = (FLayer) iter.next(); |
||
865 | lyr.setMinScale(maxScale); |
||
866 | } |
||
867 | } |
||
868 | 2411 | caballero | public void setActive(boolean b){ |
869 | super.setActive(b);
|
||
870 | for (int i=0;i<layers.size();i++){ |
||
871 | ((FLayer)layers.get(i)).setActive(b); |
||
872 | } |
||
873 | } |
||
874 | 1176 | fjp | |
875 | 214 | fernando | } |