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 / TableWrapper.java @ 1740

History | View | Annotate | Download (9.74 KB)

1
package org.gvsig.raster.georeferencing.app.georeferencingclient;
2

    
3
import java.util.HashMap;
4

    
5
import org.gvsig.fmap.dal.coverage.datastruct.GeoPoint;
6
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
7
import org.gvsig.i18n.Messages;
8
import org.gvsig.raster.georeferencing.GeoreferencingLibrary;
9
import org.gvsig.raster.georeferencing.app.georeferencingclient.gui.CheckBoxColumnEditor;
10
import org.gvsig.raster.georeferencing.app.georeferencingclient.gui.CheckBoxColumnRenderer;
11
import org.gvsig.raster.georeferencing.app.georeferencingclient.gui.ColorColumnRenderer;
12
import org.gvsig.raster.georeferencing.app.georeferencingclient.gui.GCPModel;
13
import org.gvsig.raster.georeferencing.lib.impl.GeoTransformDataResult;
14
import org.gvsig.raster.georeferencing.swing.control.GeorefControlPanel;
15
import org.gvsig.raster.georeferencing.swing.impl.GeoreferencingSwingImplLibrary;
16
import org.gvsig.raster.georeferencing.swing.model.GCPList;
17
import org.gvsig.raster.georeferencing.swing.model.GeoreferencingOptionsDataModel;
18
import org.gvsig.raster.swing.RasterSwingLocator;
19
import org.gvsig.raster.swing.RasterSwingManager;
20
import org.gvsig.raster.swing.pagedtable.ModelLoader;
21
import org.gvsig.raster.swing.pagedtable.PagedTable;
22
import org.gvsig.raster.tools.algorithm.base.RasterBaseAlgorithmLibrary;
23
import org.gvsig.raster.tools.algorithm.base.process.ProcessException;
24
import org.gvsig.raster.tools.algorithm.base.process.RasterProcess;
25
import org.gvsig.raster.tools.app.basic.RasterToolsUtil;
26

    
27
/**
28
 * API for the table to manage ground control points. This table
29
 * has a specific structure.
30
 * 
31
 * @author Nacho Brodin nachobrodin@gmail.com
32
 */
