Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libJCRS / src / org / gvsig / crs / CrsWkt.java @ 29000

History | View | Annotate | Download (22.2 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2006 Instituto de Desarrollo Regional and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   Instituto de Desarrollo Regional (Universidad de Castilla La-Mancha)
34
 *   Campus Universitario s/n
35
 *   02071 Alabacete
36
 *   Spain
37
 *
38
 *   +34 967 599 200
39
 */
40

    
41
package org.gvsig.crs;
42

    
43
import java.util.ArrayList;
44

    
45
import javax.units.ConversionException;
46
import javax.units.Unit;
47

    
48
import org.geotools.referencing.CRS;
49
import org.geotools.referencing.crs.AbstractSingleCRS;
50
import org.geotools.referencing.crs.DefaultGeographicCRS;
51
import org.geotools.referencing.crs.DefaultProjectedCRS;
52
import org.geotools.referencing.datum.DefaultEllipsoid;
53
import org.geotools.referencing.datum.DefaultGeodeticDatum;
54
import org.geotools.referencing.datum.DefaultPrimeMeridian;
55
import org.opengis.referencing.FactoryException;
56
import org.opengis.referencing.NoSuchAuthorityCodeException;
57
import org.opengis.referencing.crs.CoordinateReferenceSystem;
58
import org.opengis.referencing.datum.PrimeMeridian;
59

    
60
/**
61
 * Clase que parsea una cadena wkt y consigue todos sus par?metros
62
 * de manera independiente para poder ser utilizados
63
 * en distintas funciones
64
 * 
65
 * @author Jos? Luis G?mez Mart?nez (JoseLuis.Gomez@uclm.es)
66
 *
67
 */
68

    
69
public class CrsWkt {
70
        private String wkt;
71
        private String projcs = "";
72
        private String geogcs = "";
73
        private String datum = "";
74
        private String[] spheroid = {"" ,"",""};
75
        private String[] primem = {"",""};
76
        private String[] unit = {"",""};
77
        private String[] unit_p = {"",""}; //unidades de la projeccion (final de la cadena wkt)
78
        private String projection = "";
79
        private String[] param_name;
80
        private String[] param_value;
81
        private int contador = 0;
82
        private String[] authority = {"",""};
83
        
84
        int divider=10000;
85
        
86
        /**
87
     * Small tolerance factor for rounding errors.
88
     */
89
    private static final double EPS = 1E-8;
90
        
91
        public CrsWkt(String wkt_spaces) {
92
                String aux;
93
                String wkt = "";
94
                for(int i = 0; i < wkt_spaces.length(); i++) {
95
                        aux = ""+wkt_spaces.charAt(i);
96
                        if(!aux.equals(" ")) {
97
                                wkt+=aux;
98
                        }else {
99
                                wkt += "";
100
                        }
101
                }
102
                if (wkt.length()>15) {
103
                        fromWKT(wkt, false);
104
                } else {
105
                        fromCode(wkt);
106
                }
107
        }
108
        
109
        public CrsWkt(CoordinateReferenceSystem crsGT) {
110
                AbstractSingleCRS crs = (AbstractSingleCRS)crsGT;
111
                String authority = crs.getName().toString().split(":")[0];
112
                setAuthority(((AbstractSingleCRS)crsGT).getIdentifiers().iterator().next().toString());
113
                setWkt(crsGT.toWKT());
114
                
115
                if (crsGT instanceof DefaultProjectedCRS) {
116
                        DefaultProjectedCRS sour = (DefaultProjectedCRS) crsGT;
117
                        setProjcs(sour.getName().toString().split(":")[1]);
118
                        String[] val = sour.getBaseCRS().getName().toString().split(":");
119
                        if (val.length<2)
120
                                setGeogcs(sour.getBaseCRS().getName().toString().split(":")[0]);
121
                        else
122
                                setGeogcs(sour.getBaseCRS().getName().toString().split(":")[1]);
123
                        DefaultGeodeticDatum d = (DefaultGeodeticDatum) sour.getDatum();
124
                        val = d.getName().toString().split(":");
125
                        if (val.length<2)
126
                                setDatumName(d.getName().toString().split(":")[0]);
127
                        else
128
                                setDatumName(d.getName().toString().split(":")[1]);
129
                        setSpheroid((DefaultEllipsoid)d.getEllipsoid());                                
130
                        setPrimen(d.getPrimeMeridian());
131
                        val = sour.getConversionFromBase().getMethod().getName().toString().split(":");
132
                        if (val.length<2)
133
                                setProjection(sour.getConversionFromBase().getMethod().getName().toString().split(":")[0]);
134
                        else
135
                                setProjection(sour.getConversionFromBase().getMethod().getName().toString().split(":")[1]);
136
                        String str;
137
                        param_name = new String[sour.getConversionFromBase().getParameterValues().values().size()];
138
                        param_value= new String[sour.getConversionFromBase().getParameterValues().values().size()];
139
                        for (int i=0; i< sour.getConversionFromBase().getParameterValues().values().size();i++) {
140
                                str = sour.getConversionFromBase().getParameterValues().values().get(i).toString();
141
                                Unit u = sour.getConversionFromBase().getParameterValues().parameter(str.split("=")[0]).getUnit();
142
                                double value = sour.getConversionFromBase().getParameterValues().parameter(str.split("=")[0]).doubleValue();
143
                                value = convert(value, u.toString());
144
                                param_name[i] = str.split("=")[0];
145
                                param_value [i] = String.valueOf(value);
146
                        }
147
                        
148
                }
149
                
150
                if (crsGT instanceof DefaultGeographicCRS) {
151
                        DefaultGeographicCRS sour = (DefaultGeographicCRS) crsGT;
152
                        String[] val = sour.getName().toString().split(":");
153
                        if (val.length<2)
154
                                setGeogcs(sour.getName().toString().split(":")[0]);
155
                        else
156
                                setGeogcs(sour.getName().toString().split(":")[1]);
157
                        
158
                        DefaultGeodeticDatum d = (DefaultGeodeticDatum) sour.getDatum();
159
                        val = d.getName().toString().split(":");
160
                        if (val.length<2)
161
                                setDatumName(d.getName().toString().split(":")[0]);
162
                        else
163
                                setDatumName(d.getName().toString().split(":")[1]);
164
                        setSpheroid((DefaultEllipsoid)d.getEllipsoid());                                
165
                        setPrimen(d.getPrimeMeridian());
166
                        
167
                } 
168
        }
169
        
170
        /**
171
         * Acepta la cadena wkt y si es un CRS proyectado para conseguir el parser
172
         * de los dos modelos de cadena wkt que se utilizan, una cuando es base
173
         * y otra cuando es proyectado
174
         * @param wkt
175
         * @param isProj
176
         */
177
        private void fromWKT(String wkt, boolean isProj) {
178
                
179
                String res = new String();
180
                if(!wkt.startsWith("EPSG:")) {
181
                        res = "";
182
                        for(; wkt.charAt(contador) != '"'; contador++) {
183
                                res += wkt.charAt(contador);
184
                        }
185
                        if(res.equals("GEOGCS[")) {
186
                                
187
                                contador++;
188
                                for(; wkt.charAt(contador) != '"'; contador++) {
189
                                        geogcs += wkt.charAt(contador);
190
                                }
191
                                
192
                                res = "";
193
                                contador++;
194
                                for(; wkt.charAt(contador) != '"'; contador++) {
195
                                        res += wkt.charAt(contador);
196
                                }
197
                                if(res.equals(",DATUM[")) {
198
                                        contador++;
199
                                        for(; wkt.charAt(contador) != '"'; contador++) {
200
                                                datum += wkt.charAt(contador);
201
                                        }
202
                                }
203
                                res = "";
204
                                contador++;
205
                                for(; wkt.charAt(contador) != '"'; contador++) {
206
                                        res += wkt.charAt(contador);
207
                                }
208
                                if(res.equals(",SPHEROID[")) {
209
                                        contador++;
210
                                        for(; wkt.charAt(contador) != ']'; contador++) {
211
                                                while(wkt.charAt(contador) != '"' ) {
212
                                                        spheroid[0] += wkt.charAt(contador);
213
                                                        contador++;
214
                                                }
215
                                                contador +=2;
216
                                                while(wkt.charAt(contador) != ',') {
217
                                                        spheroid[1] += wkt.charAt(contador);
218
                                                        contador++;
219
                                                }
220
                                                contador++;
221
                                                while(wkt.charAt(contador) != ']') {
222
                                                        spheroid[2] += wkt.charAt(contador);
223
                                                        contador++;
224
                                                }
225
                                        }
226
                                }
227
                                contador++;
228
                                res = "";
229
                                for(; wkt.charAt(contador) != '"'; contador++) {
230
                                        res += wkt.charAt(contador);
231
                                }
232
                                if(res.equals(",PRIMEM[")) {
233
                                        contador++;
234
                                        for(; wkt.charAt(contador) != ','; contador++) {
235
                                                while(wkt.charAt(contador) != '"' ){
236
                                                        primem[0] += wkt.charAt(contador);
237
                                                        contador ++;
238
                                                }
239
                                                contador +=2;
240
                                                while(wkt.charAt(contador) != ']') {
241
                                                        primem[1] += wkt.charAt(contador);
242
                                                        contador ++;
243
                                                }
244
                                        }
245
                                }
246
                                contador++;
247
                                res = "";
248
                                for(; wkt.charAt(contador) != '"'; contador++) {
249
                                        res += wkt.charAt(contador);
250
                                }
251
                                if(res.equals("UNIT[")) {
252
                                        contador++;
253
                                        for(; wkt.charAt(contador) != ','; contador++) {
254
                                                while(wkt.charAt(contador) != '"' ){
255
                                                        unit[0] += wkt.charAt(contador);
256
                                                        contador ++;
257
                                                }
258
                                                contador +=2;
259
                                                while(wkt.charAt(contador) != ']') {
260
                                                        unit[1] += wkt.charAt(contador);
261
                                                        contador ++;
262
                                                }
263
                                        }
264
                                }
265
                                contador++;
266
                                res = "";
267
                                for(; wkt.charAt(contador) != '"'; contador++) {
268
                                        res += wkt.charAt(contador);
269
                                }
270
                                if(res.equals("AUTHORITY[")) {
271
                                        contador++;
272
                                        for(; wkt.charAt(contador) != ']'; contador++) {
273
                                                while(wkt.charAt(contador) != '"' ){
274
                                                        authority[0] += wkt.charAt(contador);
275
                                                        contador ++;
276
                                                }
277
                                                contador +=2;
278
                                                while(wkt.charAt(contador) != ']') {
279
                                                        authority[1] += wkt.charAt(contador);
280
                                                        contador ++;
281
                                                }
282
                                        }
283
                                }
284
                        }else if (res.equals("PROJCS[")) {
285
                                contador++;
286
                                for(; wkt.charAt(contador) != '"'; contador++) {
287
                                        projcs += wkt.charAt(contador);
288
                                }
289
                                contador++;
290
                                res = "";
291
                                for(; wkt.charAt(contador) != '"'; contador++) {
292
                                        res += wkt.charAt(contador);
293
                                }
294
                                if(res.equals(",GEOGCS[")) {
295
                                        contador++;
296
                                        for(; wkt.charAt(contador) != '"'; contador++) {
297
                                                geogcs += wkt.charAt(contador);
298
                                        }
299
                                }
300
                                                                
301
                                res = "";
302
                                contador++;
303
                                for(; wkt.charAt(contador) != '"'; contador++) {
304
                                        res += wkt.charAt(contador);
305
                                }
306
                                if(res.equals(",DATUM[")) {
307
                                        contador++;
308
                                        for(; wkt.charAt(contador) != '"'; contador++) {
309
                                                datum += wkt.charAt(contador);
310
                                        }
311
                                }
312
                                res = "";
313
                                contador++;
314
                                for(; wkt.charAt(contador) != '"'; contador++) {
315
                                        res += wkt.charAt(contador);
316
                                }
317
                                if(res.equals(",SPHEROID[")) {
318
                                        contador++;
319
                                        for(; wkt.charAt(contador) != ']'; contador++) {
320
                                                while(wkt.charAt(contador) != '"' ) {
321
                                                        spheroid[0] += wkt.charAt(contador);
322
                                                        contador++;
323
                                                }
324
                                                contador +=2;
325
                                                while(wkt.charAt(contador) != ',') {
326
                                                        spheroid[1] += wkt.charAt(contador);
327
                                                        contador++;
328
                                                }
329
                                                contador++;
330
                                                while(wkt.charAt(contador) != ']') {
331
                                                        spheroid[2] += wkt.charAt(contador);
332
                                                        contador++;
333
                                                }
334
                                        }
335
                                }
336
                                contador++;
337
                                res = "";
338
                                for(; wkt.charAt(contador) != '"'; contador++) {
339
                                        res += wkt.charAt(contador);
340
                                }
341
                                if(res.equals(",PRIMEM[")) {
342
                                        contador++;
343
                                        for(; wkt.charAt(contador) != ','; contador++) {
344
                                                while(wkt.charAt(contador) != '"' ){
345
                                                        primem[0] += wkt.charAt(contador);
346
                                                        contador ++;
347
                                                }
348
                                                contador +=2;
349
                                                while(wkt.charAt(contador) != ']') {
350
                                                        primem[1] += wkt.charAt(contador);
351
                                                        contador ++;
352
                                                }
353
                                        }
354
                                }
355
                                contador++;
356
                                res = "";
357
                                for(; wkt.charAt(contador) != '"'; contador++) {
358
                                        res += wkt.charAt(contador);
359
                                }
360
                                if(res.equals("UNIT[")) {
361
                                        contador++;
362
                                        for(; wkt.charAt(contador) != ']'; contador++) {
363
                                                while(wkt.charAt(contador) != '"' ){
364
                                                        unit[0] += wkt.charAt(contador);
365
                                                        contador ++;
366
                                                }
367
                                                contador +=2;
368
                                                while(wkt.charAt(contador) != ']') {
369
                                                        unit[1] += wkt.charAt(contador);
370
                                                        contador ++;
371
                                                }
372
                                        }
373
                                }
374
                                contador++;
375
                                res = "";
376
                                for(; wkt.charAt(contador) != '"'; contador++) {
377
                                        res += wkt.charAt(contador);
378
                                }
379
                                if(res.equals(",PROJECTION[")) {
380
                                        contador++;
381
                                        for(; wkt.charAt(contador) != '"'; contador++) {
382
                                                projection += wkt.charAt(contador);
383
                                        }
384
                                }
385
                                contador = contador+2;
386
                                res = "";
387
                                for(; wkt.charAt(contador) != '"'; contador++) {
388
                                        res += wkt.charAt(contador);
389
                                }
390
                                //Hallamos el numero de parametros que tiene la cadena wkt
391
                                int i = 0;
392
                                
393
                                int copiacontador = contador;
394
                                if(res.equals(",PARAMETER[")) {
395
                                        do{
396
                                                for(; wkt.charAt(copiacontador) != ']'; copiacontador++) {
397
                                                        while(wkt.charAt(copiacontador) != '"' )
398
                                                                copiacontador++;
399
                                                        copiacontador += 2;
400
                                                        while(wkt.charAt(copiacontador) != ']' )
401
                                                                copiacontador++;
402
                                                        copiacontador--;
403
                                                }
404
                                                i++;
405
                                                copiacontador++;
406
                                                res = "";
407
                                                for(; wkt.charAt(copiacontador) != '"'; copiacontador++) {
408
                                                        res += wkt.charAt(copiacontador);
409
                                                }
410
                                        } while (res.equals(",PARAMETER["));
411
                                        res = ",PARAMETER[";
412
                                }
413
                                // Inicializamos los parametros
414
                                param_name = new String[i];
415
                                param_value = new String[i];
416
                                for(int j = 0 ;j < i; j++ ){
417
                                        param_name[j] = "";
418
                                        param_value[j] = "";
419
                                }
420
                                i = 0;
421
                                if(res.equals(",PARAMETER[")) {
422
                                        do{
423
                                                contador++;
424
                                                for(; wkt.charAt(contador) != ']'; contador++) {
425
                                                        while(wkt.charAt(contador) != '"' ){
426
                                                                param_name[i] += wkt.charAt(contador);
427
                                                                contador++;
428
                                                        }
429
                                                        contador += 2;
430
                                                        while(wkt.charAt(contador) != ']' ){
431
                                                                param_value[i] += wkt.charAt(contador);
432
                                                                contador++;
433
                                                        }
434
                                                        contador--;
435
                                                }
436
                                                i++;
437
                                                contador++;
438
                                                res = "";
439
                                                for(; wkt.charAt(contador) != '"'; contador++) {
440
                                                        res += wkt.charAt(contador);
441
                                                }
442
                                        } while (res.equals(",PARAMETER["));                                        
443
                                }
444
                                
445
                                if (res.equals(",UNIT[")){
446
                                        contador++;
447
                                        for(; wkt.charAt(contador) != ','; contador++) {
448
                                                while(wkt.charAt(contador) != '"' ){
449
                                                        unit_p[0] += wkt.charAt(contador);
450
                                                        contador ++;
451
                                                }
452
                                                contador +=2;
453
                                                while(wkt.charAt(contador) != ']') {
454
                                                        unit_p[1] += wkt.charAt(contador);
455
                                                        contador ++;
456
                                                }
457
                                        }
458
                                }
459
                                contador++;
460
                                res = "";
461
                                for(; wkt.charAt(contador) != '"'; contador++) {
462
                                        res += wkt.charAt(contador);
463
                                }
464
                                if(res.equals("AUTHORITY[")) {
465
                                        contador++;
466
                                        for(; wkt.charAt(contador) != ']'; contador++) {
467
                                                while(wkt.charAt(contador) != '"' ){
468
                                                        authority[0] += wkt.charAt(contador);
469
                                                        contador ++;
470
                                                }
471
                                                contador +=2;
472
                                                while(wkt.charAt(contador) != ']') {
473
                                                        authority[1] += wkt.charAt(contador);
474
                                                        contador ++;
475
                                                }
476
                                        }
477
                                }
478
                        }
479
                        else if (res.equals("GEOCCS[")){
480
                                /*
481
                                 * parte necesaria para capturar la cadena geocentrica...
482
                                 */
483
                                
484
                        }
485
                }else
486
                        geogcs = wkt;
487
        }
488
        
489
        public String getProjection() {
490
                return projection;
491
        }
492
        
493
        public String getProjcs() {
494
                return projcs;
495
        }
496
        
497
        public String getGeogcs() {
498
                return geogcs;
499
        }
500
        
501
        public String getDatumName() {
502
                return datum;
503
        }
504
        
505
        public String[] getSpheroid() {
506
                return spheroid;
507
        }
508
        
509
        public String[] getPrimen() {
510
                return primem;
511
        }
512
        
513
        public String getName() {
514
                if(projcs == "") 
515
                        return geogcs;
516
                return projcs;
517
        }
518
        
519
        public String[] getUnit() {
520
                return unit;
521
        }
522
        
523
        public String[] getUnit_p() {
524
                return unit_p;
525
        }
526
        
527
        public String[] getParam_name() {
528
                return param_name;
529
        }
530
        
531
        public String[] getParam_value() {
532
                return param_value;
533
        }
534
        
535
        public String[] getAuthority(){
536
                return authority;
537
        }
538
        
539
        /*
540
         * Parser a medio hacer, orientado a objeto y recursivo.
541
         * by LWS.
542
         */
543
        
544
        public static class WKT {
545
                public class Param {
546
                        String key;
547
                        ArrayList values = new ArrayList();
548
                        ArrayList params = new ArrayList();
549
                        public int pos = 0;
550
                        public Param(String key) {
551
                                this.key = key;
552
                        }
553
                        public void addValue(String name) {
554
                                values.add(name);
555
                        }
556
                        public void addParam(Param p) {
557
                                params.add(p);
558
                        }
559
                }
560
                String data;
561
                public WKT(String data) {
562
                        this.data = data;
563
                        WKT.Param param = parseParam(0);
564
                }
565
                private WKT.Param parseParam(int pos) {
566
                        WKT.Param param = null;
567
                        String key, name;
568
                        
569
                        int l = data.length();
570
                        for (int i = pos; i<l;) {
571
                                int nextParam = data.indexOf(",", i);
572
                                if (nextParam == i) {
573
                                        nextParam = data.indexOf(",", ++i);
574
                                }
575
                                int cierra = data.indexOf("]", i);
576
                                int abre = data.indexOf("[", i);
577
                                if (cierra < abre) { // Esta mal
578
                                        pinta(" =>");
579
                                        param.pos = cierra;
580
                                        return param;
581
                                }
582
                                if (param == null) {
583
                                        if (abre > 0) { //hay claves
584
                                                key = data.substring(i, data.indexOf("[", i));
585
                                                pinta(key+ " <= ");
586
                                                i = abre+1;
587
                                                param = new WKT.Param(key);
588
                                        }
589
                                } else {
590
                                        if (data.substring(i).startsWith("\"")) {
591
                                                name = data.substring(i+1, data.indexOf("\"", i+1));
592
                                                i+=name.length()+2;
593
                                                pinta("|"+name+"|,");
594
                                                param.addValue(name);
595
                                        } else if (nextParam<abre) {
596
                                                name = data.substring(i, data.indexOf(",", i));
597
                                                i+=name.length();
598
                                                pinta(name+",");
599
                                                param.addValue(name);
600
                                        } else {
601
                                                Param p = parseParam(i);
602
                                                i = p.pos+1;
603
                                        }
604
                                }
605
                        }
606
                        return param;
607
                }
608
                static int cnt=0;
609
                public static void pinta(String str) {
610
                        cnt++;
611
                        if (cnt>60)
612
                                System.exit(1);
613
                        System.out.println(str);
614
                }
615
        }
616
        
617
        private void fromCode(String code) {
618
                CoordinateReferenceSystem source;
619
                setAuthority(code);
620
                try {
621
                        source = CRS.decode(code);
622
                        setWkt(source.toWKT());
623
                        
624
                        if (source instanceof DefaultProjectedCRS) {
625
                                DefaultProjectedCRS sour = (DefaultProjectedCRS) source;
626
                                setProjcs(sour.getName().toString().split(":")[1]);
627
                                String[] val = sour.getBaseCRS().getName().toString().split(":");
628
                                if (val.length<2)
629
                                        setGeogcs(sour.getBaseCRS().getName().toString().split(":")[0]);
630
                                else
631
                                        setGeogcs(sour.getBaseCRS().getName().toString().split(":")[1]);
632
                                DefaultGeodeticDatum d = (DefaultGeodeticDatum) sour.getDatum();
633
                                val = d.getName().toString().split(":");
634
                                if (val.length<2)
635
                                        setDatumName(d.getName().toString().split(":")[0]);
636
                                else
637
                                        setDatumName(d.getName().toString().split(":")[1]);
638
                                setSpheroid((DefaultEllipsoid)d.getEllipsoid());                                
639
                                setPrimen(d.getPrimeMeridian());
640
                                val = sour.getConversionFromBase().getMethod().getName().toString().split(":");
641
                                if (val.length<2)
642
                                        setProjection(sour.getConversionFromBase().getMethod().getName().toString().split(":")[0]);
643
                                else
644
                                        setProjection(sour.getConversionFromBase().getMethod().getName().toString().split(":")[1]);
645
                                String str;
646
                                param_name = new String[sour.getConversionFromBase().getParameterValues().values().size()];
647
                                param_value= new String[sour.getConversionFromBase().getParameterValues().values().size()];
648
                                for (int i=0; i< sour.getConversionFromBase().getParameterValues().values().size();i++) {
649
                                        str = sour.getConversionFromBase().getParameterValues().values().get(i).toString();
650
                                        Unit u = sour.getConversionFromBase().getParameterValues().parameter(str.split("=")[0]).getUnit();
651
                                        double value = sour.getConversionFromBase().getParameterValues().parameter(str.split("=")[0]).doubleValue();
652
                                        value = convert(value, u.toString());
653
                                        param_name[i] = str.split("=")[0];
654
                                        param_value [i] = String.valueOf(value);
655
                                }
656
                                
657
                        }
658
                        
659
                        if (source instanceof DefaultGeographicCRS) {
660
                                DefaultGeographicCRS sour = (DefaultGeographicCRS) source;
661
                                String[] val = sour.getName().toString().split(":");
662
                                if (val.length<2)
663
                                        setGeogcs(sour.getName().toString().split(":")[0]);
664
                                else
665
                                        setGeogcs(sour.getName().toString().split(":")[1]);
666
                                
667
                                DefaultGeodeticDatum d = (DefaultGeodeticDatum) sour.getDatum();
668
                                val = d.getName().toString().split(":");
669
                                if (val.length<2)
670
                                        setDatumName(d.getName().toString().split(":")[0]);
671
                                else
672
                                        setDatumName(d.getName().toString().split(":")[1]);
673
                                setSpheroid((DefaultEllipsoid)d.getEllipsoid());                                
674
                                setPrimen(d.getPrimeMeridian());
675
                                
676
                        }
677
                } catch (NoSuchAuthorityCodeException e) { //Pertenece a CRS
678
                        //System.out.println("Hola: 1");
679
                        // TODO Auto-generated catch block
680
                        e.printStackTrace();
681
                } catch (FactoryException e) { //Pertenece a CRS
682
                        //System.out.println("Hola: 2 ");
683
                        // TODO Auto-generated catch block
684
                        e.printStackTrace();
685
                } 
686
                
687
        }
688
        
689
        private void parseWKT(String data) {
690
                WKT wkt = new WKT(data);
691
        }
692
        
693
        public void setProjcs (String proj) {
694
                this.projcs = proj;
695
        }
696
        
697
        public void setProjection (String projection) {
698
                this.projection = projection;
699
        }
700
        public void setGeogcs (String geo) {
701
                this.geogcs = geo;
702
        }
703
        
704
        public void setDatumName (String dat) {
705
                this.datum = dat;
706
        }
707
        
708
        public void setSpheroid (DefaultEllipsoid ellips) {
709
                Unit u = ellips.getAxisUnit();
710
                double semi_major = convert( ellips.getSemiMajorAxis(), u.toString());
711
                double inv_f = convert( ellips.getInverseFlattening(), u.toString());
712
                String[] val =        ellips.getName().toString().split(":");
713
                if (val.length<2)
714
                        this.spheroid[0] = ellips.getName().toString().split(":")[0];
715
                else
716
                        this.spheroid[0] = ellips.getName().toString().split(":")[1];
717
                this.spheroid[1] = String.valueOf(semi_major);
718
                this.spheroid[2] = String.valueOf(inv_f);
719
        }
720
        
721
        public void setPrimen (PrimeMeridian prim) {
722
                DefaultPrimeMeridian pm = (DefaultPrimeMeridian)(prim);
723
                Unit u = pm.getAngularUnit();
724
                double value = convert( pm.getGreenwichLongitude(), u.toString());
725
                String[] val = pm.getName().toString().split(":");
726
                if (val.length<2)
727
                        this.primem[0] = pm.getName().toString().split(":")[0];
728
                else
729
                        this.primem[0] = pm.getName().toString().split(":")[1];
730
                this.primem[1] = String.valueOf(value);
731
        }
732
                
733
        public void setAuthority (String aut) {
734
                this.authority = aut.split(":");                
735
        }
736
        
737
        public void setWkt(String wkt){
738
                this.wkt = wkt;
739
        }
740
        
741
        public String getWkt() {
742
                return wkt;
743
        }
744
        
745
        public double convert(double value, String measure) throws ConversionException {
746
                if (measure.equals("D.MS")) {                
747
                        value *= this.divider;
748
                int deg,min;
749
                deg = (int) (value/10000); value -= 10000*deg;
750
                min = (int) (value/  100); value -=   100*min;
751
                if (min<=-60 || min>=60) {  // Accepts NaN
752
                    if (Math.abs(Math.abs(min) - 100) <= EPS) {
753
                        if (min >= 0) deg++; else deg--;
754
                        min = 0;
755
                    } else {
756
                        throw new ConversionException("Invalid minutes: "+min);
757
                    }
758
                }
759
                if (value<=-60 || value>=60) { // Accepts NaN
760
                    if (Math.abs(Math.abs(value) - 100) <= EPS) {
761
                        if (value >= 0) min++; else min--;
762
                        value = 0;
763
                    } else {
764
                        throw new ConversionException("Invalid secondes: "+value);
765
                    }
766
                }
767
                value = ((value/60) + min)/60 + deg;
768
                return value;
769
                }
770
                if (measure.equals("grad") || measure.equals("grade")) 
771
                        return ((value * 180.0) / 200.0);                        
772
                if (measure.equals(""+(char)176)) 
773
                        return value;                
774
                if (measure.equals("DMS") ) 
775
                        return value;                
776
                if (measure.equals("m")) 
777
                        return value;
778
                //TODO revisar este if, y ver si seria correcto...
779
                if (measure.startsWith("[m*")) {
780
                        return value*Double.parseDouble(measure.substring(3,measure.length()-1));
781
                }
782
                if (measure.equals("")) 
783
                        return value;
784
                if (measure.equalsIgnoreCase("ft")||measure.equalsIgnoreCase("foot")||measure.equalsIgnoreCase("feet")) 
785
                        return (value*0.3048/1.0);
786
                
787
                throw new ConversionException("Conversion no contemplada: "+measure);
788
    }
789
}