/*
 * Licensed Materials - Property of Rogue Wave Software, Inc. 
 * © Copyright Rogue Wave Software, Inc. 2014, 2015 
 * © Copyright IBM Corp. 2009, 2014
 * © Copyright ILOG 1996, 2009
 * All Rights Reserved.
 *
 * Note to U.S. Government Users Restricted Rights:
 * The Software and Documentation were developed at private expense and
 * are "Commercial Items" as that term is defined at 48 CFR 2.101,
 * consisting of "Commercial Computer Software" and
 * "Commercial Computer Software Documentation", as such terms are
 * used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4,
 * as applicable.
 */

import ilog.views.maps.IlvAngularUnit;
import ilog.views.maps.IlvCoordinate;
import ilog.views.maps.IlvLinearUnit;
import ilog.views.maps.projection.IlvMercatorProjection;
import ilog.views.maps.srs.coordsys.IlvCoordinateSystem;
import ilog.views.maps.srs.coordsys.IlvGeographicCoordinateSystem;
import ilog.views.maps.srs.coordsys.IlvProjectedCoordinateSystem;
import ilog.views.maps.srs.coordtrans.IlvCoordinateTransformation;
import ilog.views.maps.srs.coordtrans.IlvCoordinateTransformationException;
import ilog.views.util.IlvProductUtil;

/**
 * This is a very simple sample code showing how to convert coordinates
 * between two coordinate systems.
 * Basically, we will convert between geographic coordinates (lat,lon) and
 * some projected coordinates (here, to a Mercator projection coordinate
 * system).
 */
public class Sample1
{
  static public void main(String argv[])
  {
    // This sample uses JViews Maps features. When deploying an
    // application that includes this code, you need to be in possession
    // of a Rogue Wave JViews Maps Deployment license.
    IlvProductUtil.DeploymentLicenseRequired(
        IlvProductUtil.JViews_Maps_Deployment);

    // The source coordinate system : the default geographic one is ok.
    IlvCoordinateSystem sourceCS = IlvGeographicCoordinateSystem.WGS84;

    // The target coordinate system : a projected coordinate system with
    // a mercator projection
    IlvCoordinateSystem targetCS = 
      new IlvProjectedCoordinateSystem("Mercator",
                                       IlvGeographicCoordinateSystem.WGS84,
                                       new IlvMercatorProjection(),
                                       IlvLinearUnit.METER,
                                       "X",   // The X axis name
                                       "Y");  // The Y axis name
    
    // The coordinate to convert : 45W, 30N
    IlvCoordinate coord = new IlvCoordinate(-45D, 30D);
   
    // The transformation
    IlvCoordinateTransformation CT =
      IlvCoordinateTransformation.CreateTransformation(sourceCS,
                                                       targetCS);

    // Transform a point
    try {
      coord = CT.transform(coord,
                           coord); // put the result in coord
    }
    catch (IlvCoordinateTransformationException e) {
      System.out.println("Transformation exception for this data");
    }
    
    System.out.println("The Mercator coordinates of 45W 30N is ");
    System.out.println("x = " + (int) coord.x + " m");
    System.out.println("y = " + (int) coord.y + " m");

    // Get the inverse transformation
    IlvCoordinateTransformation invCT = CT.getInverse();

    // Transform the point
    try {
      coord = invCT.transform(coord,
                              coord); // put the result in coord
    }
    catch (IlvCoordinateTransformationException e) {
      System.out.println("TransformationException exception for this data");
    }
    
    System.out.println("The inverse projection is " 
                       + IlvAngularUnit.DEGREE.toDMS(coord.x,false) 
                       + " "
                       + IlvAngularUnit.DEGREE.toDMS(coord.y,true));

  }
  
}