Revision 359 org.gvsig.projection.jcrs/trunk/org.gvsig.projection.jcrs/org.gvsig.projection.jcrs.lib/src/main/java/org/gvsig/crs/Crs.java

View differences:

Crs.java
50 50
import org.cresques.cts.IDatum;
51 51
import org.cresques.cts.IProjection;
52 52
import org.cresques.geo.ViewPortData;
53
import org.slf4j.Logger;
54
import org.slf4j.LoggerFactory;
55

  
53 56
import org.gvsig.crs.proj.CrsProj;
54
import org.gvsig.crs.proj.JNIBaseCrs;
55 57
import org.gvsig.crs.proj.OperationCrsException;
56 58
import org.gvsig.fmap.crs.CRSFactory;
57
import org.slf4j.Logger;
58
import org.slf4j.LoggerFactory;
59 59

  
60 60
/**
61 61
 * Clase que construye el CRS a partir de la cadena WKT
......
65 65
 *
66 66
 */
67 67
public class Crs implements ICrs {
68
	private static final Logger logger = LoggerFactory.getLogger(Crs.class); 
68
	private static final Logger logger = LoggerFactory.getLogger(Crs.class);
69 69

  
70 70
	private static final Color basicGridColor = new Color(64, 64, 64, 128);
71 71
	private Proj4 proj4;
......
82 82
	String targetTrParams = null;
83 83
	String wkt = null;
84 84
	Color gridColor = basicGridColor;
85
	CRSDatum datum = null;	
85
	CRSDatum datum = null;
86 86

  
87 87
	public Crs(int epsgCode, int aut) throws CrsException
88 88
	{
89 89
		String strEpsgCode = "";
90 90
		if (aut == 1) {
91
			strEpsgCode="EPSG:"+epsgCode;			
91
			strEpsgCode="EPSG:"+epsgCode;
92 92
		} else if (aut == 2){
93 93
			strEpsgCode="ESRI:"+epsgCode;
94 94
		} else if (aut == 3){
......
99 99
		crsWkt=new CrsWkt(strEpsgCode);
100 100
		setWKT(crsWkt.getWkt());
101 101
	}
102
	
103
	
102

  
103

  
104 104
	/**
105 105
	 * Construye un CRS a partir del c?digo EPSG o de la cadena WKT.
106
	 * 
106
	 *
107 107
	 * @param code
108 108
	 * @throws CrsException
109 109
	 */
......
118 118
			code = code.substring(code.indexOf(":")+1);
119 119
			try {
120 120
				//Creamos el objeto que tendra los diferentes parametros de la cadena Wkt
121
				crsWkt = new CrsWkt(fullCode);				
121
				crsWkt = new CrsWkt(fullCode);
122 122
				setName(fullCode);
123 123
				setAbrev(fullCode);
124
				
124

  
125 125
			} catch (NumberFormatException e) {
126 126
				logger.error("Can't Wkt.",e);
127 127
			}
......
137 137
				}
138 138
			}
139 139
			crsWkt = new CrsWkt(code2);
140
	    	    		
140

  
141 141
    		setName(fullCode);
142 142
    		//setAbrev(crsWkt.getName());
143
    		setAbrev(crsWkt.getAuthority()[0]+":"+crsWkt.getAuthority()[1]);	    	
144
	    	
143
    		setAbrev(crsWkt.getAuthority()[0]+":"+crsWkt.getAuthority()[1]);
144

  
145 145
    	}
146 146
		//	Asignar el datum y el crs base (en el caso de ser projectado):
147 147
		if (!(crsWkt.getSpheroid()[1].equals("")||crsWkt.getSpheroid()[2].equals(""))){
148 148
			double eSemiMajorAxis = Double.valueOf(crsWkt.getSpheroid()[1]).doubleValue();
149 149
			double eIFlattening = Double.valueOf(crsWkt.getSpheroid()[2]).doubleValue();
150 150
			datum = new CRSDatum(eSemiMajorAxis,eIFlattening);
151
			
151

  
152 152
			//crs base (en el caso de ser projectado):
153 153
			/*if(this.isProjected()){
154 154
				String proj4Base = "+proj=latlong +a=" + crsWkt.getSpheroid()[1] + " +rf=" + crsWkt.getSpheroid()[2] ;
155 155
				crsBase = new CrsProj(proj4Base);
156 156
			}*/
157 157
		}
158
	}	
