visad/src/main/java/ucar/nc2/iosp/grid/GridHorizCoordSys.java
private void makeRotatedLatLon(NetcdfFile ncfile) {

    double splat = gds.getDouble(GridDefRecord.SPLAT);
    double splon = gds.getDouble(GridDefRecord.SPLON);
    double spangle = gds.getDouble(GridDefRecord.ROTATIONANGLE);

    // Given projection coordinates, need LatLon coordinates
    proj = new RotatedLatLon(splat, splon, spangle);
    LatLonPoint startLL = proj.projToLatLon(
        new ProjectionPointImpl(
            gds.getDouble(GridDefRecord.LO1), gds.getDouble(GridDefRecord.LA1)));
    startx = startLL.getLongitude();
    starty = startLL.getLatitude();
    addCoordSystemVariable(ncfile, "latLonCoordSys", "time y x");

    // splat, splon, spangle
    attributes.add(new Attribute(GridCF.GRID_MAPPING_NAME, "rotated_latlon_grib"));
    attributes.add(new Attribute("grid_south_pole_latitude", splat));
    attributes.add(new Attribute("grid_south_pole_longitude", splon));
    attributes.add(new Attribute("grid_south_pole_angle", spangle));

    if (GridServiceProvider.debugProj) {
      System.out.println("Location of pole of rotated grid:");
      System.out.println("Lon=" + splon + ", Lat=" + splat);
      System.out.println("Axial rotation about pole of rotated grid:" + spangle);

      System.out.println("Location of LL in rotated grid:");
      System.out.println("Lon=" + gds.getDouble(GridDefRecord.LO1) + ", " +
          "Lat=" + gds.getDouble(GridDefRecord.LA1));
      System.out.println("Location of LL in non-rotated grid:");
      System.out.println("Lon=" + startx + ", Lat=" + starty);

      double Lo2 = gds.getDouble(GridDefRecord.LO2);
      double La2 = gds.getDouble(GridDefRecord.LA2);
      System.out.println("Location of UR in rotated grid:");
      System.out.println("Lon=" + Lo2 + ", Lat=" + La2);
      System.out.println("Location of UR in non-rotated grid:");
      LatLonPoint endUR = proj.projToLatLon(new ProjectionPointImpl(Lo2, La2));
      System.out.println("Lon=" + endUR.getLongitude() + ", Lat=" + endUR.getLatitude());

      double dy = (La2 < gds.getDouble(GridDefRecord.LA1)) ?
          -gds.getDouble(GridDefRecord.DY) : gds.getDouble(GridDefRecord.DY);
      double endx = gds.getDouble(GridDefRecord.LO1) + (getNx() - 1) * gds.getDouble(GridDefRecord.DX);
      double endy = gds.getDouble(GridDefRecord.LA1) + (getNy() - 1) * dy;

      System.out.println("End point rotated grid should be x=" +
          endx + " y=" + endy);
    }
  }
private void makeRotatedLatLon(NetcdfFile ncfile) {

    double splat = gds.getDouble(GridDefRecord.SPLAT);
    double splon = gds.getDouble(GridDefRecord.SPLON);
    double spangle = gds.getDouble(GridDefRecord.ROTATIONANGLE);

    // Given projection coordinates, need LatLon coordinates
    proj = new RotatedLatLon(splat, splon, spangle);
    LatLonPoint startLL = proj.projToLatLon(
        new ProjectionPointImpl(
            gds.getDouble(GridDefRecord.LO1), gds.getDouble(GridDefRecord.LA1)));
    startx = startLL.getLongitude();
    starty = startLL.getLatitude();
    addCoordSystemVariable(ncfile, "latLonCoordSys", "time y x");

    // splat, splon, spangle
    attributes.add(new Attribute(GridCF.GRID_MAPPING_NAME, "rotated_latlon_grib"));
    attributes.add(new Attribute("grid_south_pole_latitude", splat));
    attributes.add(new Attribute("grid_south_pole_longitude", splon));
    attributes.add(new Attribute("grid_south_pole_angle", spangle));

    if (GridServiceProvider.debugProj) {
      System.out.println("Location of pole of rotated grid:");
      System.out.println("Lon=" + splon + ", Lat=" + splat);
      System.out.println("Axial rotation about pole of rotated grid:" + spangle);

      System.out.println("Location of LL in rotated grid:");
      System.out.println("Lon=" + gds.getDouble(GridDefRecord.LO1) + ", " +
          "Lat=" + gds.getDouble(GridDefRecord.LA1));
      System.out.println("Location of LL in non-rotated grid:");
      System.out.println("Lon=" + startx + ", Lat=" + starty);

      double Lo2 = gds.getDouble(GridDefRecord.LO2);
      double La2 = gds.getDouble(GridDefRecord.LA2);
      System.out.println("Location of UR in rotated grid:");
      System.out.println("Lon=" + Lo2 + ", Lat=" + La2);
      System.out.println("Location of UR in non-rotated grid:");
      LatLonPoint endUR = proj.projToLatLon(new ProjectionPointImpl(Lo2, La2));
      System.out.println("Lon=" + endUR.getLongitude() + ", Lat=" + endUR.getLatitude());

      double dy = (La2 < gds.getDouble(GridDefRecord.LA1)) ?
          -gds.getDouble(GridDefRecord.DY) : gds.getDouble(GridDefRecord.DY);
      double endx = gds.getDouble(GridDefRecord.LO1) + (getNx() - 1) * gds.getDouble(GridDefRecord.DX);
      double endy = gds.getDouble(GridDefRecord.LA1) + (getNy() - 1) * dy;

      System.out.println("End point rotated grid should be x=" +
          endx + " y=" + endy);
    }
  }
