Statistics
| Revision:

svn-gvsig-desktop / tags / Root_Fmap_GisPlanet / libraries / libFMap / src / com / iver / cit / gvsig / fmap / layers / FLayers.java @ 1826

History | View | Annotate | Download (17.3 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
                            {                                
299
                                long t1 = System.currentTimeMillis();
300
                                lyr.draw(image, g, viewPort, cancel);
301
                                        long t2 = System.currentTimeMillis();
302
                                        System.out.println("Layer " + lyr.getName() + " "
303
                                                + (t2-t1) + " milisecs.");        
304
                            }
305
                        }
306
                }
307

    
308
                if (getVirtualLayers() != null) {
309
                        getVirtualLayers().draw(image, g, viewPort, cancel);
310
                }
311
        }
312

    
313
        /**
314
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D,
315
         *                 com.iver.cit.gvsig.fmap.ViewPort,
316
         *                 com.iver.cit.gvsig.fmap.operations.Cancellable)
317
         */
318
        public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel)
319
                throws DriverException {
320
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
321
                        FLayer lyr = (FLayer) iter.next();
322

    
323
                        if (lyr.isVisible()) {
324
                                lyr.print(g, viewPort, cancel);
325
                        }
326
                }
327
        }
328

    
329
        /**
330
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getFullExtent()
331
         */
332
        public Rectangle2D getFullExtent() throws DriverException {
333
                Rectangle2D rAux = null;
334
                int i = 0;
335

    
336
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
337
                        FLayer capa = (FLayer) iter.next();
338

    
339
                        if (i == 0) {
340
                                rAux = capa.getFullExtent();
341
                        } else {
342
                                rAux.add(capa.getFullExtent());
343
                        }
344

    
345
                        i++;
346
                }
347

    
348
                return rAux;
349
        }
350

    
351
        /**
352
         * Llama al m?todo layerAdding de los listeners dados de alta.
353
         *
354
         * @param event
355
         *
356
         * @throws CancelationException
357
         */
358
        private void callLayerAdding(LayerCollectionEvent event)
359
                throws CancelationException {
360
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
361
                        ((LayerCollectionListener) iter.next()).layerAdding(event);
362
                }
363
        }
364

    
365
        /**
366
         * Llama al m?todo layerRemoving de los listeners dados de alta.
367
         *
368
         * @param event
369
         *
370
         * @throws CancelationException
371
         */
372
        private void callLayerRemoving(LayerCollectionEvent event)
373
                throws CancelationException {
374
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
375
                        ((LayerCollectionListener) iter.next()).layerRemoving(event);
376
                }
377
        }
378

    
379
        /**
380
         * Llama al m?todo layerMoving de los listeners dados de alta.
381
         *
382
         * @param event
383
         *
384
         * @throws CancelationException
385
         */
386
        private void callLayerMoving(LayerPositionEvent event)
387
                throws CancelationException {
388
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
389
                        ((LayerCollectionListener) iter.next()).layerMoving(event);
390
                }
391
        }
392

    
393
        /**
394
         * Llama al m?todo layerAdded de los listeners dados de alta.
395
         *
396
         * @param event
397
         */
398
        private void callLayerAdded(LayerCollectionEvent event) {
399
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
400
                        ((LayerCollectionListener) iter.next()).layerAdded(event);
401
                }
402
        }
403

    
404
        /**
405
         * Llama al m?todo layerRemoved de los listeners dados de alta.
406
         *
407
         * @param event
408
         */
409
        private void callLayerRemoved(LayerCollectionEvent event) {
410
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
411
                        ((LayerCollectionListener) iter.next()).layerRemoved(event);
412
                }
413
        }
414

    
415
        /**
416
         * Llama al m?todo layerMoved de los listeners dados de alta.
417
         *
418
         * @param event
419
         */
420
        private void callLayerMoved(LayerPositionEvent event) {
421
                for (Iterator iter = layerListeners.iterator(); iter.hasNext();) {
422
                        ((LayerCollectionListener) iter.next()).layerMoved(event);
423
                }
424
        }
425

    
426
        /**
427
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getProperties()
428
         */