159
	
158
	}
159

  
160 160
	/**
161 161
	 *Construye un CRS a partir del c?digo EPSG o de la cadena WKT.
162
	 * 
162
	 *
163 163
	 * @param epsg_cod
164 164
	 * @param code
165 165
	 * @throws CrsException
......
176 176
			code = code.substring(code.indexOf(":")+1);
177 177
			try {
178 178
				//Creamos el objeto que tendra los diferentes parametros de la cadena Wkt
179
				crsWkt = new CrsWkt(fullCode);				
179
				crsWkt = new CrsWkt(fullCode);
180 180
				setName(fullCode);
181 181
				setAbrev(fullCode);
182
				
182

  
183 183
			} catch (NumberFormatException e) {
184 184
				logger.error("Can't get Wkt.",e);
185 185
			}
......
201 201
			 * que no estan en gdal, por lo que asignaremos directamente su cadena
202 202
			 * en proj4 para trabajar con ellas
203 203
			 */
204
			if (!crsWkt.getProjection().equals("Equidistant_Cylindrical") && !crsWkt.getProjection().equals("Oblique_Cylindrical_Equal_Area")){		    		    		
204
			if (!crsWkt.getProjection().equals("Equidistant_Cylindrical") && !crsWkt.getProjection().equals("Oblique_Cylindrical_Equal_Area")){
205 205
	    		setName(fullCode);
206 206
	    		//setAbrev(crsWkt.getName());
207
	    		setAbrev(crsWkt.getAuthority()[0]+":"+crsWkt.getAuthority()[1]);		    	 
207
	    		setAbrev(crsWkt.getAuthority()[0]+":"+crsWkt.getAuthority()[1]);
208 208
			}
209 209
			else if (crsWkt.getProjection().equals("Equidistant_Cylindrical")){
210 210
				String spheroid1 = crsWkt.getSpheroid()[1];
......
215 215
				String standardParallel1 = "0.0";
216 216
				for (int i=0; i<crsWkt.getParam_name().length;i++){
217 217
					if (crsWkt.getParam_name()[i].equals("Central_Meridian"))
218
						centralMeridian = crsWkt.getParam_value()[i];	
218
						centralMeridian = crsWkt.getParam_value()[i];
219 219
					if (crsWkt.getParam_name()[i].equals("False_Easting"))
220
						falseEasting = crsWkt.getParam_value()[i];					
220
						falseEasting = crsWkt.getParam_value()[i];
221 221
					if(crsWkt.getParam_name()[i].equals("False_Northing"))
222
						falseNorthing = crsWkt.getParam_value()[i];					
222
						falseNorthing = crsWkt.getParam_value()[i];
223 223
					if (crsWkt.getParam_name()[i].equals("Standard_Parallel_1"))
224
						standardParallel1 = crsWkt.getParam_value()[i];					
224
						standardParallel1 = crsWkt.getParam_value()[i];
225 225
				}
226 226
				if (spheroid2.equals("0.0")){
227 227
					proj4String = "+proj=eqc +a=" + spheroid1 +
......
231 231
					proj4String = "+proj=eqc +a="+ spheroid1 +" +rf=" + spheroid2 +
232 232
					" +lon_0="+ centralMeridian + " +x_0="+falseEasting+" +y_0="+falseNorthing +
233 233
					" +lat_ts="+standardParallel1;
234
				}				
234
				}
235 235
				setName(fullCode);
236 236
	    		//setAbrev(crsWkt.getName());
237 237
	    		setAbrev(crsWkt.getAuthority()[0]+":"+crsWkt.getAuthority()[1]);
238
				
238

  
239 239
			}
