Statistics
| Revision:

root / trunk / libraries / libFMap / src / com / iver / cit / gvsig / fmap / layers / FLayers.java @ 1680

History | View | Annotate | Download (17.1 KB)

1
/* 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
package com.iver.cit.gvsig.fmap.layers;
42

    
43
import com.iver.cit.gvsig.fmap.DriverException;
44
import com.iver.cit.gvsig.fmap.FMap;
45
import com.iver.cit.gvsig.fmap.ViewPort;
46
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
47
import com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection;
48
import com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData;
49
import com.iver.cit.gvsig.fmap.operations.Cancellable;
50
import com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor;
51
import com.iver.cit.gvsig.fmap.operations.strategies.VisitException;
52

    
53
import com.iver.utiles.StringUtilities;
54
import com.iver.utiles.XMLEntity;
55

    
56
import org.cresques.cts.ICoordTrans;
57
import org.cresques.cts.IProjection;
58
import org.cresques.cts.gt2.CoordSys;
59
import org.cresques.cts.gt2.CoordTrans;
60

    
61
import java.awt.Graphics2D;
62
import java.awt.geom.Rectangle2D;
63
import java.awt.image.BufferedImage;
64

    
65
import java.io.File;
66

    
67
import java.net.MalformedURLException;
68
import java.net.URL;
69

    
70
import java.util.ArrayList;
71
import java.util.BitSet;
72
import java.util.Iterator;
73

    
74
/**
75
 * Representa un nodo interno en el ?rbol de capas
76
 */
