Statistics
| Revision:

root / trunk / libraries / libJCRS / src / org / gvsig / crs / CrsWkt.java @ 7739

History | View | Annotate | Download (9.71 KB)

1
package org.gvsig.crs;
2

    
3
import java.util.ArrayList;
4

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