Statistics
| Revision:

root / trunk / libraries / libJCRS / src / org / gvsig / crs / ogr / GetCRSepsg.java @ 7576

History | View | Annotate | Download (12.2 KB)

1
package org.gvsig.crs.ogr;
2

    
3
import java.sql.ResultSet;
4
import java.sql.SQLException;
5

    
6
import org.gvsig.crs.EpsgConnection;
7
import org.gvsig.crs.Query;
8

    
9
import org.gvsig.crs.gui.panels.ProjChooserPanel;
10

    
11

    
12
public class GetCRSepsg {
13
        
14
        int epsg_code;
15
        boolean crs_source;
16
        int source_code;
17
        int projection_code;        
18
        int coord_op_code;        
19
        
20
        ProjChooserPanel pcp;
21
        
22
        int datum_code;
23
        int ellipsoid_code, prime_meridian_code;
24
        
25
        String PROJCS = null;
26
        String GEOGCS = null;
27
        String DATUM = null;
28
        String[] SPHEROID = null;
29
        String[] PRIMEM = null;
30
        String UNIT_A = "Decimal Degree";
31
        String UNIT_B = "Meter";
32
        String PROJECTION = null;
33
        //ArrayList PARAMETER = null;
34
        String[] param_name = null;
35
        String[] param_value = null;
36
        
37
        public GetCRSepsg(){                
38
        }        
39
        
40
        public GetCRSepsg(int code, boolean source_yn, int source_cod, int coord_op_cod, ProjChooserPanel pc){
41
                epsg_code = code;
42
                crs_source = source_yn;
43
                source_code = source_cod;                
44
                coord_op_code = coord_op_cod;
45
                pcp = pc;
46
                SPHEROID = new String[3];
47
                PRIMEM = new String[2];                        
48
        }
49
        
50
        public void Getepsgdata(){
51
                ResultSet result;
52
                ResultSet result2;
53
                /*
54
                 * Si es base solamente realizamos una consulta, y ya tenemos el Datum
55
                 * (ver en caso de ser fuente que PROJCS no tiene que estar definido)
56
                 */
57
                if (crs_source){
58
                        String sentence = "SELECT coord_ref_sys_name, datum_code " +
59
                                                          "FROM epsg_coordinatereferencesystem " +                                      
60
                                                          "WHERE coord_ref_sys_code = " + epsg_code;
61
                        result = Query.select(sentence,pcp.connect.getConnection());
62
                        try {
63
                                while (result.next()){
64
                                        GEOGCS = result.getString("coord_ref_sys_name");
65
                                        datum_code = Integer.parseInt(result.getString("datum_code"));                                        
66
                                }
67
                        } catch (SQLException e) {
68
                                e.printStackTrace();
69
                        }                        
70
                }
71
                else{
72
                        String sentence = "SELECT coord_ref_sys_name " +
73
                                                          "FROM epsg_coordinatereferencesystem " +                                      
74
                                                          "WHERE coord_ref_sys_code = " + epsg_code;
75
                        result = Query.select(sentence,pcp.connect.getConnection());
76
                        
77
                        String sentence2 = "SELECT coord_ref_sys_name, datum_code " +
78
                                                          "FROM epsg_coordinatereferencesystem " +                                      
79
                                                          "WHERE coord_ref_sys_code = " + source_code;
80
                        result2 = Query.select(sentence2,pcp.connect.getConnection());
81
                        
82
                        try {
83
                                while (result.next()){
84
                                        PROJCS = result.getString("coord_ref_sys_name");                                        
85
                                }
86
                                while (result2.next()){
87
                                        datum_code = Integer.parseInt(result2.getString("datum_code"));
88
                                        GEOGCS = result2.getString("coord_ref_sys_name");
89
                                }
90
                        } catch (SQLException e) {
91
                                e.printStackTrace();
92
                        }
93
                }
94
                /*
95
                 * hasta aqui hemos rellenado projcs, geocs y tenemos el codigo de datum
96
                 * vamos a obtener los c?digos del elipsoide y el prime_meridian
97
                 */
98
                String sentence = "SELECT datum_name, ellipsoid_code, prime_meridian_code " +
99
                                                  "FROM epsg_datum " +                                      
100
                                                  "WHERE datum_code = " + datum_code;
101
                result = Query.select(sentence,pcp.connect.getConnection());
102
                try {
103
                        while (result.next()){
104
                                DATUM = result.getString("datum_name");
105
                                ellipsoid_code = Integer.parseInt(result.getString("ellipsoid_code"));        
106
                                prime_meridian_code = Integer.parseInt(result.getString("prime_meridian_code"));
107
                        }                        
108
                } catch (SQLException e) {
109
                        e.printStackTrace();
110
                }
111
                
112
                /*
113
                 * Ahora vamos a coger varios campos del elipsoide y operaremos con ellos, si la
114
                 * informaci?n de los mismos no esta en las unidades de medida que utilizaremos.
115
                 */
116
                sentence = "SELECT ellipsoid_name, semi_major_axis, inv_flattening, uom_code, " +
117
                                        "semi_minor_axis, ellipsoid_shape " +
118
                                          "FROM epsg_ellipsoid " +                                      
119
                                          "WHERE ellipsoid_code = " + ellipsoid_code;
120
                result = Query.select(sentence,pcp.connect.getConnection());
121
                
122
                SPHEROID = getEllipsoid(result);
123
                
124
                sentence = "SELECT prime_meridian_name, greenwich_longitude, uom_code " +
125
                                          "FROM epsg_primemeridian " +                                      
126
                                          "WHERE prime_meridian_code = " + prime_meridian_code;
127
                result = Query.select(sentence,pcp.connect.getConnection());
128
                
129
                PRIMEM = getPrimeMeridian(result);
130
                
131
                /*
132
                 * si tiene proyecci?n porque es proyectado, la buscamos
133
                 */
134
                if (!crs_source){                        
135
                        sentence = "SELECT coord_op_method_code " +
136
                                                "FROM epsg_coordoperation " +
137
                                                "WHERE coord_op_code = " + coord_op_code;
138
                        result = Query.select(sentence,pcp.connect.getConnection());
139
                        try {
140
                                while (result.next()){
141
                                        projection_code = result.getInt("coord_op_method_code");
142
                                }
143
                        } catch (SQLException e) {
144
                                e.printStackTrace();
145
                        }
146
                        
147
                        
148
                        sentence = "SELECT coord_op_method_name " +
149
                                                  "FROM epsg_coordoperationmethod " +                                      
150
                                                  "WHERE coord_op_method_code = " + projection_code;
151
                        result = Query.select(sentence,pcp.connect.getConnection());
152
                        try {
153
                                while (result.next()){
154
                                        PROJECTION = result.getString("coord_op_method_name");                                
155
                                }                        
156
                        } catch (SQLException e) {
157
                                e.printStackTrace();
158
                        }
159
                        
160
                        parameters(projection_code);
161
                }
162
                /*
163
                 * Una vez que tengo todo, hago la llamada al constructor de Epsg2wkt para pasarle los
164
                 * parametros y realizar la cadena
165
                 * CAMBIARLO Y PONER METODOS getXXX para todos los parametros para hacerlo mas generico
166
                         
167
                if (crs_source){
168
                        cadwkt = new Epsg2wkt(0);
169
                }
170
                else{
171
                        cadwkt = new Epsg2wkt();
172
                }
173
                */
174
        }
175
        
176
        private String[] getEllipsoid(ResultSet result) {
177
                String[] spheroid = new String[3];                
178
                double semi_major_axis = 0;
179
                double semi_minor_axis = 0;
180
                double inv_flattening = 0;
181
                int uom_code = 0;
182
                int ellipsoid_shape = 0;
183
                
184
                try {
185
                        while (result.next()){
186
                                spheroid[0] = result.getString("ellipsoid_name");
187
                                semi_major_axis = result.getDouble("semi_major_axis");
188
                                semi_minor_axis = result.getDouble("semi_minor_axis");
189
                                inv_flattening = result.getDouble("inv_flattening");
190
                                uom_code = result.getInt("uom_code");
191
                                ellipsoid_shape = result.getInt("ellipsoid_shape");
192
                        }                        
193
                } catch (SQLException e) {
194
                        e.printStackTrace();
195
                }
196
                
197
                /*
198
                 * pasaremos a metros las unidades del semi_major_axis, semi_minor_axis
199
                 */
200
                String sentence = "SELECT factor_b, factor_c " +
201
                                                  "FROM epsg_unitofmeasure " +                                      
202
                                                  "WHERE uom_code = " + uom_code;
203
                ResultSet result2 = Query.select(sentence,pcp.connect.getConnection());
204
                
205
                double factor_b = 0;
206
                double factor_c = 0;
207
                try{                        
208
                        while (result2.next()){
209
                                factor_b = result2.getDouble("factor_b");
210
                                factor_c = result2.getDouble("factor_c");                                
211
                        }
212
                } catch (SQLException e) {
213
                        e.printStackTrace();
214
                }
215
                if (factor_b != 0 && factor_c != 0 ){
216
                        semi_major_axis = (semi_major_axis * factor_b)/ factor_c;
217
                        if (semi_minor_axis != 0){
218
                                semi_minor_axis = (semi_minor_axis * factor_b) / factor_c;
219
                        }
220
                }
221
                /*
222
                 * calculamos inv_flattening en caso de que sea nulo
223
                 */
224
                if (inv_flattening == 0){
225
                        if (ellipsoid_shape == 0){
226
                                inv_flattening = 0;
227
                        }
228
                        else{
229
                                inv_flattening = (semi_major_axis) / (semi_major_axis - semi_minor_axis);
230
                        }
231
                }                
232
                spheroid[1] = ""+semi_major_axis;
233
                spheroid[2] = ""+inv_flattening;
234
                
235
                return spheroid;
236
        }
237

    
238
        private String[] getPrimeMeridian(ResultSet result) {
239
                String[] primem = new String[2];
240
                double greenwich_longitude = 0;
241
                
242
                try {
243
                        while (result.next()){
244
                                primem[0] = result.getString("prime_meridian_name");
245
                                greenwich_longitude = result.getDouble("greenwich_longitude");
246
                                int co= Integer.parseInt((String)result.getString("uom_code"));
247
                                /*
248
                                 * Realizamos este cambio de meridiano origen de la unidad de la epsg
249
                                 * a degrees, para insertarlo en este formato en wkt
250
                                 */
251
                                ResultSet result2 = null;
252
                                if (co != 9110){
253
                                        String sentence = "SELECT factor_b, factor_c " +
254
                                          "FROM epsg_unitofmeasure " +                                      
255
                                          "WHERE uom_code = " + co;
256
                                        result2 = Query.select(sentence,pcp.connect.getConnection());
257
                                        
258
                                        while(result.next()){                                                
259
                                                greenwich_longitude = ((greenwich_longitude * result2.getDouble("factor_b") )/ result2.getDouble("factor_c")) * (180.0 / Math.PI);
260
                                        }                                        
261
                                }
262
                        }
263
                } catch (SQLException e) {
264
                        e.printStackTrace();
265
                }
266
                
267
                primem[1] = ""+greenwich_longitude;
268
                return primem;
269
        }
270
        
271
        private void parameters(int proj) {
272
                /*
273
                 * para la consecucion de los parametros se tiene que ir buscando dependiendo de la
274
                 * proyeccion que se utilice, hay que ver que parametros exactos tiene cada uno de ellos
275
                 * y si hay mas de 17, que son los que se utilizan en WKT, como vamos a tratarlos, mensaje
276
                 * de error, intentar no mostrarlos, o simplemente pasar de ellos
277
                 */                
278
                                        
279
                ResultSet result;
280
                ResultSet result2;
281
                ResultSet result3;
282
                
283
                /*
284
                 * Conseguimos la lista de parametros y valores, ordenados segun sort_order de manera
285
                 * ascendente por lo que coincidiram siempre param_name[i] y param_value[i]
286
                 */
287
                String sentence = "SELECT COUNT(*) " +
288
                                "FROM epsg_coordoperationparamusage " +
289
                                "WHERE coord_op_method_code = " + proj;
290
                result = Query.select(sentence,pcp.connect.getConnection());
291
                
292
                int count = 0;
293
                try {
294
                        result.next();
295
                        count = result.getInt(1);
296
                } catch (SQLException e1) {
297
                        e1.printStackTrace();
298
                }                
299
                param_name = new String[count];
300
                param_value = new String[count];
301
                
302
                sentence = "SELECT parameter_code " +
303
                "FROM epsg_coordoperationparamusage " +
304
                "WHERE coord_op_method_code = " + proj + " " +
305
                                "ORDER BY sort_order ASC";
306
                result = Query.select(sentence,pcp.connect.getConnection());
307
                
308
                int i = 0;
309
                try {
310
                        while (result.next()) {
311
                                
312
                                int cod = result.getInt("parameter_code");
313
                                /*
314
                                 * con el codigo del parametro, obtenemos tanto su nombre como su valor
315
                                 */
316
                                sentence = "SELECT parameter_name " +
317
                                                "FROM epsg_coordoperationparam " +
318
                                                "WHERE parameter_code = " + cod;
319
                                result2 = Query.select(sentence,pcp.connect.getConnection());
320
                                
321
                                result2.next();
322
                                param_name[i] = result2.getString("parameter_name");
323
                                
324
                                sentence = "SELECT parameter_value, uom_code " +
325
                                                "FROM epsg_coordoperationparamvalue " +
326
                                                "WHERE parameter_code = " + cod + " AND coord_op_code = " + coord_op_code;
327
                                result3 = Query.select(sentence,pcp.connect.getConnection());
328
                                
329
                                result3.next();
330
                                double param_val = result3.getDouble("parameter_value");
331
                                int uom_code = result3.getInt("uom_code");
332
                                
333
                                sentence = "SELECT factor_b, factor_c, unit_of_meas_type " +
334
                                                  "FROM epsg_unitofmeasure " +                                      
335
                                                  "WHERE uom_code = " + uom_code;
336
                                ResultSet result4 = Query.select(sentence,pcp.connect.getConnection());
337
                                
338
                                double factor_b = 0;
339
                                double factor_c = 0;                                
340
                                result4.next();
341
                                String type = result4.getString("unit_of_meas_type");
342
                                factor_b = result4.getDouble("factor_b");
343
                                factor_c = result4.getDouble("factor_c");                                
344
                                                                
345
                                if (factor_b != 0 && factor_c != 0 && !type.equals("angle")){
346
                                        param_val = (param_val * factor_b) / factor_c;
347
                                }
348
                                else if(factor_b != 0 && factor_c != 0 && type.equals("angle")){
349
                                        param_val = ((param_val * factor_b) / factor_c) * (180.0 / Math.PI);;
350
                                }else if (uom_code == 9110){
351
                                        param_val = especialDegree(param_val);
352
                                        param_val = Math.toDegrees(param_val);
353
                                }else {
354
                                        System.out.println("C?digo de medida no v?lido...");                                        
355
                                }                                
356
                                param_value[i] = ""+param_val;
357
                                
358
                                i++;
359
                        }
360
                } catch (SQLException e) {
361
                        e.printStackTrace();
362
                }
363
                        
364
        }        
365
        
366
        private double especialDegree(double val){
367
                int signo = 1;
368
                double grad, min;
369
                double sec;
370
                
371
                if (val < 0){
372
                        signo = -1;
373
                        val = Math.abs(val);
374
                }                
375
                
376
                grad = Math.floor(val);
377
                val=(val-grad)*100.0;
378
                min=Math.floor(val);
379
                sec=(val-min)*100.0;
380
                
381
                val = ((grad + (min/60.0) + (sec/3600.0)) * (Math.PI/180.0)) * signo;
382
                
383
                return val;
384
        }
385
        
386
        private float round(double f,int i)
387
        {
388
                double d=Math.pow(10.0,(double) i);
389
                double aux=f*d;
390
                int auxi=(int) aux;
391
                float df=auxi/((float) d);
392
                return df;
393
        }
394
        
395
        public String getPROJCS(){
396
                return PROJCS;
397
        }
398
        
399
        public String getGEOGCS(){
400
                return GEOGCS;
401
        }
402
        
403
        public String getDATUM(){
404
                return DATUM;
405
        }
406
        
407
        public String[] getSPHEROID(){
408
                return SPHEROID;
409
        }
410
        
411
        public String[] getPRIMEM(){
412
                return PRIMEM;
413
        }
414
        
415
        public String getUNIT_A(){
416
                return UNIT_A;
417
        }
418
        
419
        public String getPROJECTION(){
420
                return PROJECTION;
421
        }
422
        
423
        public String[] getParam_name(){
424
                return param_name;
425
        }
426
        
427
        public String[] getParam_value(){
428
                return param_value;
429
        }
430
        
431
        public String getUNIT_B(){
432
                return UNIT_B;
433
        }        
434
}