77
public class FLayers extends FLyrDefault implements VectorialData,
78
        LayerCollection {
79
        //ArrayList de Listener registrados.
80
        private ArrayList layerListeners = new ArrayList();
81
        private ArrayList layers = new ArrayList(4);
82
        private FMap fmap;
83

    
84
        /**
85
         * Crea un nuevo FLayers.
86
         *
87
         * @param fmap
88
         * @param parent
89
         */
90
        public FLayers(FMap fmap, FLayers parent) {
91
                setParentLayer(parent);
92
                this.fmap = fmap;
93
        }
94

    
95
        /**
96
         * A?ade un listener de los eventos de la colecci?n de capas
97
         *
98
         * @param listener
99
         */
100
        public void addLayerCollectionListener(LayerCollectionListener listener) {
101
                layerListeners.add(listener);
102
        }
103

    
104
        /**
105
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection#setAllVisibles(boolean)
106
         */
107
        public void setAllVisibles(boolean visible) {
108
                FLayer lyr;
109

    
110
                for (int i = 0; i < layers.size(); i++) {
111
                        lyr = ((FLayer) layers.get(i));
112
                        lyr.setVisible(visible);
113

    
114
                        if (lyr instanceof LayerCollection) {
115
                                ((LayerCollection) lyr).setAllVisibles(visible);
116
                        }
117
                }
118
        }
119

    
120
        /**
121
         * Elimina un listener de los eventos de la colecci?n de capas
122
         *
123
         * @param listener
124
         */
125
        public void removeLayerCollectionListener(LayerCollectionListener listener) {
126
                layerListeners.remove(listener);
127
        }
128

    
129
        /**
130
         * A?ade una capa.
131
         *
132
         * @param layer
133
         */
134
        private void doAddLayer(FLayer layer) {
135
                layers.add(layer);
136
                layer.setParentLayer(this);
137
        }
138

    
139
        /**
140
         * A?ade una capa al final de la lista de subcapas
141
         *
142
         * @param layer
143
         *
144
         * @throws CancelationException
145
         */
146
        public void addLayer(FLayer layer) throws CancelationException {
147
                callLayerAdding(LayerCollectionEvent.createLayerAddingEvent(layer));
148

    
149
                doAddLayer(layer);
150

    
151
                callLayerAdded(LayerCollectionEvent.createLayerAddedEvent(layer));
152
        }
153

    
154
        /**
155
         * Mueve una capa de la posici?n from a la posici?n to. (Se supone que
156
         * est?n dentro del mismo nivel). Para mover entre niveles, usar otro
157
         * m?todo (por hacer)
158
         *
159
         * @param from origen.
160
         * @param to destino.
161
         *
162
         * @throws CancelationException
163
         */
164
        public void moveTo(int from, int to) throws CancelationException {
165
                FLayer aux = (FLayer) layers.get(from);
166
                callLayerMoving(LayerPositionEvent.createLayerMovingEvent(aux, from, to));
167
                layers.remove(from);
168
                layers.add(to, aux);
169
                callLayerMoved(LayerPositionEvent.createLayerMovedEvent(aux, from, to));
170
        }
171

    
172
        /**
173
         * Borra una capa del ArrayList que contiene a las capas.
174
         *
175
         * @param lyr FLayer.
176
         */
177
        private void doRemoveLayer(FLayer lyr) {
178
                layers.remove(lyr);
179
        }
180

    
181
        /**
182
         * Borra una capa de la colecci?n de capas.
183
         *
184
         * @param lyr FLayer
185
         *
186
         * @throws CancelationException
187
         */
188
        public void removeLayer(FLayer lyr) throws CancelationException {
189
                callLayerRemoving(LayerCollectionEvent.createLayerRemovingEvent(lyr));
190
                doRemoveLayer(lyr);
191
                callLayerRemoved(LayerCollectionEvent.createLayerRemovedEvent(lyr));
192
        }
193

    
194
        /**
195
         * Borra una FLayer del vector a partir del identificador.
196
         *
197
         * @param idLayer
198
         */
199
        public void removeLayer(int idLayer) {
200
                FLayer lyr = (FLayer) layers.get(idLayer);
201
                callLayerRemoving(LayerCollectionEvent.createLayerRemovingEvent(lyr));
202
                layers.remove(idLayer);
203
                callLayerRemoved(LayerCollectionEvent.createLayerRemovedEvent(lyr));
204
        }
205

    
206
        /**
207
         * M?todo de conveniencia para borrar una capa con ese nombre
208
         *
209
         * @param layerName
210
         */
211
        public void removeLayer(String layerName) {
212
                FLayer lyr;
213

    
214
                for (int i = 0; i < layers.size(); i++) {
215
                        lyr = ((FLayer) layers.get(i));
216

    
217
                        if (lyr.getName().compareToIgnoreCase(layerName) == 0) {
218
                                removeLayer(i);
219

    
220
                                break;
221
                        }
222
                }
223
        }
224

    
225
        /**
226
         * Obtiene el array de capas visibles que penden del arbol cuya ra?z es
227
         * este nodo
228
         *
229
         * @return Vector de FLayer.
230
         */
231
        public FLayer[] getVisibles() {
232
                ArrayList array = new ArrayList();
233

    
234
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
235
                        if (((FLayer) iter.next()).isVisible()) {
236
                                array.add((FLayer) iter.next());
237
                        }
238
                }
239

    
240
                return (FLayer[]) array.toArray(new FLayer[0]);
241
        }
242

    
243
        /**
244
         * Obtiene el hijo i-?simo directo de esta colecci?n
245
         *
246
         * @param index ?ndice.
247
         *
248
         * @return capa seleccionada.
249
         */
250
        public FLayer getLayer(int index) {
251
                return (FLayer) layers.get(index);
252
        }
253

    
254
        /**
255
         * M?todo de conveniencia para buscar una capa por su nombre Es conveniente
256
         * usar getLayer(int) siempre que se pueda, es m?s directo.
257
         *
258
         * @param layerName nombre.
259
         *
260
         * @return capa seleccionada.
261
         */
262
        public FLayer getLayer(String layerName) {
263
                FLayer lyr;
264

    
265
                for (int i = 0; i < layers.size(); i++) {
266
                        lyr = ((FLayer) layers.get(i));
267

    
268
                        if (lyr.getName().compareToIgnoreCase(layerName) == 0) {
269
                                return lyr;
270
                        }
271
                }
272

    
273
                return null;
274
        }
275

    
276
        /**
277
         * Obtiene el n?mero de capas que hay en su mismo nivel Es decir, no cuenta
278
         * las subcapas de un FLayers
279
         *
280
         * @return n?mero de capas.
281
         */
282
        public int getLayersCount() {
283
                return layers.size();
284
        }
285

    
286
        /**
287
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#draw(java.awt.image.BufferedImage,
288
         *                 java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort)
289
         */
