Statistics
| Revision:

gvsig-raster / org.gvsig.raster.georeferencing / trunk / org.gvsig.raster.georeferencing / org.gvsig.raster.georeferencing.app / org.gvsig.raster.georeferencing.app.georeferencingclient / src / main / java / org / gvsig / raster / georeferencing / app / georeferencingclient / Georeferencing.java @ 1752

History | View | Annotate | Download (18.8 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.raster.georeferencing.app.georeferencingclient;
23

    
24
import java.awt.geom.Rectangle2D;
25
import java.util.ArrayList;
26
import java.util.List;
27

    
28
import javax.swing.JPanel;
29

    
30
import org.gvsig.andami.PluginServices;
31
import org.gvsig.andami.ui.mdiManager.IWindow;
32
import org.gvsig.app.ApplicationLocator;
33
import org.gvsig.app.ApplicationManager;
34
import org.gvsig.app.project.documents.Document;
35
import org.gvsig.app.project.documents.view.ViewDocument;
36
import org.gvsig.app.project.documents.view.gui.IView;
37
import org.gvsig.fmap.dal.coverage.datastruct.GeoPoint;
38
import org.gvsig.fmap.dal.coverage.datastruct.GeoPointList;
39
import org.gvsig.fmap.geom.primitive.Envelope;
40
import org.gvsig.fmap.mapcontrol.MapControl;
41
import org.gvsig.gui.beans.incrementabletask.IIncrementable;
42
import org.gvsig.gui.beans.incrementabletask.IncrementableEvent;
43
import org.gvsig.gui.beans.incrementabletask.IncrementableListener;
44
import org.gvsig.gui.beans.incrementabletask.IncrementableTask;
45
import org.gvsig.i18n.Messages;
46
import org.gvsig.raster.georeferencing.app.georeferencingclient.listener.ApplicationControlsListener;
47
import org.gvsig.raster.georeferencing.app.georeferencingclient.listener.GeoreferencingProcessActions;
48
import org.gvsig.raster.georeferencing.app.georeferencingclient.listener.LauncherDialogListener;
49
import org.gvsig.raster.georeferencing.app.georeferencingclient.listener.PointListListener;
50
import org.gvsig.raster.georeferencing.app.georeferencingclient.listener.ViewDialogListener;
51
import org.gvsig.raster.georeferencing.app.georeferencingclient.listener.ViewMapRequestManager;
52
import org.gvsig.raster.georeferencing.app.georeferencingclient.listener.ViewRasterRequestManager;
53
import org.gvsig.raster.georeferencing.framework.GeoreferencingFrameworkLocator;
54
import org.gvsig.raster.georeferencing.framework.GeoreferencingFrameworkManager;
55
import org.gvsig.raster.georeferencing.framework.LayoutEnvironment;
56
import org.gvsig.raster.georeferencing.swing.GeoreferencingLauncher;
57
import org.gvsig.raster.georeferencing.swing.GeoreferencingSwingLibrary;
58
import org.gvsig.raster.georeferencing.swing.GeoreferencingSwingLocator;
59
import org.gvsig.raster.georeferencing.swing.GeoreferencingSwingManager;
60
import org.gvsig.raster.georeferencing.swing.control.GeorefControlPanel;
61
import org.gvsig.raster.georeferencing.swing.exception.InvalidRequestException;
62
import org.gvsig.raster.georeferencing.swing.impl.GeoreferencingSwingImplLibrary;
63
import org.gvsig.raster.georeferencing.swing.impl.layer.GPGraphic;
64
import org.gvsig.raster.georeferencing.swing.model.GeoreferencingOptionsDataModel;
65
import org.gvsig.raster.georeferencing.swing.view.GeoreferencingView;
66
import org.gvsig.raster.georeferencing.swing.view.IViewRequestManager;
67
import org.gvsig.raster.georeferencing.swing.view.SynchronizedViews;
68
import org.gvsig.raster.swing.pagedtable.PagedTable;
69

    
70
/**
71
 * Clase principal para la georreferenciaci?n. Se encarga de la inicializaci?n
72
 * de la funcionalidad. Las acciones a realizar son:
73
 * <UL>
74
 * <LI>Lanzamiento del dialogo de inicializaci?n.</LI>
75
 * <LI>Carga de la capa raster a georreferenciar.</LI>
76
 * <LI>Creaci?n de las ventanas si no han sido creadas previamente.</LI>
77
 * <LI>Asignaci?n de tama?os y posiciones a las ventanas.</LI>
78
 * </UL>
79
 * 26/12/2007
80
 * @author Nacho Brodin (nachobrodin@gmail.com)
81
 */
82
public class Georeferencing implements IIncrementable, IncrementableListener {
83
        public static final int               UNDEFINED                      = -1;
84
        
85
        //Tipo de georreferenciacion
86
        public static final int               WITH_MAP                       = 0;
87
        public static final int               WITHOUT_MAP                    = 1;
88
        
89
        public static int                     DEFAULT_DEGREE                 = 3;
90
        public static int                     ZOOM_RATIO                     = 5;
91
        
92
        private GeoreferencingFrameworkManager 
93
                                              fManager                       = null;
94
        private GeoreferencingSwingManager    sManager                       = null;
95
        
96
        //Dialogos
97
        private GeoreferencingLauncher        launcher                       = null;
98
        private GeoreferencingView            viewRaster                     = null;
99
        private GeoreferencingView            viewMap                        = null;
100
        private GeoreferencingView            zoomMap                        = null;
101
        private GeoreferencingView            zoomRaster                     = null;
102
        
103
        private ViewRasterRequestManager      zoomRasterRequestManager       = null;  
104
        private ViewMapRequestManager         zoomMapRequestManager          = null;
105
        private ViewRasterRequestManager      viewRasterRequestManager       = null;  
106
        private ViewMapRequestManager         viewMapRequestManager          = null;
107
        
108
        private GeorefControlPanel            georefControlPanel             = null;
109

    
110
        private TableWrapper                  table                          = null;
111

    
112
        private MapControl                    mapCtrl                        = null;
113
        private GeoreferencingOptionsDataModel 
114
                                              dataModel                      = null;
115
        private SynchronizedViews             syncViews                      = null;
116
        private ViewDialogListener            listener                       = null;
117
        private GeoreferencingProcessActions  processActions                 = null;
118
        private ApplicationControlsListener   appControlsListener            = null;
119
        private PointListListener             pointListListener              = null;
120
        public static boolean                 enableTableEvent               = true;
121
        protected IncrementableTask           incrementableLauncherTask      = null;
122
        private int                           percentLauncher                = 0;
123
        
124
        /**
125
         * Crea la ventana de IncrementableTask
126
         */
127
        public IncrementableTask getIncrementableTask() {
128
                if (incrementableLauncherTask == null) {
129
                        incrementableLauncherTask = new IncrementableTask(this);
130
                        incrementableLauncherTask.addIncrementableListener(this);
131
                }
132
                return incrementableLauncherTask;
133
        }
134
                
135
        public void initialize() {
136
                fManager = GeoreferencingFrameworkLocator.getManager();
137
                sManager = GeoreferencingSwingLocator.getSwingManager();
138
                listener = new ViewDialogListener(this);
139
                processActions = new GeoreferencingProcessActions();
140
                launcher();
141
        }
142
        
143
        /**
144
         * Launcher of the initial dialog
145
         */
146
        private void launcher() {
147
                ApplicationManager application = ApplicationLocator.getManager();
148
                List<Document> docs = application.getProjectManager().getCurrentProject().getDocuments();
149
                List<String> viewList = new ArrayList<String>();
150
                for (int i = 0; i < docs.size(); i++) {
151
                        Document doc = docs.get(i);
152
                        if(doc instanceof ViewDocument) {
153
                                viewList.add(doc.getName());
154
                        }
155
                }
156
                
157
                launcher = sManager.createWindowLauncher(viewList, DEFAULT_DEGREE);
158
                LauncherDialogListener listener = new LauncherDialogListener(this, launcher);
159
                launcher.setButtonsListener(listener);
160
                fManager.showWindow(launcher.getComponent(), 400, 380, Messages.getText("georeferencing"));
161
        }
162
        
163
        /**
164
         * Gets the Mapcontrol for the view selected by the user 
165
         * @return
166
         */
167
        public MapControl getMapCtrl() {
168
                if(mapCtrl == null) {
169
                        IWindow[] windowList = PluginServices.getMDIManager().getAllWindows();
170
                        for (int i = 0; i < windowList.length; i++) {
171
                                if(windowList[i] instanceof IView) {
172
                                        String name = ((IView)windowList[i]).getViewDocument().getName();
173
                                        if(name.equals(dataModel.getSelectedView())) {
174
                                                mapCtrl = ((IView)windowList[i]).getMapControl();
175
                                        }
176
                                }
177
                        }                        
178
                }
179
                return mapCtrl;
180
        }
181
        
182
        /**
183
         * Gets the Mapcontrol for the first view found. This is useful without reference cartography.
184
         * When the application ends and the layer is loaded, the layer generated will be loaded 
185
         * in the first view found. 
186
         * @return
187
         */
188
        public MapControl getFirstMapCtrl() {
189
                if(mapCtrl == null) {
190
                        IWindow[] windowList = PluginServices.getMDIManager().getAllWindows();
191
                        for (int i = 0; i < windowList.length; i++) {
192
                                if(windowList[i] instanceof IView) {
193
                                        mapCtrl = ((IView)windowList[i]).getMapControl();
194
                                }
195
                        }                        
196
                }
197
                return mapCtrl;
198
        }
199
        
200
        public void endLauncherDialog(GeoreferencingOptionsDataModel dataModel) {
201
                this.dataModel = dataModel;
202
                if(dataModel.getType() == Georeferencing.WITH_MAP)
203
                        initWindowsWithMap(dataModel);
204
                if(dataModel.getType() == Georeferencing.WITHOUT_MAP)
205
                        initWindowsWithoutMap(dataModel);
206
                createAppControlsListener();
207
                createPointListListener();
208
                initCartography();
209
                /*getIncrementableTask().showWindow();
210
                getIncrementableTask().start();
211
                
212
                SwingUtilities.invokeLater(new Runnable() {
213
                        public void run() {
214
                                initCartography();
215
                        }
216
                });*/
217
        }
218
        
219
        /**
220
         * Builds the raster view
221
         * @return
222
         */
223
        public GeoreferencingView getViewRaster() {
224
                if(viewRaster == null) {
225
                        viewRaster = sManager.createView(true, false, true, listener);
226
                        viewRasterRequestManager = new ViewRasterRequestManager(viewRaster, dataModel.getDataStore());
227
                        viewRaster.setMinxMaxyUL(false);
228
                        viewRaster.setViewListener(listener);
229
                        viewRaster.setRequestListener(viewRasterRequestManager);
230
                        viewRaster.setTool(GeoreferencingSwingLibrary.SELECT_POINT_TOOL, listener);
231
                }
232
                return viewRaster;
233
        }
234
        
235
        /**
236
         * Builds the map view
237
         * @return
238
         */
239
        public GeoreferencingView getViewMap() {
240
                if(viewMap == null) {
241
                        viewMap = sManager.createView(true, false, false, listener);
242
                        viewMap.setMinxMaxyUL(true);
243
                        viewMapRequestManager = new ViewMapRequestManager(viewMap, getMapCtrl());
244
                        viewMap.setViewListener(listener);
245
                        viewMap.setRequestListener(viewMapRequestManager);
246
                        viewMap.setTool(GeoreferencingSwingLibrary.SELECT_POINT_TOOL, listener);
247
                }
248
                return viewMap;
249
        }
250

    
251
        /**
252
         * Builds the zoom for the map view
253
         * @return
254
         */
255
        public GeoreferencingView getZoomMap() {
256
                if(zoomMap == null) {
257
                        zoomMap = sManager.createZoom(true, false);
258
                        zoomMap.setMinxMaxyUL(true);
259
                        zoomMapRequestManager = new ViewMapRequestManager(zoomMap, getMapCtrl());
260
                        zoomMap.setRequestListener(zoomMapRequestManager);
261
                        zoomMap.setTool(GeoreferencingSwingLibrary.SELECT_POINT_TOOL, listener);
262
                }
263
                return zoomMap;
264
        }
265

    
266
        /**
267
         * Builds the zoom for the raster view
268
         * @return
269
         */
270
        public GeoreferencingView getZoomRaster() {
271
                if(zoomRaster == null) {
272
                        zoomRaster = sManager.createZoom(true, false);
273
                        zoomRasterRequestManager = new ViewRasterRequestManager(zoomRaster, dataModel.getDataStore());
274
                        zoomRaster.setMinxMaxyUL(false);
275
                        zoomRaster.setRequestListener(zoomRasterRequestManager);
276
                        zoomRaster.setTool(GeoreferencingSwingLibrary.SELECT_POINT_TOOL, listener);
277
                }
278
                return zoomRaster;
279
        }
280
        
281
        public TableWrapper getTableWrapper() {
282
                if(table == null) {
283
                        table = new TableWrapper(
284
                                        getDataModel(), 
285
                                        getGeorefControlPanel());
286
                }
287
                return table;
288
        }
289
        
290
        public void createAppControlsListener() {
291
                if(appControlsListener == null) {
292
                        appControlsListener = new ApplicationControlsListener(getTableWrapper(), this);
293
                        getTableWrapper().getTable().addListener(appControlsListener);
294
                }
295
        }
296
        
297
        public void createPointListListener() {
298
                if(pointListListener == null) {
299
                        pointListListener = new PointListListener(this);
300
                }
301
        }
302
        
303
        public void buildNewPointList() {
304
                GeoPointList geoPointList = getDataModel().getDataStore().getGeoPointList();
305
                long id = System.currentTimeMillis();
306
                
307
                if(geoPointList == null)
308
                        return;
309
                
310
                for (int i = 0; i < geoPointList.size(); i++) {
311
                        GeoPoint gp = geoPointList.get(i);
312
                        gp.setNumber(i);
313
                        
314
                        GPGraphic graphicGCP = new GPGraphic(gp);
315
                        graphicGCP.setId(id);                
316
                        getDataModel().getGCPList().add(graphicGCP);
317
                        
318
                        getTableWrapper().getTable().addRow(new Object[] {
319
                                        true, 
320
                                        gp.getNumber(),
321
                                        gp.getMapPoint().getX(),
322
                                        gp.getMapPoint().getY(),
323
                                        gp.getPixelPoint().getX(),
324
                                        gp.getPixelPoint().getY(),
325
                                        gp.getErrorX(),
326
                                        gp.getErrorY(),
327
                                        gp.getRms(),
328
                                        id});
329
                        
330
                        id += 1;
331
                        if(i == geoPointList.size() - 1)
332
                                getDataModel().getGCPList().setSelectedPoint(i);
333
                }
334
                getTableWrapper().updateErrors();
335
                getSyncViews().redrawPoints();
336
        }
337
        
338
        /**
339
         * Colocaci?n inicial de las ventanas del espacio de trabajo. Carga la configuraci?n
340
         * de ventanas con cartograf?a de referencia.
341
         */
342
        private void initWindowsWithoutMap(GeoreferencingOptionsDataModel dataModel) {
343
                //RasterDataStore store = dataModel.getDataStore();
344
                getDataModel().setType(WITHOUT_MAP);
345
                
346
                viewRaster = getViewRaster();
347
                zoomRaster = getZoomRaster();
348
                
349
                PagedTable pt = getTableWrapper().getTable();
350
                
351
                //Creamos el layout
352
                LayoutEnvironment layoutEnv = fManager.createLayoutEnvironment();
353
                layoutEnv.setTable((JPanel)pt.getComponent());
354
                layoutEnv.setViewRasterToGeoref(viewRaster.getComponent());
355
                layoutEnv.setViewZoomRasterToGeoref(zoomRaster.getComponent());
356
                layoutEnv.setControlBar(getGeorefControlPanel().getComponent());
357
                
358
                fManager.createLayout(layoutEnv);
359
                GeoreferencingView[] v = new GeoreferencingView[]{null, viewRaster, null, zoomRaster};
360
                IViewRequestManager[] rm = new IViewRequestManager[]{null, viewRasterRequestManager, null, zoomRasterRequestManager};
361
                syncViews = sManager.createSyncViews(v, rm, getGeorefControlPanel(), pt, listener);
362
        
363
                try {
364
                        viewRaster.setCursorSize(zoomRaster.getCanvasWidth() / ZOOM_RATIO, zoomRaster.getCanvasHeight() / ZOOM_RATIO);
365
                        viewRaster.setCursorPosition(viewRaster.getCanvasWidth() / 2, viewRaster.getCanvasHeight() / 2);
366
                } catch (Exception e1) {
367
                        GeoreferencingSwingImplLibrary.messageBoxError("error_setview_preview", null, e1);
368
                        fManager.closeAllWindows();
369
                }
370
                
371
                buildNewPointList();
372
        }
373
        
374
        /**
375
         * Colocaci?n inicial de las ventanas del espacio de trabajo. Carga la configuraci?n
376
         * de ventanas con cartograf?a de referencia.
377
         */
378
        private void initWindowsWithMap(GeoreferencingOptionsDataModel dataModel) {
379
                getDataModel().setType(WITH_MAP);
380

    
381
                viewRaster = getViewRaster();
382
                zoomRaster = getZoomRaster();
383
                viewMap = getViewMap();
384
                zoomMap = getZoomMap();
385
                PagedTable pt = getTableWrapper().getTable();
386
                
387
                //Creamos el layout
388
                LayoutEnvironment layoutEnv = fManager.createLayoutEnvironment();
389
                layoutEnv.setTable((JPanel)pt.getComponent());
390
                layoutEnv.setViewRasterToGeoref(viewRaster.getComponent());
391
                layoutEnv.setViewZoomRasterToGeoref(zoomRaster.getComponent());
392
                layoutEnv.setViewBaseCartography(viewMap.getComponent());
393
                layoutEnv.setViewZoomBaseCartography(zoomMap.getComponent());
394
                layoutEnv.setControlBar(getGeorefControlPanel().getComponent());
395
                
396
                fManager.createLayout(layoutEnv);
397
                GeoreferencingView[] v = new GeoreferencingView[]{viewMap, viewRaster, zoomMap, zoomRaster};
398
                IViewRequestManager[] rm = new IViewRequestManager[]{viewMapRequestManager, viewRasterRequestManager, zoomMapRequestManager, zoomRasterRequestManager};
399
                syncViews = sManager.createSyncViews(v, rm, getGeorefControlPanel(), pt, listener);
400
                
401
                getDataModel().setType(WITH_MAP);
402

    
403
                try {
404
                        viewMap.setCursorSize(zoomMap.getCanvasWidth() / ZOOM_RATIO, zoomMap.getCanvasHeight() / ZOOM_RATIO);
405
                        viewRaster.setCursorSize(zoomRaster.getCanvasWidth() / ZOOM_RATIO, zoomRaster.getCanvasHeight() / ZOOM_RATIO);
406
                        viewMap.setCursorPosition(viewMap.getCanvasWidth() / 2, viewMap.getCanvasHeight() / 2);
407
                        viewRaster.setCursorPosition(viewRaster.getCanvasWidth() / 2, viewRaster.getCanvasHeight() / 2);
408
                        
409
                        if(getMapCtrl().getMapContext().getLayers().getFullEnvelope() == null)
410
                                GeoreferencingSwingImplLibrary.messageBoxError("error_setview_preview", null);
411
                        
412
                        processActions.setViewMapRequest(viewMapRequestManager);
413
                } catch (Exception e1) {
414
                        GeoreferencingSwingImplLibrary.messageBoxError("error_setview_preview", this, e1);
415
                        fManager.closeAllWindows();
416
                }
417
                buildNewPointList();
418
        }
419
        
420
        /**
421
         * Initializes views with the cartography
422
         * @throws InvalidRequestException
423
         */
424
        private void initCartography() {
425
                try {
426
                        percentLauncher = 10;
427
                        if(getDataModel().getType() == WITH_MAP) {
428
                                //Inicializamos la vista de mapa
429
                                Envelope e = getMapCtrl().getMapContext().getLayers().getFullEnvelope();
430
                                Rectangle2D r = new Rectangle2D.Double(e.getMinimum(0), e.getMinimum(1), e.getLength(0), e.getLength(1));
431
                                viewMapRequestManager.initRequest(r);
432

    
433
                                percentLauncher = 25;
434
                                //Inicializamos el zoom de mapa
435
                                Rectangle2D ext = viewMap.getCursorAdjustedWorldCoordinates(zoomMap.getCanvasWidth(), zoomMap.getCanvasHeight());
436
                                zoomMapRequestManager.initRequest(ext);
437
                        }
438

    
439
                        percentLauncher = 50;
440
                        //Inicializamos la vista de raster
441
                        viewRasterRequestManager.initRequest(dataModel.getRasterExtent());
442

    
443
                        percentLauncher = 75;
444
                        //Inicializamos el zoom de raster
445
                        Rectangle2D ext = viewRaster.getCursorAdjustedWorldCoordinates(zoomRaster.getCanvasWidth(), zoomRaster.getCanvasHeight());
446
                        zoomRasterRequestManager.initRequest(dataModel.getRasterExtent());
447
                        zoomRasterRequestManager.request(ext);
448

    
449
                        percentLauncher = 100;
450
                } catch (InvalidRequestException e1) {
451
                        GeoreferencingSwingImplLibrary.messageBoxError("error_setview_preview", null, e1);
452
                        fManager.closeAllWindows();
453
                } /*finally {
454
                        getIncrementableTask().processFinalize();
455
                }*/
456
        }
457

    
458
        public ViewRasterRequestManager getZoomRasterRequestManager() {
459
                return zoomRasterRequestManager;
460
        }
461

    
462
        public ViewMapRequestManager getZoomMapRequestManager() {
463
                return zoomMapRequestManager;
464
        }
465

    
466
        public GeorefControlPanel getGeorefControlPanel() {
467
                if(georefControlPanel == null) {
468
                        georefControlPanel = sManager.createGeorefControlPanel();
469
                }
470
                return georefControlPanel;
471
        }
472

    
473
        public SynchronizedViews getSyncViews() {
474
                return syncViews;
475
        }
476

    
477
        public GeoreferencingProcessActions getProcessActions() {
478
                return processActions;
479
        }
480
        
481
        public GeoreferencingOptionsDataModel getDataModel() {
482
                return GeoreferencingSwingLocator.getSwingManager().getDataModel();
483
        }
484
        
485
        //***********************************************
486
        //Launcher process
487

    
488
        public void actionCanceled(IncrementableEvent e) {
489
                
490
        }
491

    
492
        public void actionResumed(IncrementableEvent e) {
493
                
494
        }
495

    
496
        public void actionSuspended(IncrementableEvent e) {
497
                
498
        }
499

    
500
        public String getLabel() {
501
                return Messages.getText("loading_georef_windows");
502
        }
503

    
504
        public String getLog() {
505
                return Messages.getText("loading_georef_windows");
506
        }
507

    
508
        public int getPercent() {
509
                return percentLauncher;
510
        }
511

    
512
        public String getTitle() {
513
                return Messages.getText("loading");
514
        }
515

    
516
        public boolean isCancelable() {
517
                return false;
518
        }
519

    
520
        public boolean isPausable() {
521
                return false;
522
        }
523
                
524
}