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 |
} |