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 @ 821

History | View | Annotate | Download (26.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
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.cresques.cts.ICRSFactory;
51
import org.gdal.osr.SpatialReference;
52
import org.geotools.referencing.CRS;
53
import org.geotools.referencing.crs.AbstractSingleCRS;
54
import org.geotools.referencing.crs.DefaultGeographicCRS;
55
import org.geotools.referencing.crs.DefaultProjectedCRS;
56
import org.geotools.referencing.datum.DefaultEllipsoid;
57
import org.geotools.referencing.datum.DefaultGeodeticDatum;
58
import org.geotools.referencing.datum.DefaultPrimeMeridian;
59
import org.gvsig.fmap.crs.CRSFactory;
60
import org.opengis.referencing.FactoryException;
61
import org.opengis.referencing.NoSuchAuthorityCodeException;
62
import org.opengis.referencing.crs.CoordinateReferenceSystem;
63
import org.opengis.referencing.datum.PrimeMeridian;
64
import org.slf4j.Logger;
65
import org.slf4j.LoggerFactory;
66

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

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

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

    
93
        int divider=10000;
94

    
95
        private static final String USERNAME="";
96

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

    
102

    
103
    /**
104
 *
105
 */
106
    public CrsWkt(SpatialReference spatialReference) {
107
        fromSpatialReference(spatialReference);
108
    }
109
    
110
    private void fromSpatialReference(SpatialReference spatialReference) {
111
        wkt = spatialReference.ExportToWkt();
112
        projcs = spatialReference.GetAttrValue("PROJCS",0);
113
        if(StringUtils.isEmpty(projcs)){
114
            projcs = "";
115
        } else {
116
            unit_p[0] = spatialReference.GetAttrValue("UNIT",0);
117
            unit_p[1] = spatialReference.GetAttrValue("UNIT",1);
118
            projection = spatialReference.GetAttrValue("PROJECTION");
119

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

    
136
        CRSDatum crsDatum = new CRSDatum(spatialReference.GetSemiMajor(), spatialReference.GetInvFlattening());
137

    
138
        spheroid[0] = spatialReference.GetAttrValue("SPHEROID",0);
139
        spheroid[1] = String.valueOf(spatialReference.GetSemiMajor()); //GetAttrValue("SPHEROID",1);
140
        spheroid[2] = String.valueOf(spatialReference.GetInvFlattening()); //.GetAttrValue("SPHEROID",2);
141
        primem[0] = spatialReference.GetAttrValue("PRIMEM",0);
142
        primem[1] = spatialReference.GetAttrValue("PRIMEM",1);
143
        double toRadians = spatialReference.GetAngularUnits();
144
        unit[1] = String.valueOf(toRadians);
145
        if(toRadians==1){
146
            unit[0] = org.gdal.osr.osr.SRS_UA_RADIAN;
147
        } else {
148
            unit[0] = org.gdal.osr.osr.SRS_UA_DEGREE;
149
        }
150

    
151
        authority[0] = spatialReference.GetAuthorityName(null);
152
        authority[1] = spatialReference.GetAuthorityCode(null);
153
    }
154

    
155

    
156

    
157
        public CrsWkt(String wkt_spaces) {
158
                String aux;
159
                String wkt = "";
160
                for(int i = 0; i < wkt_spaces.length(); i++) {
161
                        aux = ""+wkt_spaces.charAt(i);
162
                        if(!aux.equals(" ")) {
163
                                wkt+=aux;
164
                        }else {
165
                                wkt += "";
166
                        }
167
                }
168
                if (wkt.length()>15) {
169
                        fromWKT(wkt, false);
170
                } else {
171
                        fromCode(wkt);
172
                }
173
        }
174

    
175
        public CrsWkt(CoordinateReferenceSystem crsGT) {
176
                AbstractSingleCRS crs = (AbstractSingleCRS)crsGT;
177
                String authority = crs.getName().toString().split(":")[0];
178
                setAuthority(((AbstractSingleCRS)crsGT).getIdentifiers().iterator().next().toString());
179
                setWkt(crsGT.toWKT());
180

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

    
214
                }
215

    
216
                if (crsGT instanceof DefaultGeographicCRS) {
217
                        DefaultGeographicCRS sour = (DefaultGeographicCRS) crsGT;
218
                        String[] val = sour.getName().toString().split(":");
219
                        if (val.length<2)
220
                                setGeogcs(sour.getName().toString().split(":")[0]);
221
                        else
222
                                setGeogcs(sour.getName().toString().split(":")[1]);
223

    
224
                        DefaultGeodeticDatum d = (DefaultGeodeticDatum) sour.getDatum();
225
                        val = d.getName().toString().split(":");
226
                        if (val.length<2)
227
                                setDatumName(d.getName().toString().split(":")[0]);
228
                        else
229
                                setDatumName(d.getName().toString().split(":")[1]);
230
                        setSpheroid((DefaultEllipsoid)d.getEllipsoid());
231
                        setPrimen(d.getPrimeMeridian());
232

    
233
                }
234
        }
235

    
236
        /**
237
         * Acepta la cadena wkt y si es un CRS proyectado para conseguir el parser
238
         * de los dos modelos de cadena wkt que se utilizan, una cuando es base
239
         * y otra cuando es proyectado
240
         * @param wkt
241
         * @param isProj
242
         */
243
        private void fromWKT(String wkt, boolean isProj) {
244
            SpatialReference sr = CrsFactory.getSpatialReferenceFromWKT(wkt);
245
            fromSpatialReference(sr);
246
//                String res = new String();
247
//                if(!wkt.startsWith("EPSG:")) {
248
//                        res = "";
249
//                        for(; wkt.charAt(contador) != '"'; contador++) {
250
//                                res += wkt.charAt(contador);
251
//                        }
252
//                        if(res.equals("GEOGCS[")) {
253
//
254
//                                contador++;
255
//                                for(; wkt.charAt(contador) != '"'; contador++) {
256
//                                        geogcs += wkt.charAt(contador);
257
//                                }
258
//
259
//                                res = "";
260
//                                contador++;
261
//                                for(; wkt.charAt(contador) != '"'; contador++) {
262
//                                        res += wkt.charAt(contador);
263
//                                }
264
//                                if(res.equals(",DATUM[")) {
265
//                                        contador++;
266
//                                        for(; wkt.charAt(contador) != '"'; contador++) {
267
//                                                datum += wkt.charAt(contador);
268
//                                        }
269
//                                }
270
//                                res = "";
271
//                                contador++;
272
//                                for(; wkt.charAt(contador) != '"'; contador++) {
273
//                                        res += wkt.charAt(contador);
274
//                                }
275
//                                if(res.equals(",SPHEROID[")) {
276
//                                        contador++;
277
//                                        for(; wkt.charAt(contador) != ']'; contador++) {
278
//                                                while(wkt.charAt(contador) != '"' ) {
279
//                                                        spheroid[0] += wkt.charAt(contador);
280
//                                                        contador++;
281
//                                                }
282
//                                                contador +=2;
283
//                                                while(wkt.charAt(contador) != ',') {
284
//                                                        spheroid[1] += wkt.charAt(contador);
285
//                                                        contador++;
286
//                                                }
287
//                                                contador++;
288
//                                                while(wkt.charAt(contador) != ']') {
289
//                                                        spheroid[2] += wkt.charAt(contador);
290
//                                                        contador++;
291
//                                                }
292
//                                        }
293
//                                }
294
//                                contador++;
295
//                                res = "";
296
//                                for(; wkt.charAt(contador) != '"'; contador++) {
297
//                                        res += wkt.charAt(contador);
298
//                                }
299
//                                if(res.equals(",PRIMEM[")) {
300
//                                        contador++;
301
//                                        for(; wkt.charAt(contador) != ','; contador++) {
302
//                                                while(wkt.charAt(contador) != '"' ){
303
//                                                        primem[0] += wkt.charAt(contador);
304
//                                                        contador ++;
305
//                                                }
306
//                                                contador +=2;
307
//                                                while(wkt.charAt(contador) != ']') {
308
//                                                        primem[1] += wkt.charAt(contador);
309
//                                                        contador ++;
310
//                                                }
311
//                                        }
312
//                                }
313
//                                contador++;
314
//                                res = "";
315
//                                for(; wkt.charAt(contador) != '"'; contador++) {
316
//                                        res += wkt.charAt(contador);
317
//                                }
318
//                                if(res.equals("UNIT[")) {
319
//                                        contador++;
320
//                                        for(; wkt.charAt(contador) != ','; contador++) {
321
//                                                while(wkt.charAt(contador) != '"' ){
322
//                                                        unit[0] += wkt.charAt(contador);
323
//                                                        contador ++;
324
//                                                }
325
//                                                contador +=2;
326
//                                                while(wkt.charAt(contador) != ']') {
327
//                                                        unit[1] += wkt.charAt(contador);
328
//                                                        contador ++;
329
//                                                }
330
//                                        }
331
//                                }
332
//                                contador++;
333
//                                res = "";
334
//                                for(; wkt.charAt(contador) != '"'; contador++) {
335
//                                        res += wkt.charAt(contador);
336
//                                }
337
//                                if(res.equals("AUTHORITY[")) {
338
//                                        contador++;
339
//                                        for(; wkt.charAt(contador) != ']'; contador++) {
340
//                                                while(wkt.charAt(contador) != '"' ){
341
//                                                        authority[0] += wkt.charAt(contador);
342
//                                                        contador ++;
343
//                                                }
344
//                                                contador +=2;
345
//                                                while(wkt.charAt(contador) != ']') {
346
//                                                        authority[1] += wkt.charAt(contador);
347
//                                                        contador ++;
348
//                                                }
349
//                                        }
350
//                                }
351
//                        }else if (res.equals("PROJCS[")) {
352
//                                contador++;
353
//                                for(; wkt.charAt(contador) != '"'; contador++) {
354
//                                        projcs += wkt.charAt(contador);
355
//                                }
356
//                                contador++;
357
//                                res = "";
358
//                                for(; wkt.charAt(contador) != '"'; contador++) {
359
//                                        res += wkt.charAt(contador);
360
//                                }
361
//                                if(res.equals(",GEOGCS[")) {
362
//                                        contador++;
363
//                                        for(; wkt.charAt(contador) != '"'; contador++) {
364
//                                                geogcs += wkt.charAt(contador);
365
//                                        }
366
//                                }
367
//
368
//                                res = "";
369
//                                contador++;
370
//                                for(; wkt.charAt(contador) != '"'; contador++) {
371
//                                        res += wkt.charAt(contador);
372
//                                }
373
//                                if(res.equals(",DATUM[")) {
374
//                                        contador++;
375
//                                        for(; wkt.charAt(contador) != '"'; contador++) {
376
//                                                datum += wkt.charAt(contador);
377
//                                        }
378
//                                }
379
//                                res = "";
380
//                                contador++;
381
//                                for(; wkt.charAt(contador) != '"'; contador++) {
382
//                                        res += wkt.charAt(contador);
383
//                                }
384
//                                if(res.equals(",SPHEROID[")) {
385
//                                        contador++;
386
//                                        for(; wkt.charAt(contador) != ']'; contador++) {
387
//                                                while(wkt.charAt(contador) != '"' ) {
388
//                                                        spheroid[0] += wkt.charAt(contador);
389
//                                                        contador++;
390
//                                                }
391
//                                                contador +=2;
392
//                                                while(wkt.charAt(contador) != ',') {
393
//                                                        spheroid[1] += wkt.charAt(contador);
394
//                                                        contador++;
395
//                                                }
396
//                                                contador++;
397
//                                                while(wkt.charAt(contador) != ']') {
398
//                                                        spheroid[2] += wkt.charAt(contador);
399
//                                                        contador++;
400
//                                                }
401
//                                        }
402
//                                }
403
//                                contador++;
404
//                                res = "";
405
//                                for(; wkt.charAt(contador) != '"'; contador++) {
406
//                                        res += wkt.charAt(contador);
407
//                                }
408
//                                if(res.equals(",PRIMEM[")) {
409
//                                        contador++;
410
//                                        for(; wkt.charAt(contador) != ','; contador++) {
411
//                                                while(wkt.charAt(contador) != '"' ){
412
//                                                        primem[0] += wkt.charAt(contador);
413
//                                                        contador ++;
414
//                                                }
415
//                                                contador +=2;
416
//                                                while(wkt.charAt(contador) != ']') {
417
//                                                        primem[1] += wkt.charAt(contador);
418
//                                                        contador ++;
419
//                                                }
420
//                                        }
421
//                                }
422
//                                contador++;
423
//                                res = "";
424
//                                for(; wkt.charAt(contador) != '"'; contador++) {
425
//                                        res += wkt.charAt(contador);
426
//                                }
427
//                                if(res.equals("UNIT[")) {
428
//                                        contador++;
429
//                                        for(; wkt.charAt(contador) != ']'; contador++) {
430
//                                                while(wkt.charAt(contador) != '"' ){
431
//                                                        unit[0] += wkt.charAt(contador);
432
//                                                        contador ++;
433
//                                                }
434
//                                                contador +=2;
435
//                                                while(wkt.charAt(contador) != ']') {
436
//                                                        unit[1] += wkt.charAt(contador);
437
//                                                        contador ++;
438
//                                                }
439
//                                        }
440
//                                }
441
//                                contador++;
442
//                                res = "";
443
//                                for(; wkt.charAt(contador) != '"'; contador++) {
444
//                                        res += wkt.charAt(contador);
445
//                                }
446
//                                if(res.equals(",PROJECTION[")) {
447
//                                        contador++;
448
//                                        for(; wkt.charAt(contador) != '"'; contador++) {
449
//                                                projection += wkt.charAt(contador);
450
//                                        }
451
//                                }
452
//                                contador = contador+2;
453
//                                res = "";
454
//                                for(; wkt.charAt(contador) != '"'; contador++) {
455
//                                        res += wkt.charAt(contador);
456
//                                }
457
//                                //Hallamos el numero de parametros que tiene la cadena wkt
458
//                                int i = 0;
459
//
460
//                                int copiacontador = contador;
461
//                                if(res.equals(",PARAMETER[")) {
462
//                                        do{
463
//                                                for(; wkt.charAt(copiacontador) != ']'; copiacontador++) {
464
//                                                        while(wkt.charAt(copiacontador) != '"' )
465
//                                                                copiacontador++;
466
//                                                        copiacontador += 2;
467
//                                                        while(wkt.charAt(copiacontador) != ']' )
468
//                                                                copiacontador++;
469
//                                                        copiacontador--;
470
//                                                }
471
//                                                i++;
472
//                                                copiacontador++;
473
//                                                res = "";
474
//                                                for(; wkt.charAt(copiacontador) != '"'; copiacontador++) {
475
//                                                        res += wkt.charAt(copiacontador);
476
//                                                }
477
//                                        } while (res.equals(",PARAMETER["));
478
//                                        res = ",PARAMETER[";
479
//                                }
480
//                                // Inicializamos los parametros
481
//                                param_name = new String[i];
482
//                                param_value = new String[i];
483
//                                for(int j = 0 ;j < i; j++ ){
484
//                                        param_name[j] = "";
485
//                                        param_value[j] = "";
486
//                                }
487
//                                i = 0;
488
//                                if(res.equals(",PARAMETER[")) {
489
//                                        do{
490
//                                                contador++;
491
//                                                for(; wkt.charAt(contador) != ']'; contador++) {
492
//                                                        while(wkt.charAt(contador) != '"' ){
493
//                                                                param_name[i] += wkt.charAt(contador);
494
//                                                                contador++;
495
//                                                        }
496
//                                                        contador += 2;
497
//                                                        while(wkt.charAt(contador) != ']' ){
498
//                                                                param_value[i] += wkt.charAt(contador);
499
//                                                                contador++;
500
//                                                        }
501
//                                                        contador--;
502
//                                                }
503
//                                                i++;
504
//                                                contador++;
505
//                                                res = "";
506
//                                                for(; wkt.charAt(contador) != '"'; contador++) {
507
//                                                        res += wkt.charAt(contador);
508
//                                                }
509
//                                        } while (res.equals(",PARAMETER["));
510
//                                }
511
//
512
//                                if (res.equals(",UNIT[")){
513
//                                        contador++;
514
//                                        for(; wkt.charAt(contador) != ','; contador++) {
515
//                                                while(wkt.charAt(contador) != '"' ){
516
//                                                        unit_p[0] += wkt.charAt(contador);
517
//                                                        contador ++;
518
//                                                }
519
//                                                contador +=2;
520
//                                                while(wkt.charAt(contador) != ']') {
521
//                                                        unit_p[1] += wkt.charAt(contador);
522
//                                                        contador ++;
523
//                                                }
524
//                                        }
525
//                                }
526
//                                contador++;
527
//                                res = "";
528
//                                for(; wkt.charAt(contador) != '"'; contador++) {
529
//                                        res += wkt.charAt(contador);
530
//                                }
531
//                                if(res.equals("AUTHORITY[")) {
532
//                                        contador++;
533
//                                        for(; wkt.charAt(contador) != ']'; contador++) {
534
//                                                while(wkt.charAt(contador) != '"' ){
535
//                                                        authority[0] += wkt.charAt(contador);
536
//                                                        contador ++;
537
//                                                }
538
//                                                contador +=2;
539
//                                                while(wkt.charAt(contador) != ']') {
540
//                                                        authority[1] += wkt.charAt(contador);
541
//                                                        contador ++;
542
//                                                }
543
//                                        }
544
//                                }
545
//                        }
546
//                        else if (res.equals("GEOCCS[")){
547
//                                /*
548
//                                 * parte necesaria para capturar la cadena geocentrica...
549
//                                 */
550
//
551
//                        }
552
//                }else
553
//                        geogcs = wkt;
554
        }
555

    
556
        public String getProjection() {
557
                return projection;
558
        }
559

    
560
        public String getProjcs() {
561
                return projcs;
562
        }
563

    
564
        public String getGeogcs() {
565
                return geogcs;
566
        }
567

    
568
        public String getDatumName() {
569
                return datum;
570
        }
571

    
572
        public String[] getSpheroid() {
573
                return spheroid;
574
        }
575

    
576
        public String[] getPrimen() {
577
                return primem;
578
        }
579

    
580
        public String getName() {
581
                if(projcs == "")
582
                        return geogcs;
583
                return projcs;
584
        }
585

    
586
        public String[] getUnit() {
587
                return unit;
588
        }
589

    
590
        public String[] getUnit_p() {
591
                return unit_p;
592
        }
593

    
594
        public String[] getParam_name() {
595
                return param_name;
596
        }
597

    
598
        public String[] getParam_value() {
599
                return param_value;
600
        }
601

    
602
        public String[] getAuthority(){
603
                return authority;
604
        }
605

    
606
        /*
607
         * Parser a medio hacer, orientado a objeto y recursivo.
608
         * by LWS.
609
         */
610

    
611
        public static class WKT {
612
                public class Param {
613
                        String key;
614
                        ArrayList values = new ArrayList();
615
                        ArrayList params = new ArrayList();
616
                        public int pos = 0;
617
                        public Param(String key) {
618
                                this.key = key;
619
                        }
620
                        public void addValue(String name) {
621
                                values.add(name);
622
                        }
623
                        public void addParam(Param p) {
624
                                params.add(p);
625
                        }
626
                }
627
                String data;
628
                public WKT(String data) {
629
                        this.data = data;
630
                        WKT.Param param = parseParam(0);
631
                }
632
                private WKT.Param parseParam(int pos) {
633
                        WKT.Param param = null;
634
                        String key, name;
635

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

    
684
        private void fromCode(String code) {
685
                CoordinateReferenceSystem source;
686
                setAuthority(code);
687
                try {
688
                        source = CRS.decode(code);
689
                        setWkt(source.toWKT());
690

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

    
724
                        }
725

    
726
                        if (source instanceof DefaultGeographicCRS) {
727
                                DefaultGeographicCRS sour = (DefaultGeographicCRS) source;
728
                                String[] val = sour.getName().toString().split(":");
729
                                if (val.length<2)
730
                                        setGeogcs(sour.getName().toString().split(":")[0]);
731
                                else
732
                                        setGeogcs(sour.getName().toString().split(":")[1]);
733

    
734
                                DefaultGeodeticDatum d = (DefaultGeodeticDatum) sour.getDatum();
735
                                val = d.getName().toString().split(":");
736
                                if (val.length<2)
737
                                        setDatumName(d.getName().toString().split(":")[0]);
738
                                else
739
                                        setDatumName(d.getName().toString().split(":")[1]);
740
                                setSpheroid((DefaultEllipsoid)d.getEllipsoid());
741
                                setPrimen(d.getPrimeMeridian());
742

    
743
                        }
744
                } catch (NoSuchAuthorityCodeException e) { //Pertenece a CRS
745
                        logger.error("Can't create CRS from code '"+code+"'.",e);
746
                } catch (FactoryException e) { //Pertenece a CRS
747
                        logger.error("Can't create CRS from code '"+code+"'.",e);
748
                }
749

    
750
        }
751

    
752
//        private void parseWKT(String data) {
753
//                WKT wkt = new WKT(data);
754
//        }
755

    
756
        public void setProjcs (String proj) {
757
                this.projcs = proj;
758
        }
759

    
760
        public void setProjection (String projection) {
761
                this.projection = projection;
762
        }
763
        public void setGeogcs (String geo) {
764
                this.geogcs = geo;
765
        }
766

    
767
        public void setDatumName (String dat) {
768
                this.datum = dat;
769
        }
770

    
771
        public void setSpheroid (DefaultEllipsoid ellips) {
772
                Unit u = ellips.getAxisUnit();
773
                double semi_major = convert( ellips.getSemiMajorAxis(), u.toString());
774
                double inv_f = convert( ellips.getInverseFlattening(), u.toString());
775
                String[] val =        ellips.getName().toString().split(":");
776
                if (val.length<2)
777
                        this.spheroid[0] = ellips.getName().toString().split(":")[0];
778
                else
779
                        this.spheroid[0] = ellips.getName().toString().split(":")[1];
780
                this.spheroid[1] = String.valueOf(semi_major);
781
                this.spheroid[2] = String.valueOf(inv_f);
782
        }
783

    
784
        public void setPrimen (PrimeMeridian prim) {
785
                DefaultPrimeMeridian pm = (DefaultPrimeMeridian)(prim);
786
                Unit u = pm.getAngularUnit();
787
                double value = convert( pm.getGreenwichLongitude(), u.toString());
788
                String[] val = pm.getName().toString().split(":");
789
                if (val.length<2)
790
                        this.primem[0] = pm.getName().toString().split(":")[0];
791
                else
792
                        this.primem[0] = pm.getName().toString().split(":")[1];
793
                this.primem[1] = String.valueOf(value);
794
        }
795

    
796
        public void setAuthority (String aut) {
797
                this.authority = aut.split(":");
798
        }
799

    
800
        public void setWkt(String wkt){
801
                this.wkt = wkt;
802
        }
803

    
804
        public String getWkt() {
805
                return wkt;
806
        }
807

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

    
850
                throw new ConversionException("Conversion no contemplada: "+measure);
851
    }
852
}