Statistics
| Revision:

root / trunk / extensions / extGeoreferencing / src / com / iver / cit / gvsig / fmap / layers / FLyrPoints.java @ 5762

History | View | Annotate | Download (35.5 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
package com.iver.cit.gvsig.fmap.layers;
20

    
21
import java.awt.Color;
22
import java.awt.Dimension;
23
import java.awt.Graphics2D;
24
import java.awt.geom.Point2D;
25
import java.awt.geom.Rectangle2D;
26
import java.awt.image.BufferedImage;
27
import java.util.ArrayList;
28
import java.util.Iterator;
29

    
30
import org.cresques.cts.ProjectionPool;
31
import org.gvsig.georeferencing.utils.GeoPointPersistence;
32
import org.gvsig.georeferencing.utils.PointManager;
33

    
34
import com.iver.andami.PluginServices;
35
import com.iver.cit.gvsig.fmap.DriverException;
36
import com.iver.cit.gvsig.fmap.ViewPort;
37
import com.iver.cit.gvsig.gui.View;
38
import com.iver.utiles.XMLEntity;
39
import com.iver.utiles.swing.threads.Cancellable;
40

    
41

    
42
/**
43
 * Clase de capa de marcado de puntos sobre una vista. Dibuja un puntero sobre 
44
 * cada punto en la vista. Esta capa hereda de GraphicLayer que es una capa que est?
45
 * metida de forma fija en FMap. Con esto conseguimos que nuestra capa de puntos 
46
 * no aparezca en el TOC y siempre se dibuje por encima de todas las capas. Tiene
47
 * el inconveniente de que est? en FMap y si hacemos un dibujado de las capas 
48
 * sobre un panel que no sea la vista de gvSIG este GraphicLayer no aparece. 
49
 * Si queremos hacer este tipo de dibujados tendremos que dibujar todas las capas
50
 * con el draw de FLayers y al final llamar al draw de FLyrPoints. 
51
 *
52
 * @author Nacho Brodin (brodin_ign@gva.es)
53
 */
54
public class FLyrPoints extends GraphicLayer {
55
        
56
        //**********************Params********************************
57
        /**
58
         * Diametro del centro de la cruz
59
         */
60
        private final int                                 DIAM_CIRCLE = 18;
61
        /**
62
         * ?ltima herramienta seleccionada. Despu?s de marcar el segundo punto en la vista ser? la 
63
         * herramienta por defecto.
64
         */
65
        private String                                         lastTool = "zoomIn";
66
        //**********************End Params****************************
67
        
68
        //**********************Vars**********************************
69
        private ArrayList                                 pointList = new ArrayList();
70
        private boolean                                 showNumber = true;
71
        private FLyrPointsState                 state = null;
72
        private IPersistence                         geoPointPersistence = null;
73
        private FLyrGeoRaster                         lyrGeoRaster = null;
74
        public static boolean                        isDrawing = false;
75
        private        PointManager                        pointManager = null;
76
        private        boolean                                        lyrVisible = true;
77
        private        boolean                                        lyrHideViewOnly = true;
78
        private Point2D[]                                transformPointList = null;
79
        private boolean                                        withoutBlue = false;
80
        private boolean                                        withoutRed = false;
81
        //**********************End Vars**********************************
82
        
83
        //**********************Classes***********************************
84
        /**
85
         * Estado de la capa de puntos. 
86
         * @author Nacho Brodin (brodin_ign@gva.es)
87
         */
88
        public class FLyrPointsState{
89
                public ArrayList pointList = new ArrayList();
90
                public boolean showNumber = true;
91
                public String lastTool = "zoomIn";
92
        }
93
        //**********************End Classes*******************************
94

    
95
        //**********************Methods***********************************
96
        /**
97
         * Constructor
98
         * @param flyGeoRaster
99
         */
100
        public FLyrPoints(FLyrGeoRaster lyGeoRaster, IPersistence persistence){
101
                this.lyrGeoRaster = lyGeoRaster;
102
                geoPointPersistence = persistence;
103
        }
104
        
105
        /**
106
         * Salva el estado actual de la capa de puntos. Podr? ser recuperado
107
         * este ?ltimo estado salvado con la funci?n recoveryState
108
         *
109
         */
110
        public void saveState(){
111
                if(state == null)
112
                        state = new FLyrPointsState();
113
                else
114
                        state.pointList.clear();
115

    
116
                for(int i=0;i<this.length();i++)
117
                        state.pointList.add(((GeoPoint)pointList.get(i)).cloneGeoPoint());
118
                
119
                state.showNumber = showNumber;
120
                state.lastTool = lastTool;
121
        }
122
        
123
        /**
124
         * Recupera el estado de la capa de puntos desde la ?ltima vez que se
125
         * ejecut? la funci?n saveState. Si no hay ning?n estdo salvado es que
126
         * al principio estaba la capa vacia por lo que reiniciamos la capa de puntos.
127
         */
128
        public void recoveryState(){
129
                if(state != null){
130
                        pointList.clear();
131
                        for(int i=0;i<state.pointList.size();i++)
132
                                pointList.add(((GeoPoint)state.pointList.get(i)).cloneGeoPoint());
133
                        
134
                        showNumber = state.showNumber;
135
                        lastTool = state.lastTool;                                
136
                }
137
        }
138
        
139
        /**
140
         * Asigna el array de puntos 
141
         * @param list
142
         */
143
        public void setListPoint(ArrayList list){
144
                pointList = list;
145
        }
146
                
147
        /**
148
         * Dibujado de la capa de raster georeferenciado aplicando la 
149
         * transformaci?n del viewPort.
150
         */
151
        public void draw(BufferedImage image, Graphics2D g, ViewPort vp,
152
                        Cancellable cancel,double scale) throws DriverException {
153
                
154
                Point2D pto = null;
155
                
156
                if(lyrHideViewOnly && lyrVisible && lyrGeoRaster != null){
157
                        //vp = lyrGeoRaster.toImageCoord(vp);
158
                        synchronized (this) {
159
                                for(int i=0; i<pointList.size();i++){
160
                                        //Punto de la imagen
161
                                        if(((GeoPoint)pointList.get(i)).active){
162
                                                        pto = ((GeoPoint)pointList.get(i)).pixelPoint;
163
                                                        if(pto != null){
164
                                                                Point2D p = lyrGeoRaster.img2World(pto);
165
                                                                p = vp.fromMapPoint(p);
166
                                                                drawPixelCrux(g, p, i);
167
                                                        }
168
                                                
169
                                                //Punto de la vista
170
                                                        pto = ((GeoPoint)pointList.get(i)).mapPoint;
171
                                                        if(pto != null){
172
                                                                Point2D p = null;
173
                                                                p = vp.fromMapPoint(pto);
174
                                                                drawMapCrux(g, p, i);
175
                                                        }
176
                                        }
177
                                }
178
                        }
179
                }
180
        }
181
        
182
        /**
183
         * Dibuja el gr?fico que corresponde a los puntos de coordenadas relativas a la imagen de origen
184
         * @param g Graphics sobre el que se dibuja
185
         * @param vp        Viewport 
186
         * @param cancel 
187
         */
188
        public void drawPixelCrux(Graphics2D g, ViewPort vp, Cancellable cancel){
189
                Point2D pto = null;
190
                if(lyrVisible && lyrGeoRaster != null){
191
                        for(int i=0; i<pointList.size();i++){
192
                                if(((GeoPoint)pointList.get(i)).active){
193
                                        pto = ((GeoPoint)pointList.get(i)).pixelPoint;
194
                                        if(pto != null){
195
                                                Point2D p = lyrGeoRaster.img2World(pto);
196
                                                p = vp.fromMapPoint(p);
197
                                                drawPixelCrux(g, p, i);
198
                                        }
199
                                }
200
                        }
201
                }
202
        }
203
        
204
        /**
205
         * Dibuja el gr?fico que corresponde a los puntos de coordenadas de mundo real.
206
         * @param g Graphics sobre el que se dibuja
207
         * @param vp        Viewport 
208
         * @param cancel 
209
         */
210
        public void drawMapCrux(Graphics2D g, ViewPort vp, Cancellable cancel){
211
                Point2D pto = null;
212
                if(lyrVisible && lyrGeoRaster != null){
213
                        for(int i=0; i<pointList.size();i++){
214
                                if(((GeoPoint)pointList.get(i)).active){
215
                                        pto = ((GeoPoint)pointList.get(i)).mapPoint;
216
                                        if(pto != null){
217
                                                Point2D p = null;
218
                                                p = vp.fromMapPoint(pto);
219
                                                drawMapCrux(g, p, i);
220
                                        }
221
                                }
222
                        }
223
                }
224
        }
225
        
226
        /**
227
         * Dibuja sobre el graphics pasado la cruz del punto que marca
228
         * el pixel de la imagen.
229
         * @param g Graphics
230
         */
231
        private void drawPixelCrux(Graphics2D g, Point2D p, int pointNumber){
232
                int dpto = (DIAM_CIRCLE >> 1);
233
                int incr = 5;
234
                g.setColor(Color.WHITE);
235
                g.drawOval(        (int)p.getX() - dpto + 1, 
236
                                        (int)p.getY() - dpto + 1, 
237
                                        DIAM_CIRCLE - 2, 
238
                                        DIAM_CIRCLE - 2);
239
                g.drawLine((int)p.getX() - incr, (int)p.getY() - 1, (int)p.getX() - 1, (int)p.getY() - 1);
240
                g.drawLine((int)p.getX() - incr, (int)p.getY() + 1, (int)p.getX() - 1, (int)p.getY() + 1);
241
                
242
                g.drawLine((int)p.getX() + incr, (int)p.getY() - 1, (int)p.getX() + 1, (int)p.getY() - 1);
243
                g.drawLine((int)p.getX() + incr, (int)p.getY() + 1, (int)p.getX() + 1, (int)p.getY() + 1);
244
                
245
                g.drawLine((int)p.getX() - 1, (int)p.getY() - incr, (int)p.getX() - 1, (int)p.getY() - 1);
246
                g.drawLine((int)p.getX() + 1, (int)p.getY() - incr, (int)p.getX() + 1, (int)p.getY() - 1);
247
                
248
                g.drawLine((int)p.getX() - 1, (int)p.getY() + incr, (int)p.getX() - 1, (int)p.getY() + 1);
249
                g.drawLine((int)p.getX() + 1, (int)p.getY() + incr, (int)p.getX() + 1, (int)p.getY() + 1);
250
                
251
                g.setColor(Color.red);
252
                g.drawOval(        (int)p.getX() - dpto, 
253
                                        (int)p.getY() - dpto, 
254
                                        DIAM_CIRCLE, 
255
                                        DIAM_CIRCLE);
256
                g.drawLine((int)p.getX(), (int)p.getY() - dpto - incr, (int)p.getX(), (int)p.getY() + dpto + incr);
257
                g.drawLine((int)p.getX() - dpto - incr, (int)p.getY(), (int)p.getX() + dpto + incr, (int)p.getY());
258
                                
259
                if(showNumber){
260
                        String pt = String.valueOf(pointNumber + 1);
261
                        int ptX = (int)(p.getX() + dpto + 1);
262
                        int ptY = (int)(p.getY() + dpto - 1);
263
                        g.setColor(Color.WHITE);
264
                        for (int i= -1; i<2; i++)
265
                                for (int j= -1; j<2; j++)
266
                                        g.drawString(pt, ptX + i, ptY + j );
267
                        g.setColor(Color.red);
268
                        g.drawString(pt, ptX, ptY );
269
                }
270
        }
271
        
272
        /**
273
         * Dibuja sobre el graphics pasado la cruz del punto que marca
274
         * la coordenada de la vista.
275
         * @param g Graphics
276
         */
277
        private void drawMapCrux(Graphics2D g, Point2D p, int pointNumber){
278
                int dpto = (DIAM_CIRCLE >> 1);
279
                int incr = 5;
280
                g.setColor(Color.WHITE);
281
                g.drawRect(        (int)p.getX() - dpto + 1, 
282
                                        (int)p.getY() - dpto + 1, 
283
                                        DIAM_CIRCLE - 2, 
284
                                        DIAM_CIRCLE - 2);
285
                g.drawLine((int)p.getX() - incr, (int)p.getY() - 1, (int)p.getX() - 1, (int)p.getY() - 1);
286
                g.drawLine((int)p.getX() - incr, (int)p.getY() + 1, (int)p.getX() - 1, (int)p.getY() + 1);
287
                
288
                g.drawLine((int)p.getX() + incr, (int)p.getY() - 1, (int)p.getX() + 1, (int)p.getY() - 1);
289
                g.drawLine((int)p.getX() + incr, (int)p.getY() + 1, (int)p.getX() + 1, (int)p.getY() + 1);
290
                
291
                g.drawLine((int)p.getX() - 1, (int)p.getY() - incr, (int)p.getX() - 1, (int)p.getY() - 1);
292
                g.drawLine((int)p.getX() + 1, (int)p.getY() - incr, (int)p.getX() + 1, (int)p.getY() - 1);
293
                
294
                g.drawLine((int)p.getX() - 1, (int)p.getY() + incr, (int)p.getX() - 1, (int)p.getY() + 1);
295
                g.drawLine((int)p.getX() + 1, (int)p.getY() + incr, (int)p.getX() + 1, (int)p.getY() + 1);
296
                
297
                g.setColor(new Color(45, 8 , 165));
298
                g.drawRect(        (int)p.getX() - dpto, 
299
                                        (int)p.getY() - dpto, 
300
                                        DIAM_CIRCLE, 
301
                                        DIAM_CIRCLE);
302
                g.drawLine((int)p.getX(), (int)p.getY() - dpto - incr, (int)p.getX(), (int)p.getY() + dpto + incr);
303
                g.drawLine((int)p.getX() - dpto - incr, (int)p.getY(), (int)p.getX() + dpto + incr, (int)p.getY());
304
                if(showNumber){
305
                        String pt = String.valueOf(pointNumber + 1);
306
                        int ptX = (int)(p.getX() + dpto + 1);
307
                        int ptY = (int)(p.getY() - dpto - 1);
308
                        g.setColor(Color.WHITE);
309
                        for (int i= -1; i<2; i++)
310
                                for (int j= -1; j<2; j++)
311
                                        g.drawString(pt, ptX + i, ptY + j );
312
                        g.setColor(new Color(45, 8 , 165));
313
                        g.drawString(String.valueOf(pointNumber + 1), (int)(p.getX() + dpto + 1), (int)(p.getY() - dpto - 1) );
314
                }
315
        }
316
        
317
        /* (non-Javadoc)
318
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort, com.iver.cit.gvsig.fmap.operations.Cancellable, double)
319
         */
320
        public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel,
321
                        double scale) throws DriverException {
322
                // TODO Auto-generated method stub
323

    
324
        }
325
        
326
        /**
327
         * Elimina los puntos de la lista que no tiene las dos coordenadas asignadas.
328
         */
329
        public void clean(){
330
                Iterator iter = pointList.iterator();
331
                while (iter.hasNext()) {
332
                        GeoPoint gp = (GeoPoint) iter.next();
333
                        if(gp.mapPoint == null || gp.pixelPoint == null)
334
                                iter.remove();
335
                }
336
        }
337
        /**
338
         * A?ade un punto a la lista
339
         * @param point punto para la lista
340
         */
341
        public GeoPoint addPoint(Point2D pixel, Point2D map){
342
                GeoPoint p = new GeoPoint(pixel, map);
343
                pointList.add(p);
344
                return p;
345
        }
346
        
347
        /**
348
         * Obtiene el punto de la posici?n pos 
349
         */
350
        public GeoPoint getPoint(int pos){
351
                try{
352
                        return (GeoPoint)pointList.get(pos);
353
                }catch(IndexOutOfBoundsException exc){
354
                        return null;
355
                }
356
        }
357
        
358
        /**
359
         * Elimina la lista de puntos almacenada
360
         */
361
        public void clear(){
362
                pointList = new ArrayList();
363
        }
364
        
365
        /**
366
         * Elimina el punto de la posici?n indicada por el par?metro pos
367
         * @param pos        Posici?n del punto a eliminar
368
         */
369
        public void remove(int pos){
370
                pointList.remove(pos);
371
        }
372
        
373
        /**
374
         *Elimina el ?ltimo punto de la lista.
375
         */
376
        public void delLastPoint(){
377
                pointList.remove(pointList.size() - 1);
378
        }
379
        
380
        /**
381
         * Funci?n que obtiene si un punto es nuevo o no. Un punto es nuevo si todavia
382
         * no han sido asignadas todas sus coordenadas. 
383
         * @param n N?mero de punto a obtener si es nuevo
384
         * @return        true si es nuevo o false si no lo es
385
         */
386
        public boolean isNewPoint(int n){
387
                if(this.getPoint(n) == null)
388
                        return false;
389
                if(this.getPoint(n).pixelPoint == null || this.getPoint(n).mapPoint == null)
390
                        return true;
391
                return false;
392
        }
393
        
394
        /**
395
         * Devuelve el n?mero de puntos de la capa
396
         * @return entero que representa el n?mero de puntos de la capa
397
         */
398
        public int length(){
399
                return pointList.size();
400
        }
401
        
402
        /**
403
         * Actualiza un punto de la lista de una posici?n determinada
404
         * @param point punto para la lista
405
         */
406
        public void updatePoint(Point2D pixel, Point2D map, int pos){
407
                GeoPoint gp = (GeoPoint)pointList.get(pos);
408
                if(pixel != null)
409
                        gp.pixelPoint = pixel;
410
                if(map != null)
411
                        gp.mapPoint = map;
412
        }
413
                
414
        /**
415
         * Calcula el RMS para el punto de la posici?n pos
416
         * @param pos        Posici?n
417
         * @return        valor RMS para el punto solicitado
418
         */
419
        public double calcDoubleRMS(int pos){
420
                if(getPoint(pos).active && transformPointList != null && getPoint(pos).mapPoint != null){
421
                        try{
422
                                double a = (transformPointList[pos].getX() - getPoint(pos).mapPoint.getX());
423
                                double b = (transformPointList[pos].getY() - getPoint(pos).mapPoint.getY());
424
                                return Math.sqrt(a*a + b*b);
425
                        }catch(ArrayIndexOutOfBoundsException e){
426
                                //No hacemos nada pq ha intentado obtener un punto que no existe. Hace un return 0
427
                        }catch(NullPointerException e){
428
                                //No hacemos nada pq el punto a?n no est? completo y est? intentando obtener un valor que no existe.Hace un return 0
429
                        }
430
                }
431
                return -0D;        
432
        }
433
        
434
        /**
435
         * Calcula el RMS para el punto de la posici?n pos
436
         * @param pos        Posici?n
437
         * @return        RMS en forma de String
438
         */
439
        public String calcRMS(int pos){
440
                return String.valueOf(calcDoubleRMS(pos));
441
        }
442
        
443
        /**
444
         * Calcula el residuo en X para el punto de la posici?n pos
445
         * @param pos        Posici?n
446
         * @return                residuo Y en forma de double
447
         */
448
        public double calcDoubleResX(int pos){
449
                if(        getPoint(pos).active &&
450
                        transformPointList != null && 
451
                        transformPointList[pos] != null && 
452
                        getPoint(pos).mapPoint != null){
453
                        try{
454
                                double a = (transformPointList[pos].getX() - getPoint(pos).mapPoint.getX());
455
                                return Math.sqrt(a*a);
456
                        }catch(ArrayIndexOutOfBoundsException e){
457
                                //No hacemos nada pq ha intentado obtener un punto que no existe. Hace un return 0
458
                        }catch(NullPointerException e){
459
                                //No hacemos nada pq el punto a?n no est? completo y est? intentando obtener un valor que no existe.Hace un return 0
460
                        }
461
                }
462
                return -0;
463
        }
464
        
465
        /**
466
         * Calcula el residuo en X para el punto de la posici?n pos
467
         * @param pos        Posici?n
468
         * @return        residuo Y en forma de String
469
         */
470
        public String calcResX(int pos){
471
                return String.valueOf(calcDoubleResX(pos));
472
        }
473
        
474
        /**
475
         * Calcula el residuo en Y para el punto de la posici?n pos
476
         * @param pos        Posici?n
477
         * @return        residuo Y en forma de double
478
         */
479
        public double calcDoubleResY(int pos){
480
                if(        getPoint(pos).active &&
481
                        transformPointList != null && 
482
                        transformPointList[pos] != null &&
483
                        getPoint(pos).mapPoint != null){
484
                        try{
485
                                double b = (transformPointList[pos].getY() - getPoint(pos).mapPoint.getY());
486
                                return Math.sqrt(b*b);
487
                        }catch(ArrayIndexOutOfBoundsException e){
488
                                //No hacemos nada pq ha intentado obtener un punto que no existe. Hace un return 0
489
                        }catch(NullPointerException e){
490
                                //No hacemos nada pq el punto a?n no est? completo y est? intentando obtener un valor que no existe.Hace un return 0
491
                        }
492
                }
493
                return -0D;
494
        }
495
        
496
        /**
497
         * Calcula el residuo en Y para el punto de la posici?n pos
498
         * @param pos        Posici?n
499
         * @return        residuo Y en forma de String
500
         */
501
        public String calcResY(int pos){
502
                return String.valueOf(calcDoubleResY(pos));
503
        }
504
        
505
        /**
506
         * Calcula el error RMS para todos los puntos
507
         * @return        Error RMS total en forma de String
508
         */
509
        public double calcDoubleTotal(){
510
                double add = 0D;
511
                int len = 0;
512
                try{
513
                        for(int i=0;i<transformPointList.length;i++){
514
                                add += calcDoubleRMS(i);
515
                                if(getPoint(i).active)
516
                                        len ++;
517
                        }
518
                }catch(NullPointerException e){
519
                        //transformPointList es null por lo que no hay puntos a transformar devolviendo 0.
520
                        return 0D;
521
                }
522
                return Math.sqrt(add/len);
523
        }
524
        
525
        /**
526
         * Calcula el error RMS para todos los puntos
527
         * @return        Error RMS total en forma de String
528
         */
529
        public String calcTotal(){
530
                return String.valueOf(calcDoubleTotal());
531
        }
532
        
533
        /**
534
         * Muestra en consola los puntos de la capa
535
         */
536
        public void showPoints(){
537
                for(int i=0;i<pointList.size();i++)
538
                        ((GeoPoint)pointList.get(i)).show();
539
        }
540

    
541
        /**
542
         * Salva la lista de puntos sobre el fichero que se la pasa por
543
         * par?metro
544
         * @param file Nombre del fichero
545
         */
546
        public void PointList2XML(String file){;
547
                geoPointPersistence.savePointList(file);
548
        }
549
        
550
        /**
551
         * Recupera una lista de puntos desde un fichero XML
552
         * @param file Nombre del fichero
553
         */ 
554
        public void XML2PointList(String file){
555
                geoPointPersistence.loadPointList(file);
556
        }
557
        
558
        /**
559
         * Salva la lista de puntos en forma tabular sobre el fichero que se la pasa por
560
         * par?metro
561
         * @param file Nombre del fichero
562
         */
563
        public void PointList2Ascii(String file){;
564
                geoPointPersistence.saveAsciiPointList(file);
565
        }
566
        
567
        /* (non-Javadoc)
568
         * @see com.iver.cit.gvsig.fmap.layers.StatusRasterInterface#setXMLEntity(com.iver.utiles.XMLEntity)
569
         */
570
        public void setXMLEntity(XMLEntity xml)throws XMLException {
571
                int nPoints = -1;
572
                if (xml.contains("raster.geoPoints.nPoints")) {
573
                        nPoints = xml.getIntProperty("raster.geoPoints.nPoints");
574
                        GeoPoint point = null;
575
                        Point2D pixel = new Point2D.Double(), map = new Point2D.Double();
576
                        if(nPoints > 0){
577
                                
578
                                for(int i = 0;i<nPoints;i++){
579
                                        
580
                                        if (xml.contains("raster.geoPoint."+i+".pixelX") && xml.contains("raster.geoPoint."+i+".pixelY"))
581
                                                pixel.setLocation(xml.getDoubleProperty("raster.geoPoint."+i+".pixelX"), xml.getDoubleProperty("raster.geoPoint."+i+".pixelY"));
582
                                        
583
                                        if (xml.contains("raster.geoPoint."+i+".mapX") && xml.contains("raster.geoPoint."+i+".mapY"))
584
                                                map.setLocation(xml.getDoubleProperty("raster.geoPoint."+i+".mapX"), xml.getDoubleProperty("raster.geoPoint."+i+".mapY"));
585
                                        
586
                                        point = this.addPoint(pixel, map);
587
                                        
588
                                        if (xml.contains("raster.geoPoint."+i+".active"))
589
                                                point.active = xml.getBooleanProperty("raster.geoPoint."+i+".active");
590
                                        
591
                                        point.leftCenterPoint = new Point2D.Double();
592
                                        if (xml.contains("raster.geoPoint."+i+".leftCenterX") && xml.contains("raster.geoPoint."+i+".leftCenterY"))
593
                                                point.leftCenterPoint.setLocation(xml.getDoubleProperty("raster.geoPoint."+i+".leftCenterX"), xml.getDoubleProperty("raster.geoPoint."+i+".leftCenterY"));
594
                                        
595
                                        point.rightCenterPoint = new Point2D.Double();
596
                                        if (xml.contains("raster.geoPoint."+i+".rightCenterX") && xml.contains("raster.geoPoint."+i+".rightCenterY"))
597
                                                point.rightCenterPoint.setLocation(xml.getDoubleProperty("raster.geoPoint."+i+".rightCenterX"), xml.getDoubleProperty("raster.geoPoint."+i+".rightCenterY"));
598
                                        
599
                                        point.leftViewPort = new ViewPort(null);
600
                                        point.rightViewPort = new ViewPort(null);
601
                                        
602
                                        double x = 0D, y = 0D, w = 0D, h = 0D;
603
                                        int width = 0, height = 0;
604
                                        Rectangle2D r = new Rectangle2D.Double();
605
                                        if (xml.contains("raster.geoPoint."+i+".leftViewPort.proj"))
606
                                                point.leftViewPort.setProjection(ProjectionPool.get(xml.getStringProperty("raster.geoPoint."+i+".leftViewPort.proj")));
607
                                        if (xml.contains("raster.geoPoint."+i+".leftViewPort.x"))
608
                                                x = xml.getDoubleProperty("raster.geoPoint."+i+".leftViewPort.x");
609
                                        if (xml.contains("raster.geoPoint."+i+".leftViewPort.y"))
610
                                                y = xml.getDoubleProperty("raster.geoPoint."+i+".leftViewPort.y");
611
                                        if (xml.contains("raster.geoPoint."+i+".leftViewPort.w"))
612
                                                w = xml.getDoubleProperty("raster.geoPoint."+i+".leftViewPort.w");
613
                                        if (xml.contains("raster.geoPoint."+i+".leftViewPort.h"))
614
                                                h = xml.getDoubleProperty("raster.geoPoint."+i+".leftViewPort.h");
615
                                        r.setRect(x, y, w, h);
616
                                        point.leftViewPort.setExtent(r);
617
                                        if (xml.contains("raster.geoPoint."+i+".leftViewPort.imgWidth"))
618
                                                width = xml.getIntProperty("raster.geoPoint."+i+".leftViewPort.imgWidth");
619
                                        if (xml.contains("raster.geoPoint."+i+".leftViewPort.imgHeight"))
620
                                                height = xml.getIntProperty("raster.geoPoint."+i+".leftViewPort.imgHeight");
621
                                        point.leftViewPort.setImageSize(new Dimension(width, height));
622
                                        
623
                                        r = new Rectangle2D.Double();
624
                                        if (xml.contains("raster.geoPoint."+i+".rightViewPort.proj"))
625
                                                point.rightViewPort.setProjection(ProjectionPool.get(xml.getStringProperty("raster.geoPoint."+i+".rightViewPort.proj")));
626
                                        if (xml.contains("raster.geoPoint."+i+".rightViewPort.x"))
627
                                                x = xml.getDoubleProperty("raster.geoPoint."+i+".rightViewPort.x");
628
                                        if (xml.contains("raster.geoPoint."+i+".rightViewPort.y"))
629
                                                y = xml.getDoubleProperty("raster.geoPoint."+i+".rightViewPort.y");
630
                                        if (xml.contains("raster.geoPoint."+i+".rightViewPort.w"))
631
                                                w = xml.getDoubleProperty("raster.geoPoint."+i+".rightViewPort.w");
632
                                        if (xml.contains("raster.geoPoint."+i+".rightViewPort.h"))
633
                                                h = xml.getDoubleProperty("raster.geoPoint."+i+".rightViewPort.h");
634
                                        r.setRect(x, y, w, h);
635
                                        point.rightViewPort.setExtent(r);
636
                                        if (xml.contains("raster.geoPoint."+i+".rightViewPort.imgWidth"))
637
                                                width = xml.getIntProperty("raster.geoPoint."+i+".rightViewPort.imgWidth");
638
                                        if (xml.contains("raster.geoPoint."+i+".rightViewPort.imgHeight"))
639
                                                height = xml.getIntProperty("raster.geoPoint."+i+".rightViewPort.imgHeight");
640
                                        point.rightViewPort.setImageSize(new Dimension(width, height));
641
                                        
642
                                }
643
                        }
644
                }
645
        }
646
        
647
        /* (non-Javadoc)
648
         * @see com.iver.cit.gvsig.fmap.layers.StatusRasterInterface#getXMLEntity(com.iver.utiles.XMLEntity)
649
         */
650
        public void getXMLEntity(XMLEntity xml) throws XMLException {
651
                xml.putProperty("raster.geoPoints.nPoints", getCountPoints());
652
                for(int i=0;i<this.getCountPoints();i++){
653
                        xml.putProperty("raster.geoPoint."+i+".pixelX", getPoint(i).pixelPoint.getX());        
654
                        xml.putProperty("raster.geoPoint."+i+".pixelY", getPoint(i).pixelPoint.getY());
655
                        xml.putProperty("raster.geoPoint."+i+".mapX", getPoint(i).mapPoint.getX());
656
                        xml.putProperty("raster.geoPoint."+i+".mapY", getPoint(i).mapPoint.getX());
657
                        
658
                        xml.putProperty("raster.geoPoint."+i+".active", getPoint(i).active);
659
                        
660
                        xml.putProperty("raster.geoPoint."+i+".leftCenterX", getPoint(i).leftCenterPoint.getX());
661
                        xml.putProperty("raster.geoPoint."+i+".leftCenterY", getPoint(i).leftCenterPoint.getY());
662
                        xml.putProperty("raster.geoPoint."+i+".rightCenterX", getPoint(i).rightCenterPoint.getX());
663
                        xml.putProperty("raster.geoPoint."+i+".rightCenterY", getPoint(i).rightCenterPoint.getY());
664
                        
665
                        xml.putProperty("raster.geoPoint."+i+".leftViewPort.proj", getPoint(i).leftViewPort.getProjection().getAbrev());
666
                        xml.putProperty("raster.geoPoint."+i+".leftViewPort.x", getPoint(i).leftViewPort.getExtent().getX());
667
                        xml.putProperty("raster.geoPoint."+i+".leftViewPort.y", getPoint(i).leftViewPort.getExtent().getY());
668
                        xml.putProperty("raster.geoPoint."+i+".leftViewPort.w", getPoint(i).leftViewPort.getExtent().getWidth());
669
                        xml.putProperty("raster.geoPoint."+i+".leftViewPort.h", getPoint(i).leftViewPort.getExtent().getHeight());
670
                        xml.putProperty("raster.geoPoint."+i+".leftViewPort.imgWidth", getPoint(i).leftViewPort.getImageWidth());
671
                        xml.putProperty("raster.geoPoint."+i+".leftViewPort.imgHeight", getPoint(i).leftViewPort.getImageHeight());
672
                        
673
                        xml.putProperty("raster.geoPoint."+i+".rightViewPort.proj", getPoint(i).rightViewPort.getProjection().getAbrev());
674
                        xml.putProperty("raster.geoPoint."+i+".rightViewPort.x", getPoint(i).rightViewPort.getExtent().getX());
675
                        xml.putProperty("raster.geoPoint."+i+".rightViewPort.y", getPoint(i).rightViewPort.getExtent().getY());
676
                        xml.putProperty("raster.geoPoint."+i+".rightViewPort.w", getPoint(i).rightViewPort.getExtent().getWidth());
677
                        xml.putProperty("raster.geoPoint."+i+".rightViewPort.h", getPoint(i).rightViewPort.getExtent().getHeight());
678
                        xml.putProperty("raster.geoPoint."+i+".rightViewPort.imgWidth", getPoint(i).rightViewPort.getImageWidth());
679
                        xml.putProperty("raster.geoPoint."+i+".rightViewPort.imgHeight", getPoint(i).rightViewPort.getImageHeight());
680
                }
681
        }
682
        //**********************End Methods********************************
683
        
684
        //**********************Setters & Getters**************************
685
        /**
686
         * Asigna el viewPort de la mini imagen de la derecha en 
687
         * el punto de la posici?n que se le pasa por par?metro
688
         * @param pos Posici?n del punto
689
         * @param vp ViewPort asignado
690
         */
691
        public void setRightViewPort(int pos, ViewPort vp){
692
                getPoint(pos).rightViewPort = vp;
693
        }
694
        /**
695
         * @return Returns the showNumber.
696
         */
697
        public boolean isShowNumber() {
698
                return showNumber;
699
        }
700

    
701
        /**
702
         * @param showNumber The showNumber to set.
703
         */
704
        public void setShowNumber(boolean showNumber) {
705
                this.showNumber = showNumber;
706
        }
707
        
708
        /**
709
         * Asigna el punto central de la mini imagen de la izquierda 
710
         * en el punto de la posici?n que se le pasa por par?metro
711
         * @param pos Posici?n del punto
712
         * @param p Punto asignado
713
         */
714
        public void setLeftCenterPoint(int pos, Point2D p){
715
                try{
716
                        getPoint(pos).leftCenterPoint = p;
717
                }catch(NullPointerException ex){
718
                        //Si getPoint devuelve null es que hemos intentado acceder a una posici?n que no 
719
                        //existe por lo que no asignamos ningun valor.
720
                }
721
        }
722
        
723
        /**
724
         * Asigna el punto central de la mini imagen de la derecha
725
         * en el punto de la posici?n que se le pasa por par?metro
726
         * @param pos Posici?n del punto
727
         * @param p Punto asignado
728
         */
729
        public void setRightCenterPoint(int pos, Point2D p){
730
                try{
731
                        getPoint(pos).rightCenterPoint = p;
732
                }catch(NullPointerException ex){
733
                        //Si getPoint devuelve null es que hemos intentado acceder a una posici?n que no 
734
                        //existe por lo que no asignamos ningun valor.
735
                }
736
        }
737
        
738
        /**
739
         * Asigna el viewPort de la mini imagen de la izquierda en 
740
         * el punto de la posici?n que se le pasa por par?metro
741
         * @param pos Posici?n del punto
742
         * @param vp ViewPort asignado
743
         */
744
        public void setLeftViewPort(int pos, ViewPort vp){
745
                try{
746
                        getPoint(pos).leftViewPort = vp;
747
                }catch(NullPointerException ex){
748
                        //Si getPoint devuelve null es que hemos intentado acceder a una posici?n que no 
749
                        //existe por lo que no asignamos ningun valor.
750
                }
751
        }
752
        
753
        /**
754
         * Asigna el zoom al punto de una posici?n. Este zoom es el que corresponde
755
         * a la miniimagen de la izquierda, es decir la que tiene las coordenadas en pixeles.
756
         * @param pos Posici?n del punto a asignar el zoom
757
         * @param zoom Zoom a asignar.
758
         */
759
        public void setZoomLeft(int pos, double zoom){
760
                try{
761
                        getPoint(pos).zoomLeft = zoom;
762
                }catch(NullPointerException ex){
763
                        //Si getPoint devuelve null es que hemos intentado acceder a una posici?n que no 
764
                        //existe por lo que no asignamos ningun valor.
765
                }
766
        }
767
        
768
        /**
769
         * Asigna el zoom al punto de una posici?n. Este zoom es el que corresponde
770
         * a la miniimagen de la derecha, es decir la que tiene las coordenadas relativas
771
         * al mundo real.
772
         * @param pos Posici?n del punto a asignar el zoom
773
         * @param zoom Zoom a asignar.
774
         */
775
        public void setZoomRight(int pos, double zoom){
776
                try{
777
                        getPoint(pos).zoomRight = zoom;
778
                }catch(NullPointerException ex){
779
                        //Si getPoint devuelve null es que hemos intentado acceder a una posici?n que no 
780
                        //existe por lo que no asignamos ningun valor.
781
                }
782
        }
783
        
784
        /**
785
         * Obtiene el zoom de un punto y posici?n. Este zoom es el que corresponde
786
         * a la miniimagen de la izquierda, es decir la que tiene las coordenadas en pixeles.
787
         * @param pos Posici?n del punto a asignar el zoom
788
         * @return Zoom a asignado.
789
         */
790
        public double getZoomLeft(int pos){
791
                try{
792
                        return getPoint(pos).zoomLeft;
793
                }catch(NullPointerException ex){
794
                        //Si getPoint devuelve null es que hemos intentado acceder a una posici?n que no 
795
                        //existe por lo que devolvemos un zoom de 1.0.
796
                        return 1.0;
797
                }
798
        }
799
        
800
        /**
801
         * Obtiene el zoom de un punto y posici?n. Este zoom es el que corresponde
802
         * a la miniimagen de la derecha, es decir la que tiene las coordenadas relativas
803
         * al mundo real.
804
         * @param pos Posici?n del punto a asignar el zoom
805
         * @return Zoom a asignado.
806
         */
807
        public double getZoomRight(int pos){
808
                try{
809
                        return getPoint(pos).zoomRight;
810
                }catch(NullPointerException ex){
811
                        //Si getPoint devuelve null es que hemos intentado acceder a una posici?n que no 
812
                        //existe por lo que devolvemos un zoom de 1.0.
813
                        return 1.0;
814
                }
815
        }
816
        
817
        /**
818
         * Devuelve el n?mero de puntos de la lista
819
         * @return entero que representa el n?mero de puntos
820
         */
821
        public int getCountPoints(){
822
                if(pointList != null)
823
                        return pointList.size();
824
                else 
825
                        return 0;
826
        }
827
        
828
        /**
829
         * Devuelve el n?mero de puntos de la lista que est?n activos
830
         * @return entero que representa el n?mero de puntos
831
         */
832
        public int getCountActivePoints(){
833
                int activePoints = 0;
834
                if(pointList != null){
835
                        for(int i = 0; i< pointList.size(); i++)
836
                                if(getPoint(i).active)
837
                                        activePoints ++;
838
                        return activePoints;
839
                }else 
840
                        return 0;
841
        }
842
        
843
        /**
844
         * Activa o desactiva el punto de una posici?n de la lista
845
         * @param n        N?mero de punto
846
         * @param active        true activo, false desactivo
847
         */
848
        public void setPointActive(int n, boolean active){
849
                if(n < 0 || n >= this.length())
850
                        return;
851
                ((GeoPoint)pointList.get(n)).active = active;
852
        }
853
        
854
        /**
855
         * Dice si un punto de la lista est? activo o no
856
         * @param n        Posici?n del punto 
857
         * @return        true si est? activo y false si no lo est?.
858
         */
859
        public boolean isPointActive(int n){
860
                if(n < 0 || n >= this.length())
861
                        return false;
862
                return ((GeoPoint)pointList.get(n)).active;
863
        }
864
        
865
        /**
866
         * Obtiene el extent de la capa
867
         * @return extent en Rectangle2D.
868
         */
869
        public Rectangle2D getFullExtent()throws DriverException {
870
                View theView = (View) PluginServices.getMDIManager().getActiveView();
871
                return theView.getMapControl().getMapContext().getViewPort().getExtent();
872
        }
873
        
874
        /**
875
         * @return Returns the lastTool.
876
         */
877
        public String getLastTool() {
878
                return lastTool;
879
        }
880
        
881
        /**
882
         * @param lastTool The lastTool to set.
883
         */
884
        public void setLastTool(String lastTool) {
885
                this.lastTool = lastTool;
886
        }
887
        
888
        /**
889
         *Asigna el extent para las mini imagenes. Estas deben ser recuperadas cuando se selecciona
890
         *un punto
891
         */
892
        public void setMiniExtent(int nPoint, Point2D centerPoint, ViewPort vp, boolean isRight){
893
                ViewPort viewPortBlock = new ViewPort(vp.getProjection());
894
                viewPortBlock.setExtent(vp.getExtent());
895
                viewPortBlock.setImageSize(vp.getImageSize());        
896
                viewPortBlock.setScale();
897
                
898
                if(isRight){
899
                        ((GeoPoint)pointList.get(nPoint)).rightCenterPoint = (Point2D)centerPoint.clone();
900
                        ((GeoPoint)pointList.get(nPoint)).rightViewPort = viewPortBlock;
901
                }else{
902
                        ((GeoPoint)pointList.get(nPoint)).leftCenterPoint = (Point2D)centerPoint;
903
                        ((GeoPoint)pointList.get(nPoint)).leftViewPort = viewPortBlock;
904
                }
905
        }
906
        
907
        /**
908
         * Obtiene el extent de la mini imagen
909
         * @param nPoint Punto de la lista
910
         * @return
911
         */
912
        public ViewPort getMiniExtent(int nPoint, boolean isRight){
913
                if(isRight)
914
                        return ((GeoPoint)pointList.get(nPoint)).rightViewPort;
915
                else
916
                        return ((GeoPoint)pointList.get(nPoint)).leftViewPort;
917
        }
918
        
919
        /**
920
         * Obtiene el punto central de la mini imagen
921
         * @param nPoint Punto de la lista
922
         * @return
923
         */
924
        public Point2D getCenterPoint(int nPoint, boolean isRight){
925
                if(isRight)
926
                        return ((GeoPoint)pointList.get(nPoint)).rightCenterPoint;
927
                else
928
                        return ((GeoPoint)pointList.get(nPoint)).leftCenterPoint;
929
        }
930
        
931
        /**
932
         * Obtiene le ?ltimo punto de la lista
933
         * @return El ?ltimo punto georreferenciado de la lista
934
         */
935
        public GeoPoint getLastPoint(){
936
                return (GeoPoint)pointList.get(pointList.size());
937
        }
938
        
939
        /**
940
         * Obtiene el array de puntos
941
         * @return
942
         */
943
        public ArrayList getListPoint(){
944
                return pointList;
945
        }
946
        
947
        /**
948
     * Obtiene el gestor de puntos
949
     * @return PointManager
950
     */
951
    public PointManager getPointManager() {
952
                return pointManager;
953
        }
954
    
955
    /**
956
     * Asigna el gestor de puntos
957
     * @param PointManager
958
     */
959
    public void setPointManager(PointManager pointManager) {
960
                this.pointManager = pointManager;
961
        }
962
    
963
    /**
964
     * Obtiene la capa de la imagen a georreferenciar
965
     * @return FLyrGeoRaster
966
     */
967
    public FLyrGeoRaster getLyrGeoRaster() {
968
                return lyrGeoRaster;
969
        }
970
    
971
    /**
972
         * Asigna la capa de la imagen a georreferenciar
973
         * @param flyGeoRaster
974
         */
975
        public void setLyrGeoRaster(FLyrGeoRaster lyGeoRaster){
976
                this.lyrGeoRaster = lyGeoRaster;
977
                if(geoPointPersistence == null)
978
                        geoPointPersistence = new GeoPointPersistence(this);
979
        }
980
        
981
        /**
982
         * Asigna el flag de visibilidad a true o false. Si est? a true la capa
983
         * es visible normalmente y si est? a false no se mostrar?
984
         * @param visible flag de visibilidad
985
         */
986
        public void setVisible(boolean visible){
987
                this.lyrVisible = visible;
988
        }
989
        
990
        /**
991
         * Obtiene el flag de visibilidad true o false. Si est? a true la capa
992
         * es visible normalmente y si est? a false no se muestra
993
         * @return flag de visibilidad
994
         */
995
        public boolean isVisible(){
996
                return this.lyrVisible;
997
        }
998
        
999
        /**
1000
         * Asigna el flag de visibilidad a true o false. Si est? a true la capa
1001
         * es visible normalmente y si est? a false no se mostrar?. Este flag solo
1002
         * afecta a la vista de gvSIG. Las mini-imagenes seguiran mostrandose.
1003
         * @param visible flag de visibilidad
1004
         */
1005
        public void setHideViewOnly(boolean hideViewOnly){
1006
                lyrHideViewOnly = hideViewOnly;
1007
        }
1008
        
1009
        /**
1010
         * Obtiene el flag de visibilidad true o false. Si est? a true la capa
1011
         * es visible normalmente y si est? a false no se muestra. Este flag solo
1012
         * afecta a la vista de gvSIG. Las mini-imagenes seguiran mostrandose.
1013
         * @return flag de visibilidad
1014
         */
1015
        public boolean isHideViewOnly(){
1016
                return lyrHideViewOnly;
1017
        }
1018
        
1019
        /**
1020
         * Obtiene la lista de puntos transformados. La lista de puntos transformada es la lista de puntos
1021
         * a la que se le ha aplicado la transformaci?n af?n en base a las muestras tomadas.
1022
         * Esta lista de puntos transformados hay que mantenerla actualizada cada vez que se hace un 
1023
         * update de un punto ya se usa para calcular los errores.
1024
         * @return Lista de puntos transformada.
1025
         */
1026
        public Point2D[] getTransformPointList() {
1027
                return transformPointList;
1028
        }
1029

    
1030
        /**
1031
         * Asigna la lista de puntos transformada. La lista de puntos transformada es la lista de puntos
1032
         * a la que se le ha aplicado la transformaci?n af?n en base a las muestras tomadas.
1033
         * Esta lista de puntos transformados hay que mantenerla actualizada cada vez que se hace un 
1034
         * update de un punto ya se usa para calcular los errores.
1035
         * @param transformPointList Lista de puntos transformada.
1036
         */
1037
        public void setTransformPointList(Point2D[] transformPointList) {
1038
                this.transformPointList = transformPointList;
1039
        }
1040
        
1041
        /**
1042
         * Asigna el objeto que gestiona la persistencia
1043
         */
1044
        public void setPersistence(IPersistence geoPointPersistence) {
1045
                if(this.geoPointPersistence == null)
1046
                        this.geoPointPersistence = geoPointPersistence;
1047
        }
1048
        
1049
        /**
1050
         * Obtiene el valor del flag que dice si se dibuja la cruz azul
1051
         * @return
1052
         */
1053
        public boolean isWithoutBlue() {
1054
                return withoutBlue;
1055
        }
1056

    
1057
        /**
1058
         * Asigna valor al flag que dice si se dibuja la cruz azul. Ser? true si no queremos 
1059
         * dibujarla y false si queremos.
1060
         * @param withoutBlue
1061
         */
1062
        public void setWithoutBlue(boolean withoutBlue) {
1063
                this.withoutBlue = withoutBlue;
1064
        }
1065

    
1066
        /**
1067
         * Obtiene el valor del flag que dice si se dibuja la cruz roja
1068
         * @return
1069
         */
1070
        public boolean isWithoutRed() {
1071
                return withoutRed;
1072
        }
1073

    
1074
        /**
1075
         * Asigna valor al flag que dice si se dibuja la cruz roja. Ser? true si no queremos 
1076
         * dibujarla y false si queremos.
1077
         * @param withoutRed
1078
         */
1079
        public void setWithoutRed(boolean withoutRed) {
1080
                this.withoutRed = withoutRed;
1081
        }
1082
        //**********************End Setters & Getters*********************
1083
}