429
        public XMLEntity getXMLEntity() {
430
                XMLEntity xml = super.getXMLEntity();
431
                xml.putProperty("numLayers", layers.size());
432

    
433
                String[] s = new String[layers.size()];
434

    
435
                for (int i = 0; i < layers.size(); i++) {
436
                        s[i] = ((FLayer) layers.get(i)).getName();
437
                }
438

    
439
                xml.putProperty("LayerNames", s);
440

    
441
                for (int i = 0; i < layers.size(); i++) {
442
                        xml.addChild(((FLayer) layers.get(i)).getXMLEntity());
443
                }
444

    
445
                return xml;
446
        }
447

    
448
        /**
449
         * DOCUMENT ME!
450
         *
451
         * @param xml DOCUMENT ME!
452
         *
453
         * @throws XMLException
454
         *
455
         * @see com.iver.cit.gvsig.fmap.layers.FLyrDefault#setXMLEntity(com.iver.utiles.XMLEntity)
456
         */
457
        public void setXMLEntity(XMLEntity xml) throws XMLException {
458
                super.setXMLEntity(xml);
459

    
460
                int numLayers = xml.getIntProperty("numLayers");
461

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

    
560
        /**
561
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData#process(com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor,
562
         *                 java.util.BitSet)
563
         */
564
        public void process(FeatureVisitor visitor, BitSet subset)
565
                throws DriverException, VisitException {
566
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
567
                        FLayer layer = (FLayer) iter.next();
568

    
569
                        if (layer instanceof VectorialData) {
570
                                ((VectorialData) layer).process(visitor, subset);
571
                        }
572
                }
573
        }
574

    
575
        /**
576
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.VectorialData#process(com.iver.cit.gvsig.fmap.operations.strategies.FeatureVisitor)
577
         */
578
        public void process(FeatureVisitor visitor)
579
                throws DriverException, VisitException {
580
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
581
                        FLayer layer = (FLayer) iter.next();
582

    
583
                        if (layer.isActive()) {
584
                                if (layer instanceof VectorialData) {
585
                                        ((VectorialData) layer).process(visitor);
586
                                }
587
                        }
588
                }
589
        }
590

    
591
        /**
592
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#getFMap()
593
         */
594
        public FMap getFMap() {
595
                return fmap;
596
        }
597

    
598
        /* (non-Javadoc)
599
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#setCoordTrans(org.cresques.cts.ICoordTrans)
600
         */
601
        public void setCoordTrans(ICoordTrans ct) {
602
                super.setCoordTrans(ct);
603

    
604
                for (Iterator iter = layers.iterator(); iter.hasNext();) {
605
                        FLayer layer = (FLayer) iter.next();
606
                        layer.setCoordTrans(ct);
607
                }
608
        }
609

    
610
        /**
611
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection#setAllActives(boolean)
612
         */
613
        public void setAllActives(boolean active) {
614
                FLayer lyr;
615

    
616
                for (int i = 0; i < layers.size(); i++) {
617
                        lyr = ((FLayer) layers.get(i));
618
                        lyr.setActive(active);
619

    
620
                        if (lyr instanceof LayerCollection) {
621
                                ((LayerCollection) lyr).setAllActives(active);
622
                        }
623
                }
624
        }
625

    
626
        /**
627
         * @see com.iver.cit.gvsig.fmap.layers.layerOperations.LayerCollection#getActives()
628
         */
629
        public FLayer[] getActives() {
630
                ArrayList ret = new ArrayList();
631

    
632
                for (int i = 0; i < layers.size(); i++) {
633
                        if (((FLayer) layers.get(i)).isActive()) {
634
                                ret.add(layers.get(i));
635
                        }
636
                }
637

    
638
                return (FLayer[]) ret.toArray(new FLayer[0]);
639
        }
640

    
641
    /* (non-Javadoc)
642
     * @see com.iver.cit.gvsig.fmap.layers.FLayer#getMinScale()
643
     */
644
    public double getMinScale() {
645
        return -1; // La visibilidad o no la controla cada capa
646
                // dentro de una colecci?n
647
    }
648

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