33
public class TableWrapper {
34
        private PagedTable                     table               = null;
35
        private RasterProcess                  process             = null;
36
        private GCPList                        gpList              = null;
37
        private GeoreferencingOptionsDataModel dataModel           = null;
38
        private GeorefControlPanel             controlPanel        = null;
39
        
40
        public TableWrapper(
41
                        GeoreferencingOptionsDataModel dataModel,
42
                        GeorefControlPanel controlPanel) {
43
                this.gpList = dataModel.getGCPList();
44
                this.dataModel = dataModel;
45
                this.controlPanel = controlPanel;
46
                try {
47
                        process = RasterBaseAlgorithmLibrary.getManager().createRasterTask(GeoreferencingLibrary.GEOTRANSFORM_PROCESS_LABEL);
48
                } catch (ProcessException e) {
49
                        GeoreferencingSwingImplLibrary.messageBoxError("process_not_registered", null, e);
50
                }
51
        }
52
        
53
        public PagedTable getTable() {
54
                if(table == null) {
55
                        RasterSwingManager manager = RasterSwingLocator.getSwingManager();
56
                        String[] columnNames = {
57
                                        "-", 
58
                                        Messages.getText("num"), 
59
                                        Messages.getText("worldx"), 
60
                                        Messages.getText("worldy"), 
61
                                        Messages.getText("imagex"), 
62
                                        Messages.getText("imagey"), 
63
                                        "Error X", "Error Y", "RMS", ""};
64
                        int[] columnSizes = {30, 30, -1, -1, -1, -1, -1, -1, -1, 0};
65

    
66
                        GCPModel model = new GCPModel(columnNames);
67
                        ModelLoader loader = manager.createModelLoader(model);
68
                        CheckBoxColumnRenderer render = new CheckBoxColumnRenderer(null);
69
                        CheckBoxColumnEditor editor = new CheckBoxColumnEditor();
70
                        loader.setRenderForColumn(0, render);
71
                        loader.setCellEditorForColumn(0, editor);
72
                        loader.setColumnNames(columnNames);
73
                        loader.setColumnWidths(columnSizes);
74
                        
75
                        table = manager.createPagedTable(loader);
76
                }
77
                return table;
78
        }
79
        
80
        /**
81
         * Inicializa una fila de la tabla con los valores a 0, el n?mero de punto
82
         * y el identificador. Esto es util para la inserci?n de un nuevo punto antes
83
         * de introducir sus coordenadas.
84
         * @param row Fila a inicializar
85
         * @param id Identificador
86
         */
87
        public void initializeRow(int row, long id) {
88
                getTable().setValueAt(new Integer(row), row, 1);
89
                for (int i = 2; i <= 9; i++) 
90
                        getTable().setValueAt(new Double(0), row, i);
91
                getTable().setValueAt(new Long(id), row, getTable().getColumnCount() - 1);
92
        }
93
        
94
        /**
95
         * Actualiza los errores de toda la tabla. Esta funci?n debe ser llamada cuando ha
96
         * habido alg?n cambio en los valores de los puntos.
97
         */
98
        @SuppressWarnings("unchecked")
99
        public void updateErrors() {
100
                process.addParam("gcps", gpList.getGeoPointList());
101
                int degree = 1;
102
                if(dataModel.getAlgorithm() == Georeferencing.POLYNOMIAL) 
103
                        degree = dataModel.getDegree();
104
                process.addParam("Order", new Integer(degree));
105
                try {
106
                        process.execute();
107
                } catch (ProcessException e) {
108
                        return;
109
                } catch(RuntimeException e) {
110
                        //Matriz singular
111
                        return;
112
                } catch (ProcessInterruptedException e) {
113
                }
114
                HashMap<String, Object> map = (HashMap<String, Object>)process.getResult();
115
                GeoTransformDataResult result = (GeoTransformDataResult)map.get("RESULT");
116
                if(result == null)
117
                        return;
118

    
119
                //Actualizamos los errores de toda la tabla
120
                ColorColumnRenderer cr = new ColorColumnRenderer();
121
                for (int i = 0; i < gpList.size(); i++) {
122
                        GeoPoint point = gpList.getGeoPoint(i);
123
                        getTable().setValueAt(new Double(point.getErrorX()), point.getNumber(), 6);
124
                        getTable().setValueAt(new Double(point.getErrorY()), point.getNumber(), 7);
125
                        getTable().setValueAt(new Double(point.getRms()), point.getNumber(), 8);
126
                        if (point.getRms() > dataModel.getThreshold())
127
                                cr.addRowToColor1(point.getNumber());
128
                        else
129
                                cr.addRowToColor2(point.getNumber());
130
                }
131
                getTable().getJTable().getColumnModel().getColumn(8).setCellRenderer(cr);
132
                controlPanel.getError().setValue(result.getRmsTotal() + "");
133
        }
134
        
135
        /**
136
         * Obtiene las coordenadas de una fila
137
         * @param row Fila de la que se quieren obtener las coordenadas
138
         * @return Array con 4 valores coordenadas real X, coordenada real Y, coordenadas raster X y coordenada raste Y
139
         */
140
        public double[] getCoordinates(int row) {
141
                double xMap = 0, yMap = 0, xRaster = 0, yRaster = 0;
142
                boolean numberFormatException = false;
143

    
144
                Object value = getTable().getValueAt(row, 2);
145
                try {
146
                        if(value instanceof Double) 
147
                                xMap = ((Double)value).doubleValue();
148
                        else if(value instanceof String) 
149
                                xMap = Double.valueOf(((String)value)).doubleValue();
150
                } catch (NumberFormatException ex1) {
151
                        numberFormatException = true;
152
                }
153

    
154
                value = getTable().getValueAt(row, 3);
155
                try {
156
                        if(value instanceof Double) 
157
                                yMap = ((Double)value).doubleValue();
158
                        else if(value instanceof String) 
159
                                yMap = Double.valueOf(((String)value)).doubleValue();
160
                } catch (NumberFormatException ex1) {
161
                        numberFormatException = true;
162
                }
163

    
164
                try {
165
                        value = getTable().getValueAt(row, 4);
166
                        if(value instanceof Double) 
167
                                xRaster = ((Double)value).doubleValue();
168
                        else if(value instanceof String) 
169
                                xRaster = Double.valueOf(((String)value)).doubleValue();
170
                } catch (NumberFormatException ex1) {
171
                        numberFormatException = true;
172
                }
173

    
174
                try {
175
                        value = getTable().getValueAt(row, 5);
176
                        if(value instanceof Double) 
177
                                yRaster = ((Double)value).doubleValue();
178
                        else if(value instanceof String) 
179
                                yRaster = Double.valueOf(((String)value)).doubleValue();
180
                } catch (NumberFormatException ex1) {
181
                        numberFormatException = true;
182
                }
183

    
184
                //Esto es necesario porque aunque se produzca una excepci?n en la lectura
185
                //de un valor deben leerse los dem?s campos antes de terminar.
186
                if(numberFormatException) {
187
                        RasterToolsUtil.messageBoxError("value_not_valid", table);
188
                        getTable().setValueAt(new String(xMap + ""), row, 2);
189
                        getTable().setValueAt(new String(yMap + ""), row, 3);
190
                        getTable().setValueAt(new String(xRaster + ""), row, 4);
191
                        getTable().setValueAt(new String(yRaster + ""), row, 5);
192

    
193
                }
194

    
195
                return new double[]{xMap, yMap, xRaster, yRaster};
196
        }
197
        
198
        /**
199
         * Obtiene el resultado de aplicar el algoritmo de transformaci?n
200
         * @return
201
         */
202
        @SuppressWarnings("unchecked")
203
        public GeoTransformDataResult getGeoTransformDataResult() {
204
                if(process != null) {
205
                        HashMap<String, Object> map = (HashMap<String, Object>)process.getResult();
206
                        GeoTransformDataResult result = (GeoTransformDataResult)map.get("RESULT");
207
                        return result;
208
                }
209
                return null;
210
        }
211
        
212
        /**
213
         * Asigna un valor al punto de la tabla. Es recomendable gastar este y no 
214
         * setValueAt para evitar que se recalculen los errores en cada inserci?n de cada celda. De esta
215
         * forma al actualiza ambas coordenadas a la vez solo se calcular? el error una vez.
216
         * @param mapX Valor en X en coordenadas del mundo
217
         * @param mapY Valor en Y en coordenadas del mundo
218
         * @param pixelX Valor en X en coordenadas del raster
219
         * @param pixelY Valor en Y en coordenadas del raster
220
         * @param row Fila a actualizar
221
         * @param col Columna a actualizar
222
         */
223
        public void updatePoint(Object mapX, Object mapY, Object pixelX, Object pixelY, int row) {
224
                getTable().setValueAt(mapX, row, 2);
225
                getTable().setValueAt(mapY, row, 3);
226
                getTable().setValueAt(pixelX, row, 4);
227
                getTable().setValueAt(pixelY, row, 5);
228
                updateErrors();
229
        }
230
        
231
        /**
232
         * Asigna un valor al punto en coordenadas raster de la tabla. Es recomendable gastar este y no 
233
         * setValueAt para evitar que se recalculen los errores en cada inserci?n de cada celda. De esta
234
         * forma al actualiza ambas coordenadas a la vez solo se calcular? el error una vez.
235
         * @param valueX Valor en X
236
         * @param valueY Valor en Y
237
         * @param row Fila a actualizar
238
         * @param col Columna a actualizar
239
         */
240
        public void updateRasterPoint(Object valueX, Object valueY, int row) {
241
                getTable().setValueAt(valueX, row, 4);
242
                getTable().setValueAt(valueY, row, 5);
243
                updateErrors();
244
        }
245

    
246
        /**
247
         * Asigna un valor al punto en coordenadas del mundo de la tabla. Es recomendable gastar este y no 
248
         * setValueAt para evitar que se recalculen los errores en cada inserci?n de cada celda. De esta
249
         * forma al actualiza ambas coordenadas a la vez solo se calcular? el error una vez.
250
         * @param valueX Valor en X
251
         * @param valueY Valor en Y
252
         * @param row Fila a actualizar
253
         * @param col Columna a actualizar
254
         */
255
        public void updateMapPoint(Object valueX, Object valueY, int row) {
256
                getTable().setValueAt(valueX, row, 2);
257
                getTable().setValueAt(valueY, row, 3);
258
                updateErrors();
259
        }
260
}