290
        public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
291
                Cancellable cancel) throws DriverException {
292
            double scale = getFMap().getScaleView();
293
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
294
                        FLayer lyr = (FLayer) iter.next();
295

    
296
                        if (lyr.isVisible()) {
297
                            if (lyr.isWithinScale())
298
                                lyr.draw(image, g, viewPort, cancel);
299
                        }
300
                }
301

    
302
                if (getVirtualLayers() != null) {
303
                        getVirtualLayers().draw(image, g, viewPort, cancel);
304
                }
305
        }
306

    
307
        /**
308
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D,
309
         *                 com.iver.cit.gvsig.fmap.ViewPort,
310
         *                 com.iver.cit.gvsig.fmap.operations.Cancellable)
311
         */
312
        public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel)
313
                throws DriverException {
314
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
315
                        FLayer lyr = (FLayer) iter.next();
316

    
317
                        if (lyr.isVisible()) {
318
                                lyr.print(g, viewPort, cancel);
319
                        }
320
                }
321
        }
322

    
323
        /**
324
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getFullExtent()
325
         */
326
        public Rectangle2D getFullExtent() throws DriverException {
327
                Rectangle2D rAux = null;
328
                int i = 0;
329

    
330
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
331
                        FLayer capa = (FLayer) iter.next();
332

    
333
                        if (i == 0) {
334
                                rAux = capa.getFullExtent();
335
                        } else {
336
                                rAux.add(capa.getFullExtent());
337
                        }
338

    
339
                        i++;
340
                }
341

    
342
                return rAux;
343
        }
344

    
345
        /**
346
         * Llama al m?todo layerAdding de los listeners dados de alta.
347
         *
348
         * @param event
349
         *
350
         * @throws CancelationException
351
         */
352
        private void callLayerAdding(LayerCollectionEvent event)
353
                throws CancelationException {
354
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
355
                        ((LayerCollectionListener) iter.next()).layerAdding(event);
356
                }
357
        }
358

    
359
        /**
360
         * Llama al m?todo layerRemoving de los listeners dados de alta.
361
         *
362
         * @param event
363
         *
364
         * @throws CancelationException
365
         */
366
        private void callLayerRemoving(LayerCollectionEvent event)
367
                throws CancelationException {
368
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
369
                        ((LayerCollectionListener) iter.next()).layerRemoving(event);
370
                }
371
        }
372

    
373
        /**
374
         * Llama al m?todo layerMoving de los listeners dados de alta.
375
         *
376
         * @param event
377
         *
378
         * @throws CancelationException
379
         */
380
        private void callLayerMoving(LayerPositionEvent event)
381
                throws CancelationException {
382
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
383
                        ((LayerCollectionListener) iter.next()).layerMoving(event);
384
                }
385
        }
386

    
387
        /**
388
         * Llama al m?todo layerAdded de los listeners dados de alta.
389
         *
390
         * @param event
391
         */
392
        private void callLayerAdded(LayerCollectionEvent event) {
393
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
394
                        ((LayerCollectionListener) iter.next()).layerAdded(event);
395
                }
396
        }
397

    
398
        /**
399
         * Llama al m?todo layerRemoved de los listeners dados de alta.
400
         *
401
         * @param event
402
         */
403
        private void callLayerRemoved(LayerCollectionEvent event) {
404
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
405
                        ((LayerCollectionListener) iter.next()).layerRemoved(event);
406
                }
407
        }
408

    
409
        /**
410
         * Llama al m?todo layerMoved de los listeners dados de alta.
411
         *
412
         * @param event
413
         */
414
        private void callLayerMoved(LayerPositionEvent event) {
415
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
416
                        ((LayerCollectionListener) iter.next()).layerMoved(event);
417
                }
418
        }
419

    
420
        /**
421
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getProperties()
422
         */
423
        public XMLEntity getXMLEntity() {
424
                XMLEntity xml = super.getXMLEntity();
425
                xml.putProperty("numLayers", layers.size());
426

    
427
                String[] s = new String[layers.size()];
428

    
429
                for (int i = 0; i < layers.size(); i++) {
430
                        s[i] = ((FLayer) layers.get(i)).getName();
431
                }
432

    
433
                xml.putProperty("LayerNames", s);
434

    
435
                for (int i = 0; i < layers.size(); i++) {
436
                        xml.addChild(((FLayer) layers.get(i)).getXMLEntity());
437
                }
438

    
439
                return xml;
440
        }
