Statistics
| Revision:

svn-gvsig-desktop / branches / F2 / libraries / libJCRS / src / org / gvsig / crs / CrsWkt.java @ 11389

History | View | Annotate | Download (22.1 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.idr.geotools.metadata.iso.citation.Citations;
49
import org.idr.geotools.referencing.CRS;
50
import org.idr.geotools.referencing.crs.AbstractSingleCRS;
51
import org.idr.geotools.referencing.crs.DefaultGeographicCRS;
52
import org.idr.geotools.referencing.crs.DefaultProjectedCRS;
53
import org.idr.geotools.referencing.datum.DefaultEllipsoid;
54
import org.idr.geotools.referencing.datum.DefaultGeodeticDatum;
55
import org.idr.geotools.referencing.datum.DefaultPrimeMeridian;
56
import org.opengis.referencing.FactoryException;
57
import org.opengis.referencing.NoSuchAuthorityCodeException;
58
import org.opengis.referencing.NoSuchIdentifierException;
59
import org.opengis.referencing.crs.CoordinateReferenceSystem;
60
import org.opengis.referencing.datum.PrimeMeridian;
61

    
62
/**
63
 * Clase que parsea una cadena wkt y consigue todos sus par?metros
64
 * de manera independiente para poder ser utilizados
65
 * en distintas funciones
66
 * 
67
 * @author Jos? Luis G?mez Mart?nez
68
 *
69
 */
70

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