Statistics
| Revision:

root / trunk / libraries / libJCRS / src / org / gvsig / crs / gui / panels / TransformationEpsgPanel.java @ 8127

History | View | Annotate | Download (14 KB)

1
package org.gvsig.crs.gui.panels;
2

    
3

    
4
import java.awt.BorderLayout;
5
import java.awt.Component;
6
import java.awt.Dimension;
7
import java.awt.FlowLayout;
8
import java.awt.GridLayout;
9
import java.sql.ResultSet;
10
import java.sql.SQLException;
11
import java.util.ArrayList;
12

    
13
import javax.swing.BorderFactory;
14
import javax.swing.JLabel;
15
import javax.swing.JPanel;
16
import javax.swing.JScrollPane;
17
import javax.swing.JTable;
18
import javax.swing.JTextArea;
19
import javax.swing.ListSelectionModel;
20
import javax.swing.event.ListSelectionEvent;
21
import javax.swing.event.ListSelectionListener;
22
import javax.swing.table.DefaultTableModel;
23
import javax.swing.table.TableColumn;
24

    
25
import org.cresques.cts.IProjection;
26
import org.gvsig.crs.CrsFactory;
27
import org.gvsig.crs.EpsgConnection;
28
import org.gvsig.crs.ICrs;
29
import org.gvsig.crs.Query;
30

    
31
import com.iver.andami.PluginServices;
32
import com.iver.andami.ui.mdiManager.WindowInfo;
33
import com.iver.cit.gvsig.gui.TableSorter;
34

    
35
public class TransformationEpsgPanel extends JPanel implements ListSelectionListener {
36

    
37
        
38
        /**
39
         * 
40
         */
41
        private static final long serialVersionUID = 1L;
42

    
43
        private JPanel panel;
44
        private IProjection firstProj;
45
        
46
        String[] transformations = {"9603", "9606", "9607", "9613", "9615", "9633"};
47
        
48
        private int transformation_code = -1;
49
        private String[] values;
50
        private String params = "+towgs84=";
51
        
52
        private JTable transformationTable;        
53
        private JScrollPane jScrollPane = null;
54
        public boolean inverseTranformation = false;
55
        
56
        public EpsgConnection connect = null;;        
57
        int crs_target = -1;
58
        
59
        public DefaultTableModel dtm = null;
60
        
61
        private int crs_source_code;
62
        private String cadWKT = "";
63
        private ListSelectionModel lsm2 = null;
64
        public int selectedRowTable = -1;
65
        boolean tra = false;
66
        
67
        private JLabel wkt;
68
        private JTextArea info;
69
        private JScrollPane areaScrollPane;
70
        
71
        public TransformationEpsgPanel(int target) {
72
                crs_target = target;
73
                connect = new EpsgConnection();
74
                connect.setConnectionEPSG();
75
        }
76
        
77
        public JPanel getJPanel(){
78
                if (panel == null) {
79
                        panel = new JPanel();
80
                        panel.setLayout(new GridLayout(1,2));
81
                        panel.setLayout(new FlowLayout(FlowLayout.LEADING,5,10));
82
                        panel.setPreferredSize(new Dimension(525, 100));
83
                        panel.setBorder(
84
                                    BorderFactory.createCompoundBorder(
85
                                                        BorderFactory.createCompoundBorder(
86
                                                                        BorderFactory.createTitledBorder("Transformacion EPSG"),
87
                                                                        BorderFactory.createEmptyBorder(2,2,2,2)),
88
                                                                        panel.getBorder()));
89
                        panel.add(getLabel());
90
                        panel.add(getScrollPanelArea(), BorderLayout.NORTH);
91
                        panel.add(getJScrollPane());
92
                }
93
                return panel;
94
        }
95

    
96
        private Component getLabel() {
97
                if (wkt == null){
98
                        wkt = new JLabel();
99
                        wkt.setPreferredSize(new Dimension(90, 80));
100
                        wkt.setText(PluginServices.getText(this,"Cadena WKT: "));
101
                }                
102
                return wkt;
103
        }
104
        
105
        private Component getInfo() {
106
                if (info == null){
107
                        info = new JTextArea();
108
                        info.setLineWrap(true);
109
                        info.setWrapStyleWord(true);
110
                        info.setPreferredSize(new Dimension(400, 240));
111
                        info.setEditable(false);
112
                        info.append(getWKT());
113
                }
114
                info.setText(getWKT());
115
                return info;
116
        }
117
        
118
        private JScrollPane getScrollPanelArea() {
119
                if(areaScrollPane == null) {
120
                        areaScrollPane = new JScrollPane(getInfo());
121
                        areaScrollPane.setVerticalScrollBarPolicy(
122
                                        JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
123
                        areaScrollPane.setPreferredSize(new Dimension(420, 90));
124
                        areaScrollPane.setBorder(
125
                            BorderFactory.createCompoundBorder(
126
                                BorderFactory.createCompoundBorder(
127
                                                BorderFactory.createTitledBorder("Wkt"),
128
                                                BorderFactory.createEmptyBorder(2,2,2,2)),
129
                                areaScrollPane.getBorder()));
130
                        
131
                }
132
                return areaScrollPane;
133
        }
134
        
135
        private JTable getJTable() {
136
                if (transformationTable == null) {
137
                        String[] columnNames= {"Code of Transformation","Name of Transformation","Type of Transformation","Source CRS","Target CRS", "Description of Area"};
138
                        Object[][]data = {};
139
                        dtm = new DefaultTableModel(data, columnNames)
140
                        {
141
                                public boolean isCellEditable(int row, int column) {
142
                                        return false;
143
                                }
144
                        };
145
                        TableSorter sorter = new TableSorter(dtm);                        
146

    
147
                        transformationTable = new JTable(sorter);
148
                        sorter.setTableHeader(transformationTable.getTableHeader());        
149
                        transformationTable.setCellSelectionEnabled(false);
150
                        transformationTable.setRowSelectionAllowed(true);
151
                        transformationTable.setColumnSelectionAllowed(false);
152
                        transformationTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
153
                        TableColumn column = null;
154
                        for (int i = 0; i < columnNames.length; i++) {
155
                            column = transformationTable.getColumnModel().getColumn(i);
156
                            if (i == 0 || i == 3 || i == 4) {
157
                                column.setPreferredWidth(40);                                     
158
                            }else if (i == 2) {
159
                                    column.setPreferredWidth(80);
160
                            }
161
                            else {                            
162
                                column.setPreferredWidth(160);
163
                            }
164
                        }
165
                        ListSelectionModel rowSM2 = transformationTable.getSelectionModel();
166
                        rowSM2.addListSelectionListener(new ListSelectionListener() {
167
                            public void valueChanged(ListSelectionEvent e) {
168
                            }       
169
                        });
170
                }
171
                return transformationTable;
172
        }
173
        
174
        private JScrollPane getJScrollPane() {
175
                if (jScrollPane == null) {
176
                        jScrollPane = new JScrollPane();
177
                        jScrollPane.setPreferredSize(new Dimension(525,200));
178
                        jScrollPane.setBorder(
179
                                    BorderFactory.createCompoundBorder(
180
                                        BorderFactory.createCompoundBorder(
181
                                                        BorderFactory.createTitledBorder("Transformations"),
182
                                                        BorderFactory.createEmptyBorder(5,5,5,5)),
183
                                                        jScrollPane.getBorder()));
184
                        jScrollPane.setViewportView(getJTable());
185
                }
186
                return jScrollPane;
187
        }
188
                
189
        private void callTransformation(int crsCode){                
190
        int numRow = dtm.getRowCount();
191
                
192
        while (numRow != 0) {
193
                        numRow = numRow - 1;
194
                        dtm.removeRow(numRow);
195
                }
196
        
197
        String sentence = "SELECT source_geogcrs_code " +
198
                                                "FROM epsg_coordinatereferencesystem " +
199
                                                "WHERE coord_ref_sys_code = "+ crsCode ;
200
                ResultSet result = Query.select(sentence,connect.getConnection());
201
                int source = 0;
202
                try {
203
                        result.next();
204
                        source = result.getInt("source_geogcrs_code");
205
                } catch (SQLException e1) {
206
                        e1.printStackTrace();
207
                }
208
                
209
        ResultSet result2 = null;
210
        ResultSet result3 = null;
211
        if (source != 0){
212
                        crsCode = source;                                    
213
        }
214
        
215
        ArrayList codecs = new ArrayList();
216
        codecs.add(String.valueOf(crsCode));                
217
                
218
                for (int j=0; j< codecs.size(); j++){
219
                        sentence = "SELECT coord_op_code, coord_op_name, coord_op_type, source_crs_code, target_crs_code, area_of_use_code, coord_op_method_code " +
220
                                        "FROM epsg_coordoperation " +                        
221
                                        "WHERE source_crs_code = " + codecs.get(j) + "AND target_crs_code = " + crs_target;
222

    
223
            result = Query.select(sentence,connect.getConnection());        
224
            
225
            try {
226
                    while(result.next()) {
227
                            Object[]data = new Object[6];                                                            
228
                            data[0] = String.valueOf(result.getInt("coord_op_code"));
229
                            data[1] = result.getString("coord_op_name");
230
                            data[2] = result.getString("coord_op_type");
231
                            data[3] = String.valueOf(result.getInt("source_crs_code"));
232
                            data[4] = String.valueOf(result.getInt("target_crs_code"));
233
                            /*codecs.add(data[4]);
234
                            codecs = deleteItems(codecs);*/
235
                            
236
                            int aouc = Integer.parseInt(result.getString("area_of_use_code"));
237
                                        
238
                                        sentence = "SELECT area_of_use FROM epsg_area " +
239
                                                                        "WHERE area_code = "+ aouc ;
240
                                        
241
                                        result2 = Query.select(sentence,connect.getConnection());
242
                            while (result2.next())
243
                                    data[5] = result2.getString("area_of_use");
244
                            
245
                            String coord_op_method = result.getString("coord_op_method_code");                                                            
246
                                    
247
                            sentence = "SELECT reverse_op FROM epsg_coordoperationmethod "+
248
                                                    "WHERE coord_op_method_code LIKE " + coord_op_method;
249
                            result3 = Query.select(sentence,connect.getConnection());
250
                            
251
                            while(result3.next()){
252
                                    if (Integer.parseInt(result3.getString("reverse_op")) == 1){
253
                                            for (int i=0; i< transformations.length; i++){
254
                                                    if (coord_op_method.equals(transformations[i])){
255
                                                            dtm.addRow(data);
256
                                                    }
257
                                            }                                            
258
                                    }
259
                            }
260
                    }
261
            }         
262
            catch (SQLException e1) {
263
                    e1.printStackTrace();
264
            }
265
                }
266
        }
267
        
268
        private ArrayList deleteItems(ArrayList codecs) {
269
                ArrayList cod = new ArrayList();
270
                boolean equal = false;
271
                for (int i = 0; i< codecs.size(); i++){
272
                        String c = (String) codecs.get(i);
273
                        for (int j = 0; j<cod.size(); j++){
274
                                if (cod.get(j).equals(c)){
275
                                        equal = true;
276
                                }
277
                        }
278
                        if (!equal){
279
                                cod.add(c);                                
280
                        }
281
                        equal = false;
282
                }
283
                return cod;
284
        }
285
        
286
        private void callInverseTransformation(int crsCode){
287
                //inverseTranformation = true;
288
        
289
        String sentence = "SELECT source_geogcrs_code " +
290
                                                "FROM epsg_coordinatereferencesystem " +
291
                                                "WHERE coord_ref_sys_code = "+ crsCode ;
292
                ResultSet result = Query.select(sentence,connect.getConnection());
293
                int source = 0;
294
                try {
295
                        result.next();
296
                        source = result.getInt("source_geogcrs_code");
297
                } catch (SQLException e1) {
298
                        e1.printStackTrace();
299
                }
300
                
301
        ResultSet result2 = null;
302
        ResultSet result3 = null;
303
        if (source != 0){
304
                        crsCode = source;                                    
305
        }
306
        
307
        ArrayList codecs = new ArrayList();
308
        codecs.add(String.valueOf(crsCode));
309
       
310
                codecs = deleteItems(codecs);
311
                
312
                for (int j=0; j< codecs.size(); j++){
313
                        sentence = "SELECT coord_op_code, coord_op_name, coord_op_type, source_crs_code, target_crs_code, area_of_use_code, coord_op_method_code " +
314
                                        "FROM epsg_coordoperation " +                        
315
                                        "WHERE source_crs_code = " + codecs.get(j) + "AND target_crs_code = " + crs_target;
316

    
317
            result = Query.select(sentence,connect.getConnection());        
318
            
319
            try {
320
                    while(result.next()) {
321
                            Object[]data = new Object[6];                                                            
322
                            data[0] = String.valueOf(result.getInt("coord_op_code"));
323
                            data[1] = result.getString("coord_op_name");
324
                            data[2] = result.getString("coord_op_type");
325
                            data[4] = String.valueOf(result.getInt("source_crs_code"));
326
                            data[3] = String.valueOf(result.getInt("target_crs_code"));
327
                            /*codecs.add(data[4]);
328
                            codecs = deleteItems(codecs);*/
329
                            
330
                            int aouc = Integer.parseInt(result.getString("area_of_use_code"));
331
                                        
332
                                        sentence = "SELECT area_of_use FROM epsg_area " +
333
                                                                        "WHERE area_code = "+ aouc ;
334
                                        
335
                                        result2 = Query.select(sentence,connect.getConnection());
336
                            while (result2.next())
337
                                    data[5] = result2.getString("area_of_use");
338
                            
339
                            String coord_op_method = result.getString("coord_op_method_code");                                                            
340
                                    
341
                            sentence = "SELECT reverse_op FROM epsg_coordoperationmethod "+
342
                                                    "WHERE coord_op_method_code LIKE " + coord_op_method;
343
                            result3 = Query.select(sentence,connect.getConnection());
344
                            
345
                            while(result3.next()){
346
                                    if (Integer.parseInt(result3.getString("reverse_op")) == 1){
347
                                            for (int i=0; i< transformations.length; i++){
348
                                                    if (coord_op_method.equals(transformations[i])){
349
                                                            dtm.addRow(data);
350
                                                    }
351
                                            }
352
                                    }
353
                            }
354
                    }
355
            }         
356
            catch (SQLException e1) {
357
                    e1.printStackTrace();
358
            }
359
                }
360
        }
361
        
362
        public void setValues(String[] val) {
363
                values = val;
364
        }
365
        
366
        public String[] getValues() {
367
                return values;
368
        }
369
        
370
        private void setTrasformation_code(int t_cod) {
371
                transformation_code = t_cod;
372
        }
373
        
374
        public int getTransformation_code() {
375
                return transformation_code;
376
        }
377
                
378
        public ICrs getProjection() {
379
                params += values[0];
380
                for(int i = 1; i < values.length; i++)
381
                        params +=","+values[i];
382
                try {
383
                        ICrs crs = new CrsFactory().getCRS(crs_source_code,
384
                                        cadWKT,params);
385
                        return crs;
386
                } catch (org.gvsig.crs.CrsException e) {
387
                        e.printStackTrace();
388
                }
389
                return null;
390
        }
391
        
392
        public void setProjection(IProjection proj) {
393
                firstProj = proj;
394
        }
395
        
396
        public void setWKT(String cad){
397
                cadWKT = cad;
398
                getInfo();
399
        }
400
        
401
        public String getWKT(){
402
                return cadWKT;
403
        }
404
        
405
        public void setSource(int code){
406
                inverseTranformation = false;
407
                crs_source_code = code;
408
                callTransformation(crs_source_code);
409
                
410
                int new_target = crs_target;
411
                crs_target = code;
412
                crs_source_code = new_target;
413
                callInverseTransformation(crs_source_code);
414
                int real_source = crs_target;
415
                crs_target = new_target;
416
                crs_source_code = real_source;
417
            
418
                int numr = dtm.getRowCount();
419
                if (numr > 0 ){                        
420
                        this.getJTable().setRowSelectionInterval(0,0);
421
                }
422
        }
423
        
424
        public int getSource(){
425
                return crs_source_code;
426
        }
427
        
428
        public WindowInfo getWindowInfo() {
429
                WindowInfo m_viewinfo=new WindowInfo(WindowInfo.MODALDIALOG);
430
                   m_viewinfo.setTitle("Transformation EPSG");
431
                return m_viewinfo;
432
        }
433

    
434
        public void valueChanged(ListSelectionEvent e) {
435
                // TODO Auto-generated method stub
436
                if (e.getSource() == this.getJTable()){
437
                        lsm2 = (ListSelectionModel)e.getSource();
438
                if (lsm2.isSelectionEmpty()) {
439
                        selectedRowTable = -1;
440
                        tra = false;
441
                } 
442
                else {
443
                    selectedRowTable = lsm2.getMinSelectionIndex();
444
                    setTrasformation_code(Integer.parseInt((String)dtm.getValueAt(selectedRowTable,0)));
445
                    String sentence = "SELECT source_crs_code " +
446
                                                                "FROM epsg_coordoperation " +                        
447
                                                                "WHERE coord_op_code = " + getTransformation_code() ;
448
                    ResultSet result = Query.select(sentence,connect.getConnection());
449
                    try {
450
                                        result.next();
451
                                        int source = result.getInt("source_crs_code");
452
                                        if (source == getSource()) {
453
                                                inverseTranformation = false;
454
                                        }
455
                                        else inverseTranformation = true;
456
                                } catch (SQLException e1) {                                                        
457
                                        e1.printStackTrace();
458
                                }
459
                }
460
                }
461
        }
462

    
463
}