441

    
442
        /**
443
         * DOCUMENT ME!
444
         *
445
         * @param xml DOCUMENT ME!
446
         *
447
         * @throws XMLException
448
         *
449
         * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#setXMLEntity(com.iver.utiles.XMLEntity)
450
         */
451
        public void setXMLEntity(XMLEntity xml) throws XMLException {
452
                super.setXMLEntity(xml);
453

    
454
                int numLayers = xml.getIntProperty("numLayers");
455

    
456
                String[] s = xml.getStringArrayProperty("LayerNames");
457
                try {
458
                        for (int i = 0; i < numLayers; i++) {
459
                                FLayer layer = null;
460
        
461
                                String className = xml.getChild(i).getStringProperty("className");
462
        
463
                                if (className.equals(FLyrVect.class.getName())) {
464
                                        if (xml.getChild(i).contains("file")) {
465
        
466
                                                        layer = LayerFactory.createLayer(s[i],
467
                                                                        xml.getChild(i).getStringProperty("driverName"),
468
                                                                        new File(xml.getChild(i).getStringProperty("file")),
469
                                                                        this.getFMap().getViewPort().getProjection());
470
                                                                                                                    
471
                                        } else if (true) {
472
                                                //TODO falta por implementar
473
                                        } else if (true) {
474
                                                //TODO falta por implementar
475
                                        }
476
        
477
                                        layer.setXMLEntity(xml.getChild(i));
478
                                        // Comprobar que la proyecci?n es la misma que la de FMap
479
                                        // Si no lo es, es una capa que est? reproyectada al vuelo 
480
                                        IProjection proj = layer.getProjection();
481
                                        if (proj != null)
482
                                            if (proj != fmap.getProjection())
483
                                            {
484
                                                        ICoordTrans ct = new CoordTrans((CoordSys) proj,
485
                                                                        (CoordSys) fmap.getProjection());
486
                                                        layer.setCoordTrans(ct);
487
                                                        System.err.println("coordTrans = " +
488
                                                                proj.getAbrev() + " " +
489
                                                                fmap.getProjection().getAbrev());
490
                                            }
491
                                        
492
                                } else if (className.equals(FLyrWMS.class.getName())) {
493
                                        try {
494
                                                layer = LayerFactory.createLayer(s[i],
495
                                                                StringUtilities.string2Rect(
496
                                                                        xml.getChild(i).getStringProperty("fullExtent")),
497
                                                                new URL(xml.getChild(i).getStringProperty("host")),
498
                                                                xml.getChild(i).getStringProperty("format"),
499
                                                                xml.getChild(i).getStringProperty("layerQuery"),
500
                                                                xml.getChild(i).getStringProperty("infoLayerQuery"),
501
                                                                xml.getChild(i).getStringProperty("srs"));
502
                                        } catch (MalformedURLException e) {
503
                                                throw new XMLException(e);
504
                                        }
505
                                } else if (className.equals((FLyrRaster.class.getName()))) {
506
                                        //if (xml.getChild(i).contains("file")) {
507
                                        /*layer = LayerFactory.createLayer(s[i],
508
                                                        xml.getChild(i).getStringProperty("driverName"),
509
                                                        new File(xml.getChild(i).getStringProperty("file")),
510
                                                        this.getFMap().getViewPort().getProjection());*/
511
                                        layer = new FLyrRaster();
512
                                        layer.setName(s[i]);
513
                                        if (!xml.getChild(i).contains("proj"))
514
                                                ((FLyrRaster)layer).setProjection(this.getFMap().getViewPort().getProjection());
515
                                        layer.setXMLEntity(xml.getChild(i));
516
                                        try {
517
                                                layer.load();
518
                                        } catch (DriverIOException e) {
519
                                                throw new XMLException(e);
520
                                        }
521
        
522
                                        //} else if (true) {
523
                                        //TODO falta por implementar
524
                                        //} else if (true) {
525
                                        //TODO falta por implementar
526
                                        //}
527
                                        //TODO Falta por implementar
528
                                } else {
529
                                        // Capas Nuevas (externas)
530
                                        try {
531
                                                Class clase = Class.forName(className);
532
                                                layer = (FLayer) clase.newInstance();
533
                                                layer.setName(s[i]);
534
                                                layer.setXMLEntity(xml.getChild(i));
535
                                                try {
536
                                                        layer.load();
537
                                                } catch (DriverIOException e) {
538
                                                        throw new XMLException(e);
539
                                                }
540
                                        } catch (Exception e) {
541
                                                //e.printStackTrace();
542
                                                throw new XMLException(e);
543
                                        }
544
                                }
545
        
546
                                fmap.getLayers().addLayer(layer);
547
                        }
548
                } catch (DriverException e) {
549
                        throw new XMLException(e);
550
                }
551
                
552
        }
