Statistics
| Revision:

root / org.gvsig.projection.jcrs / trunk / org.gvsig.projection.jcrs / org.gvsig.projection.jcrs.lib / src / main / java / org / gvsig / crs / CrsWkt.java @ 579

History | View | Annotate | Download (25.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
import java.util.Vector;
45

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

    
49
import org.apache.commons.lang3.StringUtils;
50
import org.gdal.osr.SpatialReference;
51
import org.geotools.referencing.CRS;
52
import org.geotools.referencing.crs.AbstractSingleCRS;
53
import org.geotools.referencing.crs.DefaultGeographicCRS;
54
import org.geotools.referencing.crs.DefaultProjectedCRS;
55
import org.geotools.referencing.datum.DefaultEllipsoid;
56
import org.geotools.referencing.datum.DefaultGeodeticDatum;
57
import org.geotools.referencing.datum.DefaultPrimeMeridian;
58
import org.opengis.referencing.FactoryException;
59
import org.opengis.referencing.NoSuchAuthorityCodeException;
60
import org.opengis.referencing.crs.CoordinateReferenceSystem;
61
import org.opengis.referencing.datum.PrimeMeridian;
62
import org.slf4j.Logger;
63
import org.slf4j.LoggerFactory;
64

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

    
74
public class CrsWkt {
75
        private static final Logger logger = LoggerFactory.getLogger(CrsWkt.class);
76

    
77
        private String wkt;
78
        private String projcs = "";
79
        private String geogcs = "";
80
        private String datum = "";
81
        private String[] spheroid = {"" ,"",""};
82
        private String[] primem = {"",""};
83
        private String[] unit = {"",""};
84
        private String[] unit_p = {"",""}; //unidades de la projeccion (final de la cadena wkt)
85
        private String projection = "";
86
        private String[] param_name;
87
        private String[] param_value;
88
        private int contador = 0;
89
        private String[] authority = {"",""};
90

    
91
        int divider=10000;
92

    
93
        private static final String USERNAME="";
94

    
95
        /**
96
     * Small tolerance factor for rounding errors.
97
     */
98
    private static final double EPS = 1E-8;
99

    
100

    
101
    /**
102
 *
103
 */
104
    public CrsWkt(SpatialReference spatialReference) {
105
        wkt = spatialReference.ExportToWkt();
106
        projcs = spatialReference.GetAttrValue("PROJCS",0);
107
        if(StringUtils.isEmpty(projcs)){
108
            projcs = "";
109
        } else {
110
            unit_p[0] = spatialReference.GetAttrValue("UNIT",0);
111
            unit_p[1] = spatialReference.GetAttrValue("UNIT",1);
112
            projection = spatialReference.GetAttrValue("PROJECTION");
113

    
114
            try {
115
                //We create username, although we are not sure why it is needed in this method
116
                String[] username=new String[1];
117
                username[0]=USERNAME;
118
                param_name=org.gdal.osr.osr.GetProjectionMethodParameterList(projection, username);
119
                param_value=new String[param_name.length];
120
                for(int i=0;i<param_name.length;i++){
121
                    param_value[i]=String.valueOf(spatialReference.GetProjParm(param_name[i]));
122
                }
123
            } catch (Exception e) {
124
                logger.warn("Error obtaining projection params");
125
            }
126
        }
127
        geogcs = spatialReference.GetAttrValue("GEOGCS",0);
128
        datum = spatialReference.GetAttrValue("DATUM",0);
129

    
130
        CRSDatum crsDatum = new CRSDatum(spatialReference.GetSemiMajor(), spatialReference.GetInvFlattening());
131

    
132
        spheroid[0] = spatialReference.GetAttrValue("SPHEROID",0);
133
        spheroid[1] = String.valueOf(spatialReference.GetSemiMajor()); //GetAttrValue("SPHEROID",1);
134
        spheroid[2] = String.valueOf(spatialReference.GetInvFlattening()); //.GetAttrValue("SPHEROID",2);
135
        primem[0] = spatialReference.GetAttrValue("PRIMEM",0);
136
        primem[1] = spatialReference.GetAttrValue("PRIMEM",1);
137
        double toRadians = spatialReference.GetAngularUnits();
138
        unit[1] = String.valueOf(toRadians);
139
        if(toRadians==1){
140
            unit[0] = org.gdal.osr.osr.SRS_UA_RADIAN;
141
        } else {
142
            unit[0] = org.gdal.osr.osr.SRS_UA_DEGREE;
143
        }
144

    
145
        authority[0] = spatialReference.GetAuthorityName(null);
146
        authority[1] = spatialReference.GetAuthorityCode(null);
147
    }
148

    
149

    
150

    
151
        public CrsWkt(String wkt_spaces) {
152
                String aux;
153
                String wkt = "";
154
                for(int i = 0; i < wkt_spaces.length(); i++) {
155
                        aux = ""+wkt_spaces.charAt(i);
156
                        if(!aux.equals(" ")) {
157
                                wkt+=aux;
158
                        }else {
159
                                wkt += "";
160
                        }
161
                }
162
                if (wkt.length()>15) {
163
                        fromWKT(wkt, false);
164
                } else {
165
                        fromCode(wkt);
166
                }
167
        }
168

    
169
        public CrsWkt(CoordinateReferenceSystem crsGT) {
170
                AbstractSingleCRS crs = (AbstractSingleCRS)crsGT;
171
                String authority = crs.getName().toString().split(":")[0];
172
                setAuthority(((AbstractSingleCRS)crsGT).getIdentifiers().iterator().next().toString());
173
                setWkt(crsGT.toWKT());
174

    
175
                if (crsGT instanceof DefaultProjectedCRS) {
176
                        DefaultProjectedCRS sour = (DefaultProjectedCRS) crsGT;
177
                        setProjcs(sour.getName().toString().split(":")[1]);
178
                        String[] val = sour.getBaseCRS().getName().toString().split(":");
179
                        if (val.length<2)
180
                                setGeogcs(sour.getBaseCRS().getName().toString().split(":")[0]);
181
                        else
182
                                setGeogcs(sour.getBaseCRS().getName().toString().split(":")[1]);
183
                        DefaultGeodeticDatum d = (DefaultGeodeticDatum) sour.getDatum();
184
                        val = d.getName().toString().split(":");
185
                        if (val.length<2)
186
                                setDatumName(d.getName().toString().split(":")[0]);
187
                        else
188
                                setDatumName(d.getName().toString().split(":")[1]);
189
                        setSpheroid((DefaultEllipsoid)d.getEllipsoid());
190
                        setPrimen(d.getPrimeMeridian());
191
                        val = sour.getConversionFromBase().getMethod().getName().toString().split(":");
192
                        if (val.length<2)
193
                                setProjection(sour.getConversionFromBase().getMethod().getName().toString().split(":")[0]);
194
                        else
195
                                setProjection(sour.getConversionFromBase().getMethod().getName().toString().split(":")[1]);
196
                        String str;
197
                        param_name = new String[sour.getConversionFromBase().getParameterValues().values().size()];
198
                        param_value= new String[sour.getConversionFromBase().getParameterValues().values().size()];
199
                        for (int i=0; i< sour.getConversionFromBase().getParameterValues().values().size();i++) {
200
                                str = sour.getConversionFromBase().getParameterValues().values().get(i).toString();
201
                                Unit u = sour.getConversionFromBase().getParameterValues().parameter(str.split("=")[0]).getUnit();
202
                                double value = sour.getConversionFromBase().getParameterValues().parameter(str.split("=")[0]).doubleValue();
203
                                value = convert(value, u.toString());
204
                                param_name[i] = str.split("=")[0];
205
                                param_value [i] = String.valueOf(value);
206
                        }
207

    
208
                }
209

    
210
                if (crsGT instanceof DefaultGeographicCRS) {
211
                        DefaultGeographicCRS sour = (DefaultGeographicCRS) crsGT;
212
                        String[] val = sour.getName().toString().split(":");
213
                        if (val.length<2)
214
                                setGeogcs(sour.getName().toString().split(":")[0]);
215
                        else
216
                                setGeogcs(sour.getName().toString().split(":")[1]);
217

    
218
                        DefaultGeodeticDatum d = (DefaultGeodeticDatum) sour.getDatum();
219
                        val = d.getName().toString().split(":");
220
                        if (val.length<2)
221
                                setDatumName(d.getName().toString().split(":")[0]);
222
                        else
223
                                setDatumName(d.getName().toString().split(":")[1]);
224
                        setSpheroid((DefaultEllipsoid)d.getEllipsoid());
225
                        setPrimen(d.getPrimeMeridian());
226

    
227
                }
228
        }
229

    
230
        /**
231
         * Acepta la cadena wkt y si es un CRS proyectado para conseguir el parser
232
         * de los dos modelos de cadena wkt que se utilizan, una cuando es base
233
         * y otra cuando es proyectado
234
         * @param wkt
235
         * @param isProj
236
         */
237
        private void fromWKT(String wkt, boolean isProj) {
238

    
239
                String res = new String();
240
                if(!wkt.startsWith("EPSG:")) {
241
                        res = "";
242
                        for(; wkt.charAt(contador) != '"'; contador++) {
243
                                res += wkt.charAt(contador);
244
                        }
245
                        if(res.equals("GEOGCS[")) {
246

    
247
                                contador++;
248
                                for(; wkt.charAt(contador) != '"'; contador++) {
249
                                        geogcs += wkt.charAt(contador);
250
                                }
251

    
252
                                res = "";
253
                                contador++;
254
                                for(; wkt.charAt(contador) != '"'; contador++) {
255
                                        res += wkt.charAt(contador);
256
                                }
257
                                if(res.equals(",DATUM[")) {
258
                                        contador++;
259
                                        for(; wkt.charAt(contador) != '"'; contador++) {
260
                                                datum += wkt.charAt(contador);
261
                                        }
262
                                }
263
                                res = "";
264
                                contador++;
265
                                for(; wkt.charAt(contador) != '"'; contador++) {
266
                                        res += wkt.charAt(contador);
267
                                }
268
                                if(res.equals(",SPHEROID[")) {
269
                                        contador++;
270
                                        for(; wkt.charAt(contador) != ']'; contador++) {
271
                                                while(wkt.charAt(contador) != '"' ) {
272
                                                        spheroid[0] += wkt.charAt(contador);
273
                                                        contador++;
274
                                                }
275
                                                contador +=2;
276
                                                while(wkt.charAt(contador) != ',') {
277
                                                        spheroid[1] += wkt.charAt(contador);
278
                                                        contador++;
279
                                                }
280
                                                contador++;
281
                                                while(wkt.charAt(contador) != ']') {
282
                                                        spheroid[2] += wkt.charAt(contador);
283
                                                        contador++;
284
                                                }
285
                                        }
286
                                }
287
                                contador++;
288
                                res = "";
289
                                for(; wkt.charAt(contador) != '"'; contador++) {
290
                                        res += wkt.charAt(contador);
291
                                }
292
                                if(res.equals(",PRIMEM[")) {
293
                                        contador++;
294
                                        for(; wkt.charAt(contador) != ','; contador++) {
295
                                                while(wkt.charAt(contador) != '"' ){
296
                                                        primem[0] += wkt.charAt(contador);
297
                                                        contador ++;
298
                                                }
299
                                                contador +=2;
300
                                                while(wkt.charAt(contador) != ']') {
301
                                                        primem[1] += wkt.charAt(contador);
302
                                                        contador ++;
303
                                                }
304
                                        }
305
                                }
306
                                contador++;
307
                                res = "";
308
                                for(; wkt.charAt(contador) != '"'; contador++) {
309
                                        res += wkt.charAt(contador);
310
                                }
311
                                if(res.equals("UNIT[")) {
312
                                        contador++;
313
                                        for(; wkt.charAt(contador) != ','; contador++) {
314
                                                while(wkt.charAt(contador) != '"' ){
315
                                                        unit[0] += wkt.charAt(contador);
316
                                                        contador ++;
317
                                                }
318
                                                contador +=2;
319
                                                while(wkt.charAt(contador) != ']') {
320
                                                        unit[1] += wkt.charAt(contador);
321
                                                        contador ++;
322
                                                }
323
                                        }
324
                                }
325
                                contador++;
326
                                res = "";
327
                                for(; wkt.charAt(contador) != '"'; contador++) {
328
                                        res += wkt.charAt(contador);
329
                                }
330
                                if(res.equals("AUTHORITY[")) {
331
                                        contador++;
332
                                        for(; wkt.charAt(contador) != ']'; contador++) {
333
                                                while(wkt.charAt(contador) != '"' ){
334
                                                        authority[0] += wkt.charAt(contador);
335
                                                        contador ++;
336
                                                }
337
                                                contador +=2;
338
                                                while(wkt.charAt(contador) != ']') {
339
                                                        authority[1] += wkt.charAt(contador);
340
                                                        contador ++;
341
                                                }
342
                                        }
343
                                }
344
                        }else if (res.equals("PROJCS[")) {
345
                                contador++;
346
                                for(; wkt.charAt(contador) != '"'; contador++) {
347
                                        projcs += wkt.charAt(contador);
348
                                }
349
                                contador++;
350
                                res = "";
351
                                for(; wkt.charAt(contador) != '"'; contador++) {
352
                                        res += wkt.charAt(contador);
353
                                }
354
                                if(res.equals(",GEOGCS[")) {
355
                                        contador++;
356
                                        for(; wkt.charAt(contador) != '"'; contador++) {
357
                                                geogcs += wkt.charAt(contador);
358
                                        }
359
                                }
360

    
361
                                res = "";
362
                                contador++;
363
                                for(; wkt.charAt(contador) != '"'; contador++) {
364
                                        res += wkt.charAt(contador);
365
                                }
366
                                if(res.equals(",DATUM[")) {
367
                                        contador++;
368
                                        for(; wkt.charAt(contador) != '"'; contador++) {
369
                                                datum += wkt.charAt(contador);
370
                                        }
371
                                }
372
                                res = "";
373
                                contador++;
374
                                for(; wkt.charAt(contador) != '"'; contador++) {
375
                                        res += wkt.charAt(contador);
376
                                }
377
                                if(res.equals(",SPHEROID[")) {
378
                                        contador++;
379
                                        for(; wkt.charAt(contador) != ']'; contador++) {
380
                                                while(wkt.charAt(contador) != '"' ) {
381
                                                        spheroid[0] += wkt.charAt(contador);
382
                                                        contador++;
383
                                                }
384
                                                contador +=2;
385
                                                while(wkt.charAt(contador) != ',') {
386
                                                        spheroid[1] += wkt.charAt(contador);
387
                                                        contador++;
388
                                                }
389
                                                contador++;
390
                                                while(wkt.charAt(contador) != ']') {
391
                                                        spheroid[2] += wkt.charAt(contador);
392
                                                        contador++;
393
                                                }
394
                                        }
395
                                }
396
                                contador++;
397
                                res = "";
398
                                for(; wkt.charAt(contador) != '"'; contador++) {
399
                                        res += wkt.charAt(contador);
400
                                }
401
                                if(res.equals(",PRIMEM[")) {
402
                                        contador++;
403
                                        for(; wkt.charAt(contador) != ','; contador++) {
404
                                                while(wkt.charAt(contador) != '"' ){
405
                                                        primem[0] += wkt.charAt(contador);
406
                                                        contador ++;
407
                                                }
408
                                                contador +=2;
409
                                                while(wkt.charAt(contador) != ']') {
410
                                                        primem[1] += wkt.charAt(contador);
411
                                                        contador ++;
412
                                                }
413
                                        }
414
                                }
415
                                contador++;
416
                                res = "";
417
                                for(; wkt.charAt(contador) != '"'; contador++) {
418
                                        res += wkt.charAt(contador);
419
                                }
420
                                if(res.equals("UNIT[")) {
421
                                        contador++;
422
                                        for(; wkt.charAt(contador) != ']'; contador++) {
423
                                                while(wkt.charAt(contador) != '"' ){
424
                                                        unit[0] += wkt.charAt(contador);
425
                                                        contador ++;
426
                                                }
427
                                                contador +=2;
428
                                                while(wkt.charAt(contador) != ']') {
429
                                                        unit[1] += wkt.charAt(contador);
430
                                                        contador ++;
431
                                                }
432
                                        }
433
                                }
434
                                contador++;
435
                                res = "";
436
                                for(; wkt.charAt(contador) != '"'; contador++) {
437
                                        res += wkt.charAt(contador);
438
                                }
439
                                if(res.equals(",PROJECTION[")) {
440
                                        contador++;
441
                                        for(; wkt.charAt(contador) != '"'; contador++) {
442
                                                projection += wkt.charAt(contador);
443
                                        }
444
                                }
445
                                contador = contador+2;
446
                                res = "";
447
                                for(; wkt.charAt(contador) != '"'; contador++) {
448
                                        res += wkt.charAt(contador);
449
                                }
450
                                //Hallamos el numero de parametros que tiene la cadena wkt
451
                                int i = 0;
452

    
453
                                int copiacontador = contador;
454
                                if(res.equals(",PARAMETER[")) {
455
                                        do{
456
                                                for(; wkt.charAt(copiacontador) != ']'; copiacontador++) {
457
                                                        while(wkt.charAt(copiacontador) != '"' )
458
                                                                copiacontador++;
459
                                                        copiacontador += 2;
460
                                                        while(wkt.charAt(copiacontador) != ']' )
461
                                                                copiacontador++;
462
                                                        copiacontador--;
463
                                                }
464
                                                i++;
465
                                                copiacontador++;
466
                                                res = "";
467
                                                for(; wkt.charAt(copiacontador) != '"'; copiacontador++) {
468
                                                        res += wkt.charAt(copiacontador);
469
                                                }
470
                                        } while (res.equals(",PARAMETER["));
471
                                        res = ",PARAMETER[";
472
                                }
473
                                // Inicializamos los parametros
474
                                param_name = new String[i];
475
                                param_value = new String[i];
476
                                for(int j = 0 ;j < i; j++ ){
477
                                        param_name[j] = "";
478
                                        param_value[j] = "";
479
                                }
480
                                i = 0;
481
                                if(res.equals(",PARAMETER[")) {
482
                                        do{
483
                                                contador++;
484
                                                for(; wkt.charAt(contador) != ']'; contador++) {
485
                                                        while(wkt.charAt(contador) != '"' ){
486
                                                                param_name[i] += wkt.charAt(contador);
487
                                                                contador++;
488
                                                        }
489
                                                        contador += 2;
490
                                                        while(wkt.charAt(contador) != ']' ){
491
                                                                param_value[i] += wkt.charAt(contador);
492
                                                                contador++;
493
                                                        }
494
                                                        contador--;
495
                                                }
496
                                                i++;
497
                                                contador++;
498
                                                res = "";
499
                                                for(; wkt.charAt(contador) != '"'; contador++) {
500
                                                        res += wkt.charAt(contador);
501
                                                }
502
                                        } while (res.equals(",PARAMETER["));
503
                                }
504

    
505
                                if (res.equals(",UNIT[")){
506
                                        contador++;
507
                                        for(; wkt.charAt(contador) != ','; contador++) {
508
                                                while(wkt.charAt(contador) != '"' ){
509
                                                        unit_p[0] += wkt.charAt(contador);
510
                                                        contador ++;
511
                                                }
512
                                                contador +=2;
513
                                                while(wkt.charAt(contador) != ']') {
514
                                                        unit_p[1] += wkt.charAt(contador);
515
                                                        contador ++;
516
                                                }
517
                                        }
518
                                }
519
                                contador++;
520
                                res = "";
521
                                for(; wkt.charAt(contador) != '"'; contador++) {
522
                                        res += wkt.charAt(contador);
523
                                }
524
                                if(res.equals("AUTHORITY[")) {
525
                                        contador++;
526
                                        for(; wkt.charAt(contador) != ']'; contador++) {
527
                                                while(wkt.charAt(contador) != '"' ){
528
                                                        authority[0] += wkt.charAt(contador);
529
                                                        contador ++;
530
                                                }
531
                                                contador +=2;
532
                                                while(wkt.charAt(contador) != ']') {
533
                                                        authority[1] += wkt.charAt(contador);
534
                                                        contador ++;
535
                                                }
536
                                        }
537
                                }
538
                        }
539
                        else if (res.equals("GEOCCS[")){
540
                                /*
541
                                 * parte necesaria para capturar la cadena geocentrica...
542
                                 */
543

    
544
                        }
545
                }else
546
                        geogcs = wkt;
547
        }
548

    
549
        public String getProjection() {
550
                return projection;
551
        }
552

    
553
        public String getProjcs() {
554
                return projcs;
555
        }
556

    
557
        public String getGeogcs() {
558
                return geogcs;
559
        }
560

    
561
        public String getDatumName() {
562
                return datum;
563
        }
564

    
565
        public String[] getSpheroid() {
566
                return spheroid;
567
        }
568

    
569
        public String[] getPrimen() {
570
                return primem;
571
        }
572

    
573
        public String getName() {
574
                if(projcs == "")
575
                        return geogcs;
576
                return projcs;
577
        }
578

    
579
        public String[] getUnit() {
580
                return unit;
581
        }
582

    
583
        public String[] getUnit_p() {
584
                return unit_p;
585
        }
586

    
587
        public String[] getParam_name() {
588
                return param_name;
589
        }
590

    
591
        public String[] getParam_value() {
592
                return param_value;
593
        }
594

    
595
        public String[] getAuthority(){
596
                return authority;
597
        }
598

    
599
        /*
600
         * Parser a medio hacer, orientado a objeto y recursivo.
601
         * by LWS.
602
         */
603

    
604
        public static class WKT {
605
                public class Param {
606
                        String key;
607
                        ArrayList values = new ArrayList();
608
                        ArrayList params = new ArrayList();
609
                        public int pos = 0;
610
                        public Param(String key) {
611
                                this.key = key;
612
                        }
613
                        public void addValue(String name) {
614
                                values.add(name);
615
                        }
616
                        public void addParam(Param p) {
617
                                params.add(p);
618
                        }
619
                }
620
                String data;
621
                public WKT(String data) {
622
                        this.data = data;
623
                        WKT.Param param = parseParam(0);
624
                }
625
                private WKT.Param parseParam(int pos) {
626
                        WKT.Param param = null;
627
                        String key, name;
628

    
629
                        int l = data.length();
630
                        for (int i = pos; i<l;) {
631
                                int nextParam = data.indexOf(",", i);
632
                                if (nextParam == i) {
633
                                        nextParam = data.indexOf(",", ++i);
634
                                }
635
                                int cierra = data.indexOf("]", i);
636
                                int abre = data.indexOf("[", i);
637
                                if (cierra < abre) { // Esta mal
638
                                        pinta(" =>");
639
                                        param.pos = cierra;
640
                                        return param;
641
                                }
642
                                if (param == null) {
643
                                        if (abre > 0) { //hay claves
644
                                                key = data.substring(i, data.indexOf("[", i));
645
                                                pinta(key+ " <= ");
646
                                                i = abre+1;
647
                                                param = new WKT.Param(key);
648
                                        }
649
                                } else {
650
                                        if (data.substring(i).startsWith("\"")) {
651
                                                name = data.substring(i+1, data.indexOf("\"", i+1));
652
                                                i+=name.length()+2;
653
                                                pinta("|"+name+"|,");
654
                                                param.addValue(name);
655
                                        } else if (nextParam<abre) {
656
                                                name = data.substring(i, data.indexOf(",", i));
657
                                                i+=name.length();
658
                                                pinta(name+",");
659
                                                param.addValue(name);
660
                                        } else {
661
                                                Param p = parseParam(i);
662
                                                i = p.pos+1;
663
                                        }
664
                                }
665
                        }
666
                        return param;
667
                }
668
                static int cnt=0;
669
                public static void pinta(String str) {
670
                        cnt++;
671
                        if (cnt>60)
672
                                System.exit(1);
673
                        System.out.println(str);
674
                }
675
        }
676

    
677
        private void fromCode(String code) {
678
                CoordinateReferenceSystem source;
679
                setAuthority(code);
680
                try {
681
                        source = CRS.decode(code);
682
                        setWkt(source.toWKT());
683

    
684
                        if (source instanceof DefaultProjectedCRS) {
685
                                DefaultProjectedCRS sour = (DefaultProjectedCRS) source;
686
                                setProjcs(sour.getName().toString().split(":")[1]);
687
                                String[] val = sour.getBaseCRS().getName().toString().split(":");
688
                                if (val.length<2)
689
                                        setGeogcs(sour.getBaseCRS().getName().toString().split(":")[0]);
690
                                else
691
                                        setGeogcs(sour.getBaseCRS().getName().toString().split(":")[1]);
692
                                DefaultGeodeticDatum d = (DefaultGeodeticDatum) sour.getDatum();
693
                                val = d.getName().toString().split(":");
694
                                if (val.length<2)
695
                                        setDatumName(d.getName().toString().split(":")[0]);
696
                                else
697
                                        setDatumName(d.getName().toString().split(":")[1]);
698
                                setSpheroid((DefaultEllipsoid)d.getEllipsoid());
699
                                setPrimen(d.getPrimeMeridian());
700
                                val = sour.getConversionFromBase().getMethod().getName().toString().split(":");
701
                                if (val.length<2)
702
                                        setProjection(sour.getConversionFromBase().getMethod().getName().toString().split(":")[0]);
703
                                else
704
                                        setProjection(sour.getConversionFromBase().getMethod().getName().toString().split(":")[1]);
705
                                String str;
706
                                param_name = new String[sour.getConversionFromBase().getParameterValues().values().size()];
707
                                param_value= new String[sour.getConversionFromBase().getParameterValues().values().size()];
708
                                for (int i=0; i< sour.getConversionFromBase().getParameterValues().values().size();i++) {
709
                                        str = sour.getConversionFromBase().getParameterValues().values().get(i).toString();
710
                                        Unit u = sour.getConversionFromBase().getParameterValues().parameter(str.split("=")[0]).getUnit();
711
                                        double value = sour.getConversionFromBase().getParameterValues().parameter(str.split("=")[0]).doubleValue();
712
                                        value = convert(value, u.toString());
713
                                        param_name[i] = str.split("=")[0];
714
                                        param_value [i] = String.valueOf(value);
715
                                }
716

    
717
                        }
718

    
719
                        if (source instanceof DefaultGeographicCRS) {
720
                                DefaultGeographicCRS sour = (DefaultGeographicCRS) source;
721
                                String[] val = sour.getName().toString().split(":");
722
                                if (val.length<2)
723
                                        setGeogcs(sour.getName().toString().split(":")[0]);
724
                                else
725
                                        setGeogcs(sour.getName().toString().split(":")[1]);
726

    
727
                                DefaultGeodeticDatum d = (DefaultGeodeticDatum) sour.getDatum();
728
                                val = d.getName().toString().split(":");
729
                                if (val.length<2)
730
                                        setDatumName(d.getName().toString().split(":")[0]);
731
                                else
732
                                        setDatumName(d.getName().toString().split(":")[1]);
733
                                setSpheroid((DefaultEllipsoid)d.getEllipsoid());
734
                                setPrimen(d.getPrimeMeridian());
735

    
736
                        }
737
                } catch (NoSuchAuthorityCodeException e) { //Pertenece a CRS
738
                        logger.error("Can't create CRS from code '"+code+"'.",e);
739
                } catch (FactoryException e) { //Pertenece a CRS
740
                        logger.error("Can't create CRS from code '"+code+"'.",e);
741
                }
742

    
743
        }
744

    
745
        private void parseWKT(String data) {
746
                WKT wkt = new WKT(data);
747
        }
748

    
749
        public void setProjcs (String proj) {
750
                this.projcs = proj;
751
        }
752

    
753
        public void setProjection (String projection) {
754
                this.projection = projection;
755
        }
756
        public void setGeogcs (String geo) {
757
                this.geogcs = geo;
758
        }
759

    
760
        public void setDatumName (String dat) {
761
                this.datum = dat;
762
        }
763

    
764
        public void setSpheroid (DefaultEllipsoid ellips) {
765
                Unit u = ellips.getAxisUnit();
766
                double semi_major = convert( ellips.getSemiMajorAxis(), u.toString());
767
                double inv_f = convert( ellips.getInverseFlattening(), u.toString());
768
                String[] val =        ellips.getName().toString().split(":");
769
                if (val.length<2)
770
                        this.spheroid[0] = ellips.getName().toString().split(":")[0];
771
                else
772
                        this.spheroid[0] = ellips.getName().toString().split(":")[1];
773
                this.spheroid[1] = String.valueOf(semi_major);
774
                this.spheroid[2] = String.valueOf(inv_f);
775
        }
776

    
777
        public void setPrimen (PrimeMeridian prim) {
778
                DefaultPrimeMeridian pm = (DefaultPrimeMeridian)(prim);
779
                Unit u = pm.getAngularUnit();
780
                double value = convert( pm.getGreenwichLongitude(), u.toString());
781
                String[] val = pm.getName().toString().split(":");
782
                if (val.length<2)
783
                        this.primem[0] = pm.getName().toString().split(":")[0];
784
                else
785
                        this.primem[0] = pm.getName().toString().split(":")[1];
786
                this.primem[1] = String.valueOf(value);
787
        }
788

    
789
        public void setAuthority (String aut) {
790
                this.authority = aut.split(":");
791
        }
792

    
793
        public void setWkt(String wkt){
794
                this.wkt = wkt;
795
        }
796

    
797
        public String getWkt() {
798
                return wkt;
799
        }
800

    
801
        public double convert(double value, String measure) throws ConversionException {
802
                if (measure.equals("D.MS")) {
803
                        value *= this.divider;
804
                int deg,min;
805
                deg = (int) (value/10000); value -= 10000*deg;
806
                min = (int) (value/  100); value -=   100*min;
807
                if (min<=-60 || min>=60) {  // Accepts NaN
808
                    if (Math.abs(Math.abs(min) - 100) <= EPS) {
809
                        if (min >= 0) deg++; else deg--;
810
                        min = 0;
811
                    } else {
812
                        throw new ConversionException("Invalid minutes: "+min);
813
                    }
814
                }
815
                if (value<=-60 || value>=60) { // Accepts NaN
816
                    if (Math.abs(Math.abs(value) - 100) <= EPS) {
817
                        if (value >= 0) min++; else min--;
818
                        value = 0;
819
                    } else {
820
                        throw new ConversionException("Invalid secondes: "+value);
821
                    }
822
                }
823
                value = ((value/60) + min)/60 + deg;
824
                return value;
825
                }
826
                if (measure.equals("grad") || measure.equals("grade"))
827
                        return ((value * 180.0) / 200.0);
828
                if (measure.equals(""+(char)176))
829
                        return value;
830
                if (measure.equals("DMS") )
831
                        return value;
832
                if (measure.equals("m"))
833
                        return value;
834
                //TODO revisar este if, y ver si seria correcto...
835
                if (measure.startsWith("[m*")) {
836
                        return value*Double.parseDouble(measure.substring(3,measure.length()-1));
837
                }
838
                if (measure.equals(""))
839
                        return value;
840
                if (measure.equalsIgnoreCase("ft")||measure.equalsIgnoreCase("foot")||measure.equalsIgnoreCase("feet"))
841
                        return (value*0.3048/1.0);
842

    
843
                throw new ConversionException("Conversion no contemplada: "+measure);
844
    }
845
}