240 240
			else if (crsWkt.getProjection().equals("Oblique_Cylindrical_Equal_Area")){
241 241
				String spheroid1 = crsWkt.getSpheroid()[1];
......
245 245
				String falseEasting = "";
246 246
				String standardParallel1 = "";
247 247
				String standardParallel2 = "0.0";
248
				for (int i=0; i<crsWkt.getParam_name().length;i++){					
248
				for (int i=0; i<crsWkt.getParam_name().length;i++){
249 249
					if (crsWkt.getParam_name()[i].equals("Central_Meridian"))
250
						centralMeridian = crsWkt.getParam_value()[i];	
250
						centralMeridian = crsWkt.getParam_value()[i];
251 251
					if (crsWkt.getParam_name()[i].equals("False_Easting"))
252
						falseEasting = crsWkt.getParam_value()[i];					
252
						falseEasting = crsWkt.getParam_value()[i];
253 253
					if(crsWkt.getParam_name()[i].equals("False_Northing"))
254
						falseNorthing = crsWkt.getParam_value()[i];					
254
						falseNorthing = crsWkt.getParam_value()[i];
255 255
					if (crsWkt.getParam_name()[i].equals("Standard_Parallel_1"))
256 256
						standardParallel1 = crsWkt.getParam_value()[i];
257 257
					if (crsWkt.getParam_name()[i].equals("Standard_Parallel_2"))
258
						standardParallel2 = crsWkt.getParam_value()[i];		
258
						standardParallel2 = crsWkt.getParam_value()[i];
259 259
				}
260 260
				if (spheroid2.equals("0.0")){
261 261
					proj4String = "+proj=ocea +a="+ spheroid1  +
......
267 267
					" +lon_0="+ centralMeridian + " +x_0="+falseEasting+" +y_0="+falseNorthing +
268 268
					" +lat_1="+standardParallel1+" +lat_2="+standardParallel2+" +lon_1=long_1" +
269 269
					" +lon_2=long_2 +no_defs";
270
				}				
270
				}
271 271
				setName(fullCode);
272 272
	    		//setAbrev(crsWkt.getName());
273 273
	    		setAbrev(crsWkt.getAuthority()[0]+":"+crsWkt.getAuthority()[1]);
......
278 278
			double eSemiMajorAxis = Double.valueOf(crsWkt.getSpheroid()[1]).doubleValue();
279 279
			double eIFlattening = Double.valueOf(crsWkt.getSpheroid()[2]).doubleValue();
280 280
			datum = new CRSDatum(eSemiMajorAxis,eIFlattening);
281
			
281

  
282 282
			// Crs base (en el caso de ser projectado):
283 283
			/*if(this.isProjected()){
284 284
				String proj4Base = "+proj=latlong +a=" + crsWkt.getSpheroid()[1] + " +rf=" + crsWkt.getSpheroid()[2] ;
......
286 286
			}*/
287 287
		}
288 288
	}
289
	
289

  
290 290
	/**
291 291
	 * Construye un CRS a partir del c?digo EPSG o de la cadena WKT.
292 292
	 * En el caso de WKT le a?ade a la cadena proj4 el string params.
293
	 * 
293
	 *
294 294
	 * @param epsg_cod
295 295
	 * @param code
296 296
	 * @param params
......
309 309
			try {
310 310
				//Creamos el objeto que tendra los diferentes parametros de la cadena Wkt
311 311
				crsWkt = new CrsWkt(fullCode);
312
				
312

  
313 313
				setName(fullCode);
314 314
				setAbrev(fullCode);
315
				
315

  
316 316
			} catch (NumberFormatException e) {
317 317
				logger.error("Can't get Wkt.",e);
318 318
			}
......
328 328
				}
329 329
			}
330 330
			crsWkt = new CrsWkt(code2);
331
	    	
331

  
332 332
    		setName(fullCode);
333 333
    		//setAbrev(crsWkt.getName());
334 334
    		setAbrev(crsWkt.getAuthority()[0]+":"+crsWkt.getAuthority()[1]);
335
	    	
335

  
336 336
		}
337 337
		//	Asignar el datum:
338 338
		if (!(crsWkt.getSpheroid()[1].equals("")||crsWkt.getSpheroid()[2].equals(""))){
339 339
			double eSemiMajorAxis = Double.valueOf(crsWkt.getSpheroid()[1]).doubleValue();
340 340
			double eIFlattening = Double.valueOf(crsWkt.getSpheroid()[2]).doubleValue();
341 341
			datum = new CRSDatum(eSemiMajorAxis,eIFlattening);
342
			
342

  
343 343
			// Crs base (en el caso de ser projectado):
344 344
			/*if(this.isProjected()){
345 345
				String proj4Base = "+proj=latlong +a=" + crsWkt.getSpheroid()[1] + " +rf=" + crsWkt.getSpheroid()[2] ;
......
347 347
			}*/
348 348
		}
349 349
	}
350
		
350

  
351 351
/*	public Crs(CrsEpsg source) throws CrsException {
352 352
		crsProj4 = source;
353 353
	}*/
354
	
