Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libJCRS / src / org / gvsig / crs / CrsWkt.java @ 8262

History | View | Annotate | Download (11 KB)

1
package org.gvsig.crs;
2

    
3
import java.awt.dnd.Autoscroll;
4
import java.util.ArrayList;
5

    
6
public class CrsWkt {
7
        private String projcs = "";
8
        private String geogcs = "";
9
        private String datum = "";
10
        private String[] spheroid = {"" ,"",""};
11
        private String[] primem = {"",""};
12
        private String[] unit = {"",""};
13
        private String[] unit_p = {"",""};
14
        private String projection = "";
15
        private String[] param_name;
16
        private String[] param_value;
17
        private int contador = 0;
18
        private String[] authority = {"",""};
19
        
20
        public CrsWkt(String wkt_spaces) {
21
                String aux;
22
                String wkt = "";
23
                for(int i = 0; i < wkt_spaces.length(); i++) {
24
                        aux = ""+wkt_spaces.charAt(i);
25
                        if(!aux.equals(" ")) {
26
                                wkt+=aux;
27
                        }else {
28
                                wkt += "";
29
                        }
30
                }
31
                fromWKT(wkt, false);
32
        }
33
        
34
        private void fromWKT(String wkt, boolean isProj) {
35
                
36
                String res = new String();
37
                if(!wkt.startsWith("EPSG:")) {
38
                        res = "";
39
                        for(; wkt.charAt(contador) != '"'; contador++) {
40
                                res += wkt.charAt(contador);
41
                        }
42
                        if(res.equals("GEOGCS[")) {
43
                                
44
                                contador++;
45
                                for(; wkt.charAt(contador) != '"'; contador++) {
46
                                        geogcs += wkt.charAt(contador);
47
                                }
48
                                
49
                                res = "";
50
                                contador++;
51
                                for(; wkt.charAt(contador) != '"'; contador++) {
52
                                        res += wkt.charAt(contador);
53
                                }
54
                                if(res.equals(",DATUM[")) {
55
                                        contador++;
56
                                        for(; wkt.charAt(contador) != '"'; contador++) {
57
                                                datum += wkt.charAt(contador);
58
                                        }
59
                                }
60
                                res = "";
61
                                contador++;
62
                                for(; wkt.charAt(contador) != '"'; contador++) {
63
                                        res += wkt.charAt(contador);
64
                                }
65
                                if(res.equals(",SPHEROID[")) {
66
                                        contador++;
67
                                        for(; wkt.charAt(contador) != ']'; contador++) {
68
                                                while(wkt.charAt(contador) != '"' ) {
69
                                                        spheroid[0] += wkt.charAt(contador);
70
                                                        contador++;
71
                                                }
72
                                                contador +=2;
73
                                                while(wkt.charAt(contador) != ',') {
74
                                                        spheroid[1] += wkt.charAt(contador);
75
                                                        contador++;
76
                                                }
77
                                                contador++;
78
                                                while(wkt.charAt(contador) != ']') {
79
                                                        spheroid[2] += wkt.charAt(contador);
80
                                                        contador++;
81
                                                }
82
                                        }
83
                                }
84
                                contador++;
85
                                res = "";
86
                                for(; wkt.charAt(contador) != '"'; contador++) {
87
                                        res += wkt.charAt(contador);
88
                                }
89
                                if(res.equals(",PRIMEM[")) {
90
                                        contador++;
91
                                        for(; wkt.charAt(contador) != ','; contador++) {
92
                                                while(wkt.charAt(contador) != '"' ){
93
                                                        primem[0] += wkt.charAt(contador);
94
                                                        contador ++;
95
                                                }
96
                                                contador +=2;
97
                                                while(wkt.charAt(contador) != ']') {
98
                                                        primem[1] += wkt.charAt(contador);
99
                                                        contador ++;
100
                                                }
101
                                        }
102
                                }
103
                                contador++;
104
                                res = "";
105
                                for(; wkt.charAt(contador) != '"'; contador++) {
106
                                        res += wkt.charAt(contador);
107
                                }
108
                                if(res.equals("UNIT[")) {
109
                                        contador++;
110
                                        for(; wkt.charAt(contador) != ','; contador++) {
111
                                                while(wkt.charAt(contador) != '"' ){
112
                                                        unit[0] += wkt.charAt(contador);
113
                                                        contador ++;
114
                                                }
115
                                                contador +=2;
116
                                                while(wkt.charAt(contador) != ']') {
117
                                                        unit[1] += wkt.charAt(contador);
118
                                                        contador ++;
119
                                                }
120
                                        }
121
                                }
122
                                contador++;
123
                                res = "";
124
                                for(; wkt.charAt(contador) != '"'; contador++) {
125
                                        res += wkt.charAt(contador);
126
                                }
127
                                if(res.equals("AUTHORITY[")) {
128
                                        contador++;
129
                                        for(; wkt.charAt(contador) != ']'; contador++) {
130
                                                while(wkt.charAt(contador) != '"' ){
131
                                                        authority[0] += wkt.charAt(contador);
132
                                                        contador ++;
133
                                                }
134
                                                contador +=2;
135
                                                while(wkt.charAt(contador) != ']') {
136
                                                        authority[1] += wkt.charAt(contador);
137
                                                        contador ++;
138
                                                }
139
                                        }
140
                                }
141
                        }else if (res.equals("PROJCS[")) {
142
                                contador++;
143
                                for(; wkt.charAt(contador) != '"'; contador++) {
144
                                        projcs += wkt.charAt(contador);
145
                                }
146
                                contador++;
147
                                res = "";
148
                                for(; wkt.charAt(contador) != '"'; contador++) {
149
                                        res += wkt.charAt(contador);
150
                                }
151
                                if(res.equals(",GEOGCS[")) {
152
                                        contador++;
153
                                        for(; wkt.charAt(contador) != '"'; contador++) {
154
                                                geogcs += wkt.charAt(contador);
155
                                        }
156
                                }
157
                                                                
158
                                res = "";
159
                                contador++;
160
                                for(; wkt.charAt(contador) != '"'; contador++) {
161
                                        res += wkt.charAt(contador);
162
                                }
163
                                if(res.equals(",DATUM[")) {
164
                                        contador++;
165
                                        for(; wkt.charAt(contador) != '"'; contador++) {
166
                                                datum += wkt.charAt(contador);
167
                                        }
168
                                }
169
                                res = "";
170
                                contador++;
171
                                for(; wkt.charAt(contador) != '"'; contador++) {
172
                                        res += wkt.charAt(contador);
173
                                }
174
                                if(res.equals(",SPHEROID[")) {
175
                                        contador++;
176
                                        for(; wkt.charAt(contador) != ']'; contador++) {
177
                                                while(wkt.charAt(contador) != '"' ) {
178
                                                        spheroid[0] += wkt.charAt(contador);
179
                                                        contador++;
180
                                                }
181
                                                contador +=2;
182
                                                while(wkt.charAt(contador) != ',') {
183
                                                        spheroid[1] += wkt.charAt(contador);
184
                                                        contador++;
185
                                                }
186
                                                contador++;
187
                                                while(wkt.charAt(contador) != ']') {
188
                                                        spheroid[2] += wkt.charAt(contador);
189
                                                        contador++;
190
                                                }
191
                                        }
192
                                }
193
                                contador++;
194
                                res = "";
195
                                for(; wkt.charAt(contador) != '"'; contador++) {
196
                                        res += wkt.charAt(contador);
197
                                }
198
                                if(res.equals(",PRIMEM[")) {
199
                                        contador++;
200
                                        for(; wkt.charAt(contador) != ','; contador++) {
201
                                                while(wkt.charAt(contador) != '"' ){
202
                                                        primem[0] += wkt.charAt(contador);
203
                                                        contador ++;
204
                                                }
205
                                                contador +=2;
206
                                                while(wkt.charAt(contador) != ']') {
207
                                                        primem[1] += wkt.charAt(contador);
208
                                                        contador ++;
209
                                                }
210
                                        }
211
                                }
212
                                contador++;
213
                                res = "";
214
                                for(; wkt.charAt(contador) != '"'; contador++) {
215
                                        res += wkt.charAt(contador);
216
                                }
217
                                if(res.equals("UNIT[")) {
218
                                        contador++;
219
                                        for(; wkt.charAt(contador) != ']'; contador++) {
220
                                                while(wkt.charAt(contador) != '"' ){
221
                                                        unit[0] += wkt.charAt(contador);
222
                                                        contador ++;
223
                                                }
224
                                                contador +=2;
225
                                                while(wkt.charAt(contador) != ']') {
226
                                                        unit[1] += wkt.charAt(contador);
227
                                                        contador ++;
228
                                                }
229
                                        }
230
                                }
231
                                contador++;
232
                                res = "";
233
                                for(; wkt.charAt(contador) != '"'; contador++) {
234
                                        res += wkt.charAt(contador);
235
                                }
236
                                if(res.equals(",PROJECTION[")) {
237
                                        contador++;
238
                                        for(; wkt.charAt(contador) != '"'; contador++) {
239
                                                projection += wkt.charAt(contador);
240
                                        }
241
                                }
242
                                contador = contador+2;
243
                                res = "";
244
                                for(; wkt.charAt(contador) != '"'; contador++) {
245
                                        res += wkt.charAt(contador);
246
                                }
247
                                //Hallamos el numero de parametros que tiene la cadena wkt
248
                                int i = 0;
249
                                
250
                                int copiacontador = contador;
251
                                if(res.equals(",PARAMETER[")) {
252
                                        do{
253
                                                for(; wkt.charAt(copiacontador) != ']'; copiacontador++) {
254
                                                        while(wkt.charAt(copiacontador) != '"' )
255
                                                                copiacontador++;
256
                                                        copiacontador += 2;
257
                                                        while(wkt.charAt(copiacontador) != ']' )
258
                                                                copiacontador++;
259
                                                        copiacontador--;
260
                                                }
261
                                                i++;
262
                                                copiacontador++;
263
                                                res = "";
264
                                                for(; wkt.charAt(copiacontador) != '"'; copiacontador++) {
265
                                                        res += wkt.charAt(copiacontador);
266
                                                }
267
                                        } while (res.equals(",PARAMETER["));
268
                                        res = ",PARAMETER[";
269
                                }
270
                                // Inicializamos los parametros
271
                                param_name = new String[i];
272
                                param_value = new String[i];
273
                                for(int j = 0 ;j < i; j++ ){
274
                                        param_name[j] = "";
275
                                        param_value[j] = "";
276
                                }
277
                                i = 0;
278
                                if(res.equals(",PARAMETER[")) {
279
                                        do{
280
                                                contador++;
281
                                                for(; wkt.charAt(contador) != ']'; contador++) {
282
                                                        while(wkt.charAt(contador) != '"' ){
283
                                                                param_name[i] += wkt.charAt(contador);
284
                                                                contador++;
285
                                                        }
286
                                                        contador += 2;
287
                                                        while(wkt.charAt(contador) != ']' ){
288
                                                                param_value[i] += wkt.charAt(contador);
289
                                                                contador++;
290
                                                        }
291
                                                        contador--;
292
                                                }
293
                                                i++;
294
                                                contador++;
295
                                                res = "";
296
                                                for(; wkt.charAt(contador) != '"'; contador++) {
297
                                                        res += wkt.charAt(contador);
298
                                                }
299
                                        } while (res.equals(",PARAMETER["));                                        
300
                                }
301
                                
302
                                if (res.equals(",UNIT[")){
303
                                        contador++;
304
                                        for(; wkt.charAt(contador) != ','; contador++) {
305
                                                while(wkt.charAt(contador) != '"' ){
306
                                                        unit_p[0] += wkt.charAt(contador);
307
                                                        contador ++;
308
                                                }
309
                                                contador +=2;
310
                                                while(wkt.charAt(contador) != ']') {
311
                                                        unit_p[1] += wkt.charAt(contador);
312
                                                        contador ++;
313
                                                }
314
                                        }
315
                                }
316
                                contador++;
317
                                res = "";
318
                                for(; wkt.charAt(contador) != '"'; contador++) {
319
                                        res += wkt.charAt(contador);
320
                                }
321
                                if(res.equals("AUTHORITY[")) {
322
                                        contador++;
323
                                        for(; wkt.charAt(contador) != ']'; contador++) {
324
                                                while(wkt.charAt(contador) != '"' ){
325
                                                        authority[0] += wkt.charAt(contador);
326
                                                        contador ++;
327
                                                }
328
                                                contador +=2;
329
                                                while(wkt.charAt(contador) != ']') {
330
                                                        authority[1] += wkt.charAt(contador);
331
                                                        contador ++;
332
                                                }
333
                                        }
334
                                }
335
                        }
336
                        else if (res.equals("GEOCCS[")){
337
                                /*
338
                                 * parte necesaria para capturar la cadena geocentrica...
339
                                 */
340
                                
341
                        }
342
                }else
343
                        geogcs = wkt;
344
        }
345
        
346
        public String getProjection() {
347
                return projection;
348
        }
349
        
350
        public String getProjcs() {
351
                return projcs;
352
        }
353
        
354
        public String getGeogcs() {
355
                return geogcs;
356
        }
357
        
358
        public String getDatumName() {
359
                return datum;
360
        }
361
        
362
        public String[] getSpheroid() {
363
                return spheroid;
364
        }
365
        
366
        public String[] getPrimen() {
367
                return primem;
368
        }
369
        
370
        public String getName() {
371
                if(projcs == "") 
372
                        return geogcs;
373
                return projcs;
374
        }
375
        
376
        public String[] getUnit() {
377
                return unit;
378
        }
379
        
380
        public String[] getUnit_p() {
381
                return unit_p;
382
        }
383
        
384
        public String[] getParam_name() {
385
                return param_name;
386
        }
387
        
388
        public String[] getParam_value() {
389
                return param_value;
390
        }
391
        
392
        public String[] getAuthority(){
393
                return authority;
394
        }
395
        
396
        /*
397
         * Parser a medio hacer, orientado a objeto y recursivo.
398
         * by LWS.
399
         */
400
        
401
        public static class WKT {
402
                public class Param {
403
                        String key;
404
                        ArrayList values = new ArrayList();
405
                        ArrayList params = new ArrayList();
406
                        public int pos = 0;
407
                        public Param(String key) {
408
                                this.key = key;
409
                        }
410
                        public void addValue(String name) {
411
                                values.add(name);
412
                        }
413
                        public void addParam(Param p) {
414
                                params.add(p);
415
                        }
416
                }
417
                String data;
418
                public WKT(String data) {
419
                        this.data = data;
420
                        WKT.Param param = parseParam(0);
421
                }
422
                private WKT.Param parseParam(int pos) {
423
                        WKT.Param param = null;
424
                        String key, name;
425
                        
426
                        int l = data.length();
427
                        for (int i = pos; i<l;) {
428
                                int nextParam = data.indexOf(",", i);
429
                                if (nextParam == i) {
430
                                        nextParam = data.indexOf(",", ++i);
431
                                }
432
                                int cierra = data.indexOf("]", i);
433
                                int abre = data.indexOf("[", i);
434
                                if (cierra < abre) { // Esta mal
435
                                        pinta(" =>");
436
                                        param.pos = cierra;
437
                                        return param;
438
                                }
439
                                if (param == null) {
440
                                        if (abre > 0) { //hay claves
441
                                                key = data.substring(i, data.indexOf("[", i));
442
                                                pinta(key+ " <= ");
443
                                                i = abre+1;
444
                                                param = new WKT.Param(key);
445
                                        }
446
                                } else {
447
                                        if (data.substring(i).startsWith("\"")) {
448
                                                name = data.substring(i+1, data.indexOf("\"", i+1));
449
                                                i+=name.length()+2;
450
                                                pinta("|"+name+"|,");
451
                                                param.addValue(name);
452
                                        } else if (nextParam<abre) {
453
                                                name = data.substring(i, data.indexOf(",", i));
454
                                                i+=name.length();
455
                                                pinta(name+",");
456
                                                param.addValue(name);
457
                                        } else {
458
                                                Param p = parseParam(i);
459
                                                i = p.pos+1;
460
                                        }
461
                                }
462
                        }
463
                        return param;
464
                }
465
                static int cnt=0;
466
                public static void pinta(String str) {
467
                        cnt++;
468
                        if (cnt>60)
469
                                System.exit(1);
470
                        System.out.println(str);
471
                }
472
        }
473
        
474
        private void parseWKT(String data) {
475
                WKT wkt = new WKT(data);
476
        }
477
}