553

    
554
        /**
555
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData#process(com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor,
556
         *                 java.util.BitSet)
557
         */
558
        public void process(FeatureVisitor visitor, BitSet subset)
559
                throws DriverException, VisitException {
560
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
561
                        FLayer layer = (FLayer) iter.next();
562

    
563
                        if (layer instanceof VectorialData) {
564
                                ((VectorialData) layer).process(visitor, subset);
565
                        }
566
                }
567
        }
568

    
569
        /**
570
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData#process(com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor)
571
         */
572
        public void process(FeatureVisitor visitor)
573
                throws DriverException, VisitException {
574
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
575
                        FLayer layer = (FLayer) iter.next();
576

    
577
                        if (layer.isActive()) {
578
                                if (layer instanceof VectorialData) {
579
                                        ((VectorialData) layer).process(visitor);
580
                                }
581
                        }
582
                }
583
        }
584

    
585
        /**
586
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getFMap()
587
         */
588
        public FMap getFMap() {
589
                return fmap;
590
        }
591

    
592
        /* (non-Javadoc)
593
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#setCoordTrans(org.cresques.cts.ICoordTrans)
594
         */
595
        public void setCoordTrans(ICoordTrans ct) {
596
                super.setCoordTrans(ct);
597

    
598
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
599
                        FLayer layer = (FLayer) iter.next();
600
                        layer.setCoordTrans(ct);
601
                }
602
        }
603

    
604
        /**
605
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection#setAllActives(boolean)
606
         */
607
        public void setAllActives(boolean active) {
608
                FLayer lyr;
609

    
610
                for (int i = 0; i < layers.size(); i++) {
611
                        lyr = ((FLayer) layers.get(i));
612
                        lyr.setActive(active);
613

    
614
                        if (lyr instanceof LayerCollection) {
615
                                ((LayerCollection) lyr).setAllActives(active);
616
                        }
617
                }
618
        }
619

    
620
        /**
621
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection#getActives()
622
         */
623
        public FLayer[] getActives() {
624
                ArrayList ret = new ArrayList();
625

    
626
                for (int i = 0; i < layers.size(); i++) {
627
                        if (((FLayer) layers.get(i)).isActive()) {
628
                                ret.add(layers.get(i));
629
                        }
630
                }
631

    
632
                return (FLayer[]) ret.toArray(new FLayer[0]);
633
        }
634

    
635
    /* (non-Javadoc)
636
     * @see com.iver.cit.gvsig.fmap.layers.FLayer#getMinScale()
637
     */
638
    public double getMinScale() {
639
        return -1; // La visibilidad o no la controla cada capa
640
                // dentro de una colecci?n
641
    }
642

    
643
    /* (non-Javadoc)
644
     * @see com.iver.cit.gvsig.fmap.layers.FLayer#getMaxScale()
645
     */
646
    public double getMaxScale() {
647
        return -1;
648
    }
649
    public void setMinScale(double minScale)
650
    {
651
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
652
                        FLayer lyr = (FLayer) iter.next();
653
                        lyr.setMinScale(minScale);
654
                }
655
    }
656
    public void setMaxScale(double maxScale)
657
    {
658
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
659
                        FLayer lyr = (FLayer) iter.next();
660
                        lyr.setMinScale(maxScale);
661
                }
662
    }
663
    
664
}