354

  
355 355
	/**
356
	 * @param code 
356
	 * @param code
357 357
	 */
358 358
	public void setTrans(String code) {
359 359
		trans = code;
360 360
		changeTrans(trans);
361 361
	}
362
	
362

  
363 363
	/**
364
	 * 
364
	 *
365 365
	 * @param code
366 366
	 */
367 367
	public void changeTrans(String code) {
368 368
		getCrsProj().changeStrCrs(code);
369 369
	}
370
	
370

  
371 371
	/**
372
	 * 
372
	 *
373 373
	 */
374 374
	public String getAbrev() {
375 375
		return abrev;
376 376
	}
377
	
377

  
378 378
	/**
379
	 * 
379
	 *
380 380
	 * @param code
381 381
	 */
382 382
	protected void setAbrev(String code) {
383 383
		abrev = code;
384 384
	}
385
	
385

  
386 386
	/**
387
	 * 
387
	 *
388 388
	 * @param nom
389 389
	 */
390 390
	public void setName(String nom) {
391 391
		name = nom;
392 392
	}
393
	
393

  
394 394
	/**
395 395
	 * @return
396 396
	 */
397 397
	public IDatum getDatum() {
398
		
398

  
399 399
		return datum;
400 400
	}
401
	
401

  
402 402
	/**
403 403
	 * @return
404 404
	 */
405 405
	public CrsWkt getCrsWkt() {
406 406
		return crsWkt;
407 407
	}
408
	
408

  
409 409
	/**
410
	 * 
410
	 *
411 411
	 * @param wkt
412 412
	 */
413 413
	public void setWKT(String wkt){
414 414
		this.wkt = wkt;
415 415
	}
416
	
416

  
417 417
	/**
418 418
	 * @return
419 419
	 */
420 420
	public String getWKT(){
421 421
		return this.wkt;
422 422
	}
423
	
423

  
424 424
	/**
425
	 * 
425
	 *
426 426
	 * @param params
427 427
	 */
428 428
	public void setTransformationParams(String sourceParams, String targetParams){
429 429
		this.sourceTrParams = sourceParams;
430 430
		this.targetTrParams = targetParams;
431 431
	}
432
	
432

  
433 433
	/**
434 434
	 * Devuelve los parametros de la transformacion del crs fuente
435 435
	 * @return
......
437 437
	public String getSourceTransformationParams() {
438 438
		return this.sourceTrParams;
439 439
	}
440
	
440

  
441 441
	/**
442 442
	 * Devuelve los parametros de la transformacion del crs destino
443 443
	 * @return
......
445 445
	public String getTargetTransformationParams() {
446 446
		return this.targetTrParams;
447 447
	}
448
	
448

  
449 449
	/**
450 450
	 * @return
451 451
	 */
452 452
	public String getTransformationParams(){
453 453
		return this.sourceTrParams;
454 454
	}
455
		
455

  
456 456
	/**
457
	 * 
457
	 *
458 458
	 * @return
459 459
	 */
460 460
	public CrsProj getCrsProj() {
......
463 463
				crsProj = new CrsProj(getProj4String());
464 464
			} catch (CrsException e) {
465 465
				logger.error("Can't get proj4 string.",e);
466
			} 
466
			}
467 467
		return crsProj;
468 468
	}
469 469

  
......
482 482
	 */
483 483
	public void drawGrid(Graphics2D g, ViewPortData vp) {
484 484
		// TODO Auto-generated method stub
485
		
485

  
486 486
	}
487 487

  
488 488
	/**
......
504 504
	 * @return
505 505
	 */
506 506
	public ICoordTrans getCT(IProjection dest) {
507
		
508
		
507

  
508

  
509 509
		try {
510 510
			if (dest == this)
511 511
				return null;
512 512
			COperation operation = null;
513
			if(((ICrs)dest).getSourceTransformationParams() != null || ((ICrs)dest).getTargetTransformationParams() != null) 
513
			if(((ICrs)dest).getSourceTransformationParams() != null || ((ICrs)dest).getTargetTransformationParams() != null)
514 514
				operation = new COperation(this, (ICrs)dest,((ICrs)dest).getTargetTransformationParams(),((ICrs)dest).getSourceTransformationParams());
515 515
			else
516 516
				operation = new COperation(this, (ICrs)dest,sourceTrParams,targetTrParams);
......
519 519
			logger.error("Can't get CoordTrans.",e);
520 520
			return null;
521 521
		}
522
		
522

  
523 523
		/*
524 524
		try {
525 525
			operation = new COperation(this, (ICrs)dest);
......
527 527
			// TODO Auto-generated catch block
528 528
			logger....
529 529
		}
530
		
530

  
531 531
		if (getTransformationParams()!=null){
532 532
			if (isTargetParams())
533 533
				operation.setParamsCrsProj(new CrsProj(crsDest.getProj4String()+getTransformationParams()), true);
534 534
			else
535 535
				operation.setParamsCrsProj(new CrsProj(getProj4String()+getTransformationParams()), false);
536
			
536

  
537 537
			return operation;
538 538
		}
539
		
540
		return operation;	*/	
539

  
540
		return operation;	*/
541 541
	}
