001 //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/crs/configuration/deegree/CRSExporter.java $ 002 /*---------------------------------------------------------------------------- 003 This file is part of deegree, http://deegree.org/ 004 Copyright (C) 2001-2009 by: 005 Department of Geography, University of Bonn 006 and 007 lat/lon GmbH 008 009 This library is free software; you can redistribute it and/or modify it under 010 the terms of the GNU Lesser General Public License as published by the Free 011 Software Foundation; either version 2.1 of the License, or (at your option) 012 any later version. 013 This library is distributed in the hope that it will be useful, but WITHOUT 014 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 015 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 016 details. 017 You should have received a copy of the GNU Lesser General Public License 018 along with this library; if not, write to the Free Software Foundation, Inc., 019 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 020 021 Contact information: 022 023 lat/lon GmbH 024 Aennchenstr. 19, 53177 Bonn 025 Germany 026 http://lat-lon.de/ 027 028 Department of Geography, University of Bonn 029 Prof. Dr. Klaus Greve 030 Postfach 1147, 53001 Bonn 031 Germany 032 http://www.geographie.uni-bonn.de/deegree/ 033 034 e-mail: info@deegree.org 035 ----------------------------------------------------------------------------*/ 036 037 package org.deegree.crs.configuration.deegree; 038 039 import static org.deegree.crs.projections.ProjectionUtils.EPS11; 040 import static org.deegree.ogcbase.CommonNamespaces.CRSNS; 041 042 import java.io.Writer; 043 import java.net.MalformedURLException; 044 import java.util.LinkedList; 045 import java.util.List; 046 import java.util.Properties; 047 048 import javax.xml.transform.TransformerException; 049 050 import org.deegree.crs.Identifiable; 051 import org.deegree.crs.components.Axis; 052 import org.deegree.crs.components.Ellipsoid; 053 import org.deegree.crs.components.GeodeticDatum; 054 import org.deegree.crs.components.PrimeMeridian; 055 import org.deegree.crs.components.Unit; 056 import org.deegree.crs.coordinatesystems.CompoundCRS; 057 import org.deegree.crs.coordinatesystems.CoordinateSystem; 058 import org.deegree.crs.coordinatesystems.GeocentricCRS; 059 import org.deegree.crs.coordinatesystems.GeographicCRS; 060 import org.deegree.crs.coordinatesystems.ProjectedCRS; 061 import org.deegree.crs.projections.Projection; 062 import org.deegree.crs.projections.azimuthal.StereographicAzimuthal; 063 import org.deegree.crs.projections.conic.LambertConformalConic; 064 import org.deegree.crs.projections.cylindric.TransverseMercator; 065 import org.deegree.crs.transformations.helmert.Helmert; 066 import org.deegree.crs.transformations.polynomial.PolynomialTransformation; 067 import org.deegree.datatypes.QualifiedName; 068 import org.deegree.framework.log.ILogger; 069 import org.deegree.framework.log.LoggerFactory; 070 import org.deegree.framework.xml.NamespaceContext; 071 import org.deegree.framework.xml.XMLFragment; 072 import org.deegree.framework.xml.XMLParsingException; 073 import org.deegree.framework.xml.XMLTools; 074 import org.deegree.ogcbase.CommonNamespaces; 075 import org.w3c.dom.Document; 076 import org.w3c.dom.Element; 077 078 /** 079 * The <code>CRSExporter</code> exports to the old version format (no version attribute). 080 * 081 * @author <a href="mailto:bezema@lat-lon.de">Rutger Bezema</a> 082 * 083 * @author last edited by: $Author: mschneider $ 084 * 085 * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $ 086 * 087 */ 088 public class CRSExporter { 089 090 private static ILogger LOG = LoggerFactory.getLogger( CRSExporter.class ); 091 092 /** 093 * The namespaces used in deegree. 094 */ 095 private static NamespaceContext nsContext = CommonNamespaces.getNamespaceContext(); 096 097 /** 098 * The prefix to use. 099 */ 100 private final static String PRE = CommonNamespaces.CRS_PREFIX + ":"; 101 102 /** 103 * 104 * @param properties 105 * to read configuration from. 106 */ 107 public CRSExporter( Properties properties ) { 108 // nothing yet. 109 } 110 111 /** 112 * Export the given list of CoordinateSystems into the crs-definition format. 113 * 114 * @param writer 115 * @param crsToExport 116 */ 117 public void export( Writer writer, List<CoordinateSystem> crsToExport ) { 118 if ( crsToExport != null ) { 119 if ( crsToExport.size() != 0 ) { 120 LOG.logDebug( "Trying to export: " + crsToExport.size() + " coordinate systems." ); 121 XMLFragment frag = new XMLFragment( new QualifiedName( "crs", "definitions", CommonNamespaces.CRSNS ) ); 122 Element root = frag.getRootElement(); 123 LinkedList<String> exportedIDs = new LinkedList<String>(); 124 for ( CoordinateSystem crs : crsToExport ) { 125 if ( crs.getType() == CoordinateSystem.GEOCENTRIC_CRS ) { 126 export( (GeocentricCRS) crs, root, exportedIDs ); 127 } else if ( crs.getType() == CoordinateSystem.GEOGRAPHIC_CRS ) { 128 export( (GeographicCRS) crs, root, exportedIDs ); 129 } else if ( crs.getType() == CoordinateSystem.PROJECTED_CRS ) { 130 export( (ProjectedCRS) crs, root, exportedIDs ); 131 } else if ( crs.getType() == CoordinateSystem.COMPOUND_CRS ) { 132 export( (CompoundCRS) crs, root, exportedIDs ); 133 } 134 } 135 root.normalize(); 136 Document validDoc = createValidDocument( root ); 137 try { 138 XMLFragment frag2 = new XMLFragment( validDoc, "http://www.deegree.org/crs" ); 139 frag2.prettyPrint( writer ); 140 } catch ( MalformedURLException e ) { 141 LOG.logError( "Could not export crs definitions because: " + e.getMessage(), e ); 142 } catch ( TransformerException e ) { 143 LOG.logError( "Could not export crs definitions because: " + e.getMessage(), e ); 144 } 145 } else { 146 LOG.logWarning( "No coordinate system were given (list.size() == 0)." ); 147 } 148 } else { 149 LOG.logError( "No coordinate system were given (list == null)." ); 150 } 151 } 152 153 /** 154 * Export the projected CRS to it's appropriate deegree-crs-definitions form. 155 * 156 * @param projectedCRS 157 * to be exported 158 * @param rootNode 159 * to export the projected CRS to. 160 * @param exportedIds 161 * a list of id's already exported. 162 */ 163 private void export( ProjectedCRS projectedCRS, Element rootNode, List<String> exportedIds ) { 164 if ( !exportedIds.contains( projectedCRS.getIdentifier() ) ) { 165 Element crsElement = XMLTools.appendElement( rootNode, CommonNamespaces.CRSNS, PRE + "projectedCRS" ); 166 exportAbstractCRS( projectedCRS, crsElement ); 167 GeographicCRS underLyingCRS = projectedCRS.getGeographicCRS(); 168 export( underLyingCRS, rootNode, exportedIds ); 169 170 // Add a reference from the geographicCRS element to the projectedCRS element. 171 XMLTools.appendElement( crsElement, CommonNamespaces.CRSNS, PRE + "usedGeographicCRS", 172 underLyingCRS.getIdentifier() ); 173 174 export( projectedCRS.getProjection(), crsElement ); 175 176 // Add the ids to the exportedID list. 177 for ( String eID : projectedCRS.getIdentifiers() ) { 178 exportedIds.add( eID ); 179 } 180 // finally add the crs node to the rootnode. 181 rootNode.appendChild( crsElement ); 182 } 183 } 184 185 /** 186 * Export the geocentric/geographic CRS to it's appropriate deegree-crs-definitions form. 187 * 188 * @param geographicCRS 189 * to be exported 190 * @param rootNode 191 * to export the geographic CRS to. 192 * @param exportedIds 193 * a list of id's already exported. 194 */ 195 private void export( GeographicCRS geographicCRS, Element rootNode, List<String> exportedIds ) { 196 if ( !exportedIds.contains( geographicCRS.getIdentifier() ) ) { 197 Element crsElement = XMLTools.appendElement( rootNode, CommonNamespaces.CRSNS, PRE + "geographicCRS" ); 198 exportAbstractCRS( geographicCRS, crsElement ); 199 200 // export the datum. 201 GeodeticDatum datum = geographicCRS.getGeodeticDatum(); 202 if ( datum != null ) { 203 export( datum, rootNode, exportedIds ); 204 // Add a reference from the datum element to the geographic element. 205 XMLTools.appendElement( crsElement, CommonNamespaces.CRSNS, PRE + "usedDatum", datum.getIdentifier() ); 206 } else { 207 LOG.logError( "The given datum is not a geodetic one, this mey not be!" ); 208 } 209 // Add the ids to the exportedID list. 210 for ( String eID : geographicCRS.getIdentifiers() ) { 211 exportedIds.add( eID ); 212 } 213 // finally add the crs node to the rootnode. 214 rootNode.appendChild( crsElement ); 215 } 216 } 217 218 /** 219 * Export the compoundCRS to it's appropriate deegree-crs-definitions form. 220 * 221 * @param compoundCRS 222 * to be exported 223 * @param rootNode 224 * to export the geographic CRS to. 225 * @param exportedIds 226 * a list of id's already exported. 227 */ 228 private void export( CompoundCRS compoundCRS, Element rootNode, List<String> exportedIds ) { 229 if ( !exportedIds.contains( compoundCRS.getIdentifier() ) ) { 230 Element crsElement = XMLTools.appendElement( rootNode, CommonNamespaces.CRSNS, PRE + "compoundCRS" ); 231 exportIdentifiable( compoundCRS, crsElement ); 232 CoordinateSystem underLyingCRS = compoundCRS.getUnderlyingCRS(); 233 if ( underLyingCRS.getType() == CoordinateSystem.GEOGRAPHIC_CRS ) { 234 export( (GeographicCRS) underLyingCRS, rootNode, exportedIds ); 235 } else if ( underLyingCRS.getType() == CoordinateSystem.PROJECTED_CRS ) { 236 export( (ProjectedCRS) underLyingCRS, rootNode, exportedIds ); 237 } 238 239 // Add a reference from the geographicCRS element to the projectedCRS element. 240 XMLTools.appendElement( crsElement, CommonNamespaces.CRSNS, PRE + "usedCRS", underLyingCRS.getIdentifier() ); 241 export( compoundCRS.getHeightAxis(), crsElement ); 242 243 XMLTools.appendElement( crsElement, CommonNamespaces.CRSNS, PRE + "defaultHeight", 244 Double.toString( compoundCRS.getDefaultHeight() ) ); 245 246 // Add the ids to the exportedID list. 247 for ( String eID : compoundCRS.getIdentifiers() ) { 248 exportedIds.add( eID ); 249 } 250 // finally add the crs node to the rootnode. 251 rootNode.appendChild( crsElement ); 252 } 253 } 254 255 /** 256 * Export the projection to it's appropriate deegree-crs-definitions form. 257 * 258 * @param projection 259 * to be exported 260 * @param rootNode 261 * to export the projection to. 262 */ 263 private void export( Projection projection, Element rootNode ) { 264 Element rootElem = XMLTools.appendElement( rootNode, CommonNamespaces.CRSNS, PRE + "projection" ); 265 String elementName = projection.getImplementationName(); 266 Element projectionElement = XMLTools.appendElement( rootElem, CommonNamespaces.CRSNS, PRE + elementName ); 267 // exportIdentifiable( projection, projectionElement ); 268 Element tmp = XMLTools.appendElement( projectionElement, CommonNamespaces.CRSNS, PRE 269 + "latitudeOfNaturalOrigin", 270 Double.toString( Math.toDegrees( projection.getProjectionLatitude() ) ) ); 271 tmp.setAttribute( "inDegrees", "true" ); 272 tmp = XMLTools.appendElement( projectionElement, CommonNamespaces.CRSNS, PRE + "longitudeOfNaturalOrigin", 273 Double.toString( Math.toDegrees( projection.getProjectionLongitude() ) ) ); 274 tmp.setAttribute( "inDegrees", "true" ); 275 276 XMLTools.appendElement( projectionElement, CommonNamespaces.CRSNS, PRE + "scaleFactor", 277 Double.toString( projection.getScale() ) ); 278 XMLTools.appendElement( projectionElement, CommonNamespaces.CRSNS, PRE + "falseEasting", 279 Double.toString( projection.getFalseEasting() ) ); 280 XMLTools.appendElement( projectionElement, CommonNamespaces.CRSNS, PRE + "falseNorthing", 281 Double.toString( projection.getFalseNorthing() ) ); 282 if ( "transverseMercator".equalsIgnoreCase( elementName ) ) { 283 XMLTools.appendElement( projectionElement, CommonNamespaces.CRSNS, PRE + "northernHemisphere", 284 Boolean.toString( ( (TransverseMercator) projection ).getHemisphere() ) ); 285 } else if ( "lambertConformalConic".equalsIgnoreCase( elementName ) ) { 286 double paralellLatitude = ( (LambertConformalConic) projection ).getFirstParallelLatitude(); 287 if ( !Double.isNaN( paralellLatitude ) && Math.abs( paralellLatitude ) > EPS11 ) { 288 paralellLatitude = Math.toDegrees( paralellLatitude ); 289 tmp = XMLTools.appendElement( projectionElement, CommonNamespaces.CRSNS, PRE + "firstParallelLatitude", 290 Double.toString( paralellLatitude ) ); 291 tmp.setAttribute( "inDegrees", "true" ); 292 } 293 paralellLatitude = ( (LambertConformalConic) projection ).getSecondParallelLatitude(); 294 if ( !Double.isNaN( paralellLatitude ) && Math.abs( paralellLatitude ) > EPS11 ) { 295 paralellLatitude = Math.toDegrees( paralellLatitude ); 296 tmp = XMLTools.appendElement( projectionElement, CommonNamespaces.CRSNS, 297 PRE + "secondParallelLatitude", Double.toString( paralellLatitude ) ); 298 tmp.setAttribute( "inDegrees", "true" ); 299 } 300 } else if ( "stereographicAzimuthal".equalsIgnoreCase( elementName ) ) { 301 tmp = XMLTools.appendElement( 302 projectionElement, 303 CommonNamespaces.CRSNS, 304 PRE + "trueScaleLatitude", 305 Double.toString( ( (StereographicAzimuthal) projection ).getTrueScaleLatitude() ) ); 306 tmp.setAttribute( "inDegrees", "true" ); 307 } 308 } 309 310 /** 311 * Export the confInvo to it's appropriate deegree-crs-definitions form. 312 * 313 * @param confInvo 314 * to be exported 315 * @param rootNode 316 * to export the confInvo to. 317 * @param exportedIds 318 * a list of id's already exported. 319 */ 320 private void export( Helmert confInvo, Element rootNode, final List<String> exportedIds ) { 321 if ( !exportedIds.contains( confInvo.getIdentifier() ) ) { 322 Element convElement = XMLTools.appendElement( rootNode, CommonNamespaces.CRSNS, PRE + "wgs84Transformation" ); 323 exportIdentifiable( confInvo, convElement ); 324 325 XMLTools.appendElement( convElement, CommonNamespaces.CRSNS, PRE + "xAxisTranslation", 326 Double.toString( confInvo.dx ) ); 327 XMLTools.appendElement( convElement, CommonNamespaces.CRSNS, PRE + "yAxisTranslation", 328 Double.toString( confInvo.dy ) ); 329 XMLTools.appendElement( convElement, CommonNamespaces.CRSNS, PRE + "zAxisTranslation", 330 Double.toString( confInvo.dz ) ); 331 XMLTools.appendElement( convElement, CommonNamespaces.CRSNS, PRE + "xAxisRotation", 332 Double.toString( confInvo.ex ) ); 333 XMLTools.appendElement( convElement, CommonNamespaces.CRSNS, PRE + "yAxisRotation", 334 Double.toString( confInvo.ey ) ); 335 XMLTools.appendElement( convElement, CommonNamespaces.CRSNS, PRE + "zAxisRotation", 336 Double.toString( confInvo.ez ) ); 337 XMLTools.appendElement( convElement, CommonNamespaces.CRSNS, PRE + "scaleDifference", 338 Double.toString( confInvo.ppm ) ); 339 340 // Add the ids to the exportedID list. 341 for ( String eID : confInvo.getIdentifiers() ) { 342 exportedIds.add( eID ); 343 } 344 345 // finally add the WGS84-Transformation node to the rootnode. 346 rootNode.appendChild( convElement ); 347 } 348 349 } 350 351 /** 352 * Export the PrimeMeridian to it's appropriate deegree-crs-definitions form. 353 * 354 * @param pMeridian 355 * to be exported 356 * @param rootNode 357 * to export the pMeridian to. 358 * @param exportedIds 359 * a list of id's already exported. 360 */ 361 private void export( PrimeMeridian pMeridian, Element rootNode, final List<String> exportedIds ) { 362 if ( !exportedIds.contains( pMeridian.getIdentifier() ) ) { 363 Element meridianElement = XMLTools.appendElement( rootNode, CommonNamespaces.CRSNS, PRE + "primeMeridian" ); 364 exportIdentifiable( pMeridian, meridianElement ); 365 export( pMeridian.getAngularUnit(), meridianElement ); 366 XMLTools.appendElement( meridianElement, CommonNamespaces.CRSNS, PRE + "longitude", 367 Double.toString( pMeridian.getLongitude() ) ); 368 369 // Add the ids to the exportedID list. 370 for ( String eID : pMeridian.getIdentifiers() ) { 371 exportedIds.add( eID ); 372 } 373 374 // finally add the prime meridian node to the rootnode. 375 rootNode.appendChild( meridianElement ); 376 } 377 } 378 379 /** 380 * Export the ellipsoid to it's appropriate deegree-crs-definitions form. 381 * 382 * @param ellipsoid 383 * to be exported 384 * @param rootNode 385 * to export the ellipsoid to. 386 * @param exportedIds 387 * a list of id's already exported. 388 */ 389 private void export( Ellipsoid ellipsoid, Element rootNode, final List<String> exportedIds ) { 390 if ( !exportedIds.contains( ellipsoid.getIdentifier() ) ) { 391 Element ellipsoidElement = XMLTools.appendElement( rootNode, CommonNamespaces.CRSNS, PRE + "ellipsoid" ); 392 exportIdentifiable( ellipsoid, ellipsoidElement ); 393 XMLTools.appendElement( ellipsoidElement, CommonNamespaces.CRSNS, PRE + "semiMajorAxis", 394 Double.toString( ellipsoid.getSemiMajorAxis() ) ); 395 XMLTools.appendElement( ellipsoidElement, CommonNamespaces.CRSNS, PRE + "inverseFlatting", 396 Double.toString( ellipsoid.getInverseFlattening() ) ); 397 export( ellipsoid.getUnits(), ellipsoidElement ); 398 399 // Add the ids to the exportedID list. 400 for ( String eID : ellipsoid.getIdentifiers() ) { 401 exportedIds.add( eID ); 402 } 403 // finally add the ellipsoid node to the rootnode. 404 rootNode.appendChild( ellipsoidElement ); 405 } 406 } 407 408 /** 409 * Export the datum to it's appropriate deegree-crs-definitions form. 410 * 411 * @param datum 412 * to be exported 413 * @param rootNode 414 * to export the datum to. 415 * @param exportedIds 416 * a list of id's already exported. 417 */ 418 private void export( GeodeticDatum datum, Element rootNode, List<String> exportedIds ) { 419 if ( !exportedIds.contains( datum.getIdentifier() ) ) { 420 Element datumElement = XMLTools.appendElement( rootNode, CommonNamespaces.CRSNS, PRE + "geodeticDatum" ); 421 exportIdentifiable( datum, datumElement ); 422 /** 423 * EXPORT the ELLIPSOID 424 */ 425 Ellipsoid ellipsoid = datum.getEllipsoid(); 426 if ( ellipsoid != null ) { 427 export( ellipsoid, rootNode, exportedIds ); 428 // Add a reference from the ellipsoid element to the datum element. 429 XMLTools.appendElement( datumElement, CommonNamespaces.CRSNS, PRE + "usedEllipsoid", 430 ellipsoid.getIdentifier() ); 431 } 432 433 /** 434 * EXPORT the PRIME_MERIDIAN 435 */ 436 PrimeMeridian pMeridian = datum.getPrimeMeridian(); 437 if ( pMeridian != null ) { 438 export( pMeridian, rootNode, exportedIds ); 439 // Add a reference from the prime meridian element to the datum element. 440 XMLTools.appendElement( datumElement, CommonNamespaces.CRSNS, PRE + "usedPrimeMeridian", 441 pMeridian.getIdentifier() ); 442 } 443 444 /** 445 * EXPORT the WGS-84-Conversion INFO 446 */ 447 Helmert confInvo = datum.getWGS84Conversion(); 448 if ( confInvo != null ) { 449 export( confInvo, rootNode, exportedIds ); 450 // Add a reference from the prime meridian element to the datum element. 451 XMLTools.appendElement( datumElement, CommonNamespaces.CRSNS, PRE + "usedWGS84ConversionInfo", 452 confInvo.getIdentifier() ); 453 } 454 455 // Add the ids to the exportedID list. 456 for ( String eID : datum.getIdentifiers() ) { 457 exportedIds.add( eID ); 458 } 459 // finally add the datum node to the rootnode. 460 rootNode.appendChild( datumElement ); 461 } 462 } 463 464 /** 465 * Export toplevel crs features. 466 * 467 * @param crs 468 * to be exported 469 * @param crsElement 470 * to export to 471 */ 472 private void exportAbstractCRS( CoordinateSystem crs, Element crsElement ) { 473 exportIdentifiable( crs, crsElement ); 474 Axis[] axis = crs.getAxis(); 475 StringBuilder axisOrder = new StringBuilder( 200 ); 476 for ( int i = 0; i < axis.length; ++i ) { 477 Axis a = axis[i]; 478 export( a, crsElement ); 479 axisOrder.append( a.getName() ); 480 if ( ( i + 1 ) < axis.length ) { 481 axisOrder.append( ", " ); 482 } 483 } 484 XMLTools.appendElement( crsElement, CommonNamespaces.CRSNS, PRE + "axisOrder", axisOrder.toString() ); 485 486 export( crs.getTransformations(), crsElement ); 487 488 } 489 490 /** 491 * Export the geocentric CRS to it's appropriate deegree-crs-definitions form. 492 * 493 * @param geocentricCRS 494 * to be exported 495 * @param rootNode 496 * to export the geocentric CRS to. 497 * @param exportedIds 498 * a list of id's already exported. 499 */ 500 private void export( GeocentricCRS geocentricCRS, Element rootNode, List<String> exportedIds ) { 501 if ( !exportedIds.contains( geocentricCRS.getIdentifier() ) ) { 502 Element crsElement = XMLTools.appendElement( rootNode, CommonNamespaces.CRSNS, PRE + "geocentricCRS" ); 503 exportAbstractCRS( geocentricCRS, crsElement ); 504 // export the datum. 505 GeodeticDatum datum = geocentricCRS.getGeodeticDatum(); 506 if ( datum != null ) { 507 export( datum, rootNode, exportedIds ); 508 // Add a reference from the datum element to the geocentric element. 509 XMLTools.appendElement( crsElement, CommonNamespaces.CRSNS, PRE + "usedDatum", datum.getIdentifier() ); 510 } // Add the ids to the exportedID list. 511 for ( String eID : geocentricCRS.getIdentifiers() ) { 512 exportedIds.add( eID ); 513 } 514 // finally add the crs node to the rootnode. 515 rootNode.appendChild( crsElement ); 516 } 517 } 518 519 /** 520 * Creates the basic nodes of the identifiable object. 521 * 522 * @param id 523 * object to be exported. 524 * @param currentNode 525 * to expand 526 */ 527 private void exportIdentifiable( Identifiable id, Element currentNode ) { 528 for ( String i : id.getIdentifiers() ) { 529 if ( i != null ) { 530 XMLTools.appendElement( currentNode, CommonNamespaces.CRSNS, PRE + "id", i ); 531 } 532 533 } 534 if ( id.getNames() != null && id.getNames().length > 0 ) { 535 for ( String i : id.getNames() ) { 536 if ( i != null ) { 537 XMLTools.appendElement( currentNode, CommonNamespaces.CRSNS, PRE + "name", i ); 538 } 539 } 540 } 541 if ( id.getVersions() != null && id.getVersions().length > 0 ) { 542 for ( String i : id.getVersions() ) { 543 if ( i != null ) { 544 XMLTools.appendElement( currentNode, CommonNamespaces.CRSNS, PRE + "version", i ); 545 } 546 } 547 } 548 if ( id.getDescriptions() != null && id.getDescriptions().length > 0 ) { 549 for ( String i : id.getDescriptions() ) { 550 if ( i != null ) { 551 XMLTools.appendElement( currentNode, CommonNamespaces.CRSNS, PRE + "description", i ); 552 } 553 } 554 } 555 if ( id.getAreasOfUse() != null && id.getAreasOfUse().length > 0 ) { 556 for ( String i : id.getAreasOfUse() ) { 557 if ( i != null ) { 558 XMLTools.appendElement( currentNode, CommonNamespaces.CRSNS, PRE + "areaOfUse", i ); 559 } 560 } 561 } 562 } 563 564 /** 565 * Export an axis to xml in the crs-definitions schema layout. 566 * 567 * @param axis 568 * to be exported. 569 * @param currentNode 570 * to export to. 571 */ 572 private void export( Axis axis, Element currentNode ) { 573 Document doc = currentNode.getOwnerDocument(); 574 Element axisElement = doc.createElementNS( CRSNS.toASCIIString(), PRE + "Axis" ); 575 // The name. 576 XMLTools.appendElement( axisElement, CommonNamespaces.CRSNS, PRE + "name", axis.getName() ); 577 578 // the units. 579 Unit units = axis.getUnits(); 580 export( units, axisElement ); 581 582 XMLTools.appendElement( axisElement, CommonNamespaces.CRSNS, PRE + "axisOrientation", 583 axis.getOrientationAsString() ); 584 currentNode.appendChild( axisElement ); 585 } 586 587 /** 588 * Export a list of transformations to the crs element to xml with respect to the crs-definitions schema layout. 589 * 590 * @param transformations 591 * to be exported. 592 * @param currentNode 593 * to export to. 594 */ 595 private void export( List<PolynomialTransformation> transformations, Element currentNode ) { 596 for ( PolynomialTransformation transformation : transformations ) { 597 Element transformationElement = XMLTools.appendElement( currentNode, CRSNS, PRE 598 + "polynomialTransformation" ); 599 if ( !"leastsquare".equals( transformation.getImplementationName().toLowerCase() ) ) { 600 transformationElement.setAttribute( "class", transformation.getClass().getCanonicalName() ); 601 } 602 Element transformElement = XMLTools.appendElement( transformationElement, CRSNS, 603 PRE + transformation.getImplementationName() ); 604 XMLTools.appendElement( transformElement, CRSNS, PRE + "polynomialOrder", 605 Integer.toString( transformation.getOrder() ) ); 606 XMLTools.appendElement( transformElement, CRSNS, PRE + "xParameters", 607 transformation.getFirstParams().toString() ); 608 XMLTools.appendElement( transformElement, CRSNS, PRE + "yParameters", 609 transformation.getSecondParams().toString() ); 610 XMLTools.appendElement( transformElement, CRSNS, PRE + "targetCRS", 611 transformation.getTargetCRS().getIdentifier() ); 612 } 613 } 614 615 /** 616 * Export a unit to xml in the crs-definitions schema layout. 617 * 618 * @param units 619 * to be exported. 620 * @param currentNode 621 * to export to. 622 */ 623 private void export( Unit units, Element currentNode ) { 624 if ( units != null && currentNode != null ) { 625 XMLTools.appendElement( currentNode, CommonNamespaces.CRSNS, PRE + "units", units.getName() ); 626 } 627 } 628 629 private Document createValidDocument( Element root ) { 630 // List<Element> lastInput = new LinkedList<Element>( 100 ); 631 try { 632 List<Element> valid = XMLTools.getElements( root, PRE + "ellipsoid", nsContext ); 633 valid.addAll( XMLTools.getElements( root, PRE + "geodeticDatum", nsContext ) ); 634 valid.addAll( XMLTools.getElements( root, PRE + "projectedCRS", nsContext ) ); 635 valid.addAll( XMLTools.getElements( root, PRE + "geographicCRS", nsContext ) ); 636 valid.addAll( XMLTools.getElements( root, PRE + "compoundCRS", nsContext ) ); 637 valid.addAll( XMLTools.getElements( root, PRE + "geocentricCRS", nsContext ) ); 638 valid.addAll( XMLTools.getElements( root, PRE + "primeMeridian", nsContext ) ); 639 valid.addAll( XMLTools.getElements( root, PRE + "wgs84Transformation", nsContext ) ); 640 Document doc = XMLTools.create(); 641 Element newRoot = doc.createElementNS( CommonNamespaces.CRSNS.toASCIIString(), PRE + "definitions" ); 642 newRoot = (Element) doc.importNode( newRoot, false ); 643 newRoot = (Element) doc.appendChild( newRoot ); 644 for ( int i = 0; i < valid.size(); ++i ) { 645 Element el = valid.get( i ); 646 el = (Element) doc.importNode( el, true ); 647 newRoot.appendChild( el ); 648 } 649 XMLTools.appendNSBinding( newRoot, CommonNamespaces.XSI_PREFIX, CommonNamespaces.XSINS ); 650 newRoot.setAttributeNS( 651 CommonNamespaces.XSINS.toASCIIString(), 652 "xsi:schemaLocation", 653 "http://www.deegree.org/crs c:/windows/profiles/rutger/EIGE~VO5/eclipse-projekte/coordinate_systems/resources/schema/crsdefinition.xsd" ); 654 return doc; 655 } catch ( XMLParsingException xmle ) { 656 xmle.printStackTrace(); 657 } 658 return root.getOwnerDocument(); 659 } 660 661 }