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 @ 1724

History | View | Annotate | Download (9.46 KB)

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

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

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

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

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

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

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

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

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

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

    
190
                }
191

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

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