542
	
542

  
543 543
	/**
544 544
	 * @param pt
545 545
	 * @return
......
550 550
			double y[] = {pt.getY()};
551 551
			double z[] = {0D};
552 552
			try {
553
				JNIBaseCrs.operate( x , y, z,
553
			    CrsProj.operate( x , y, z,
554 554
						getCrsProj(),crsBase);
555 555
			} catch (OperationCrsException e) {
556 556
				logger.error("Can't convert point to geo.",e);
......
575 575
	 * @return
576 576
	 */
577 577
	public boolean isProjected() {
578
		return !getCrsProj().isLatlong();		
578
		return !getCrsProj().isLatlong();
579 579
	}
580 580

  
581 581
	/**
......
602 602
//        }
603 603
        return scale;
604 604
	}
605
	
605

  
606 606
	public double getScale(double minX, double maxX, double minY, double maxY, double width, double dpi) {
607
		
607

  
608 608
		double scale = 0D;
609 609
		double incX = (maxX-minX);
610
		
610

  
611 611
		if (!isProjected()) {
612 612
			double a = getDatum().getESemiMajorAxis();
613 613
			double invF = getDatum().getEIFlattening();
614 614
			double meanY = (minY+maxY)/2.0;
615 615
			double radius = 0.0;
616
			
617
			
616

  
617

  
618 618
			if (invF == Double.POSITIVE_INFINITY){
619 619
				radius = a;
620 620
			}
......
624 624
			}
625 625
			incX *= Math.PI/180.0*radius;
626 626
		}
627
			
627

  
628 628
		scale = (incX * // metros
629 629
				(dpi / 2.54 * 100.0)) / // px / metro
630 630
					width; // pixels
631
		
631

  
632 632
        return scale;
633 633
	}
634
	
634

  
635 635
	/**
636
	 * 
636
	 *
637 637
	 * @param epsg_cod
638 638
	 */
639 639
	public void setCode(int epsg_cod){
......
657 657
			sourceParams = sourceTrParams;
658 658
		if (targetTrParams != null)
659 659
			targetParams = targetTrParams;
660
		
660

  
661 661
		return getAbrev()+":proj@"+sourceParams+"@"+targetParams;
662 662
	}
663 663

  
......
686 686
		Rectangle2D rec=new Rectangle2D.Double(xExtent,yExtent,wExtent,hExtent);
687 687
    	return  rec;
688 688
    }
689
   
689

  
690 690
	private Proj4 getProj4() {
691 691
		if (proj4 == null)
692 692
			try {
......
696 696
			}
697 697
		return proj4;
698 698
	}
699
	
700
	/** 
701
	 * 
699

  
700
	/**
701
	 *
702 702
	 * @return Cadena proj4 Correspondiente al CRS.
703
	 * @throws CrsException 
703
	 * @throws CrsException
704 704
	 */
705 705
	public String getProj4String() throws CrsException {
706 706
		if (proj4String == null)
707
			proj4String = getProj4().exportToProj4(this);			
707
			proj4String = getProj4().exportToProj4(this);
708 708
		return proj4String;
709 709
	}
710
	
710

  
711 711
	public Object clone() throws CloneNotSupportedException {
712 712
	       return CRSFactory.getCRS( this.getFullCode() );
713 713
	    }
714 714

  
715 715
        public String toString() {
716
            return MessageFormat.format("{0}({1},{2})", new Object[] { 
716
            return MessageFormat.format("{0}({1},{2})", new Object[] {
717 717
                this.getClass().getName(),
718 718
                this.hashCode(),
719 719
                this.getFullCode()

Also available in: Unified diff