private void makeRotatedLatLon ( NetcdfFile ncfile ) { double splat = gds . getDouble ( GridDefRecord . SPLAT ) ; double splon = gds . getDouble ( GridDefRecord . SPLON ) ; double spangle = gds . getDouble ( GridDefRecord . ROTATIONANGLE ) ; // Given projection coordinates, need LatLon coordinates proj = new RotatedLatLon ( splat , splon , spangle ) ; LatLonPoint startLL = proj . projToLatLon ( new ProjectionPointImpl ( gds . getDouble ( GridDefRecord . LO1 ) , gds . getDouble ( GridDefRecord . LA1 ) ) ) ; startx = startLL . getLongitude ( ) ; starty = startLL . getLatitude ( ) ; addCoordSystemVariable ( ncfile , "latLonCoordSys" , "time y x" ) ; // splat, splon, spangle attributes . add ( new Attribute ( GridCF . GRID_MAPPING_NAME , "rotated_latlon_grib" ) ) ; attributes . add ( new Attribute ( "grid_south_pole_latitude" , splat ) ) ; attributes . add ( new Attribute ( "grid_south_pole_longitude" , splon ) ) ; attributes . add ( new Attribute ( "grid_south_pole_angle" , spangle ) ) ; if ( GridServiceProvider . debugProj ) { System . out . println ( "Location of pole of rotated grid:" ) ; System . out . println ( "Lon=" + splon + ", Lat=" + splat ) ; System . out . println ( "Axial rotation about pole of rotated grid:" + spangle ) ; System . out . println ( "Location of LL in rotated grid:" ) ; System . out . println ( "Lon=" + gds . getDouble ( GridDefRecord . LO1 ) + ", " + "Lat=" + gds . getDouble ( GridDefRecord . LA1 ) ) ; System . out . println ( "Location of LL in non-rotated grid:" ) ; System . out . println ( "Lon=" + startx + ", Lat=" + starty ) ; double Lo2 = gds . getDouble ( GridDefRecord . LO2 ) ; double La2 = gds . getDouble ( GridDefRecord . LA2 ) ; System . out . println ( "Location of UR in rotated grid:" ) ; System . out . println ( "Lon=" + Lo2 + ", Lat=" + La2 ) ; System . out . println ( "Location of UR in non-rotated grid:" ) ; LatLonPoint endUR = proj . projToLatLon ( new ProjectionPointImpl ( Lo2 , La2 ) ) ; System . out . println ( "Lon=" + endUR . getLongitude ( ) + ", Lat=" + endUR . getLatitude ( ) ) ; double dy = ( La2 < gds . getDouble ( GridDefRecord . LA1 ) ) ? - gds . getDouble ( GridDefRecord . DY ) : gds . getDouble ( GridDefRecord . DY ) ; double endx = gds . getDouble ( GridDefRecord . LO1 ) + ( getNx ( ) - 1 ) * gds . getDouble ( GridDefRecord . DX ) ; double endy = gds . getDouble ( GridDefRecord . LA1 ) + ( getNy ( ) - 1 ) * dy ; System . out . println ( "End point rotated grid should be x=" + endx + " y=" + endy ) ; } }
RotatedLatLon
RotatedLatLon