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