Example #1
0
 /** Returns a projected CRS for test purpose. */
 private static CoordinateReferenceSystem getProjectedCRS(final GridCoverage2D coverage) {
   try {
     final GeographicCRS base = (GeographicCRS) coverage.getCoordinateReferenceSystem();
     final Ellipsoid ellipsoid = base.getDatum().getEllipsoid();
     final DefaultMathTransformFactory factory = new DefaultMathTransformFactory();
     final ParameterValueGroup parameters = factory.getDefaultParameters("Oblique_Stereographic");
     parameters.parameter("semi_major").setValue(ellipsoid.getSemiMajorAxis());
     parameters.parameter("semi_minor").setValue(ellipsoid.getSemiMinorAxis());
     parameters.parameter("central_meridian").setValue(5);
     parameters.parameter("latitude_of_origin").setValue(-5);
     final MathTransform mt;
     try {
       mt = factory.createParameterizedTransform(parameters);
     } catch (FactoryException exception) {
       fail(exception.getLocalizedMessage());
       return null;
     }
     return new DefaultProjectedCRS("Stereographic", base, mt, DefaultCartesianCS.PROJECTED);
   } catch (NoSuchIdentifierException exception) {
     fail(exception.getLocalizedMessage());
     return null;
   }
 }
  public static void attachGeoCoding(
      Product p,
      double upperLeftLon,
      double upperLeftLat,
      double lowerRightLon,
      double lowerRightLat,
      String projection,
      double[] projectionParameter) {
    double pixelSizeX = (lowerRightLon - upperLeftLon) / p.getSceneRasterWidth();
    double pixelSizeY = (upperLeftLat - lowerRightLat) / p.getSceneRasterHeight();

    AffineTransform transform = new AffineTransform();
    transform.translate(upperLeftLon, upperLeftLat);
    transform.scale(pixelSizeX, -pixelSizeY);
    transform.translate(PIXEL_CENTER, PIXEL_CENTER);
    Rectangle imageBounds = new Rectangle(p.getSceneRasterWidth(), p.getSceneRasterHeight());

    if (projection.equals("GCTP_GEO")) {
      if ((upperLeftLon >= -180 && upperLeftLon <= 180)
          && (upperLeftLat >= -90 && upperLeftLat <= 90)
          && (lowerRightLon >= -180 && lowerRightLon <= 180)
          && (lowerRightLat >= -90 && lowerRightLat <= 90)) {
        try {
          p.setGeoCoding(new CrsGeoCoding(DefaultGeographicCRS.WGS84, imageBounds, transform));
        } catch (FactoryException | TransformException ignore) {
        }
      }
    } else {
      if (projection.equals("GCTP_SNSOID")) {
        final MathTransformFactory transformFactory =
            ReferencingFactoryFinder.getMathTransformFactory(null);
        ParameterValueGroup parameters;
        try {
          parameters = transformFactory.getDefaultParameters("OGC:Sinusoidal");
        } catch (NoSuchIdentifierException ignore) {
          return;
        }
        double semi_major;
        double semi_minor;
        if (projectionParameter != null) {
          semi_major = projectionParameter[0];
          semi_minor = projectionParameter[1];
          if (semi_minor == 0) {
            semi_minor = semi_major;
          }
        } else {
          Ellipsoid ellipsoid = DefaultGeographicCRS.WGS84.getDatum().getEllipsoid();
          semi_major = ellipsoid.getSemiMajorAxis();
          semi_minor = ellipsoid.getSemiMinorAxis();
        }
        parameters.parameter("semi_major").setValue(semi_major);
        parameters.parameter("semi_minor").setValue(semi_minor);

        MathTransform mathTransform;
        try {
          mathTransform = transformFactory.createParameterizedTransform(parameters);
        } catch (Exception ignore) {
          return;
        }

        DefaultGeographicCRS base = DefaultGeographicCRS.WGS84;
        CoordinateReferenceSystem modelCrs =
            new DefaultProjectedCRS(
                "Sinusoidal", base, mathTransform, DefaultCartesianCS.PROJECTED);
        try {
          CrsGeoCoding geoCoding = new CrsGeoCoding(modelCrs, imageBounds, transform);

          p.setGeoCoding(geoCoding);
        } catch (Exception ignore) {
        }
      }
    }
  }
  /**
   * Tests the creation of new coordinate reference systems.
   *
   * @throws FactoryException if a coordinate reference system can't be created.
   */
  @Test
  public void testCreation() throws FactoryException {
    out.println();
    out.println("Testing CRS creations");
    out.println("---------------------");
    out.println();
    out.println("create Coodinate Reference System....1: ");
    final DatumFactory datumFactory = ReferencingFactoryFinder.getDatumFactory(null);
    final CSFactory csFactory = ReferencingFactoryFinder.getCSFactory(null);
    final CRSFactory crsFactory = ReferencingFactoryFinder.getCRSFactory(null);
    final MathTransformFactory mtFactory = ReferencingFactoryFinder.getMathTransformFactory(null);

    final Ellipsoid airy1830;
    final Unit<Length> meters = SI.METER;
    airy1830 = datumFactory.createEllipsoid(name("Airy1830"), 6377563.396, 6356256.910, meters);
    out.println();
    out.println("create Coodinate Reference System....2: ");
    out.println(airy1830.toWKT());

    final PrimeMeridian greenwich;
    final Unit<Angle> degrees = NonSI.DEGREE_ANGLE;
    greenwich = datumFactory.createPrimeMeridian(name("Greenwich"), 0, degrees);
    out.println();
    out.println("create Coodinate Reference System....3: ");
    out.println(greenwich.toWKT());

    // NOTE: we could use the following pre-defined constant instead:
    //       DefaultPrimeMeridian.GREENWICH;
    final GeodeticDatum datum;
    datum = datumFactory.createGeodeticDatum(name("Airy1830"), airy1830, greenwich);
    out.println();
    out.println("create Coodinate Reference System....4: ");
    out.println(datum.toWKT());

    // NOTE: we could use the following pre-defined constant instead:
    //       DefaultEllipsoidalCS.GEODETIC_2D;
    final EllipsoidalCS ellCS;
    ellCS =
        csFactory.createEllipsoidalCS(
            name("Ellipsoidal"),
            csFactory.createCoordinateSystemAxis(
                name("Longitude"), "long", AxisDirection.EAST, degrees),
            csFactory.createCoordinateSystemAxis(
                name("Latitude"), "lat", AxisDirection.NORTH, degrees));
    out.println();
    out.println("create Coodinate Reference System....5: ");
    out.println(ellCS); // No WKT for coordinate systems

    final GeographicCRS geogCRS;
    geogCRS = crsFactory.createGeographicCRS(name("Airy1830"), datum, ellCS);
    out.println();
    out.println("create Coodinate Reference System....6: ");
    out.println(geogCRS.toWKT());

    final MathTransform p;
    final ParameterValueGroup param = mtFactory.getDefaultParameters("Transverse_Mercator");
    param.parameter("semi_major").setValue(airy1830.getSemiMajorAxis());
    param.parameter("semi_minor").setValue(airy1830.getSemiMinorAxis());
    param.parameter("central_meridian").setValue(49);
    param.parameter("latitude_of_origin").setValue(-2);
    param.parameter("false_easting").setValue(400000);
    param.parameter("false_northing").setValue(-100000);
    out.println();
    out.println("create Coodinate System....7: ");
    out.println(param);

    // NOTE: we could use the following pre-defined constant instead:
    //       DefaultCartesianCS.PROJECTED;
    final CartesianCS cartCS;
    cartCS =
        csFactory.createCartesianCS(
            name("Cartesian"),
            csFactory.createCoordinateSystemAxis(name("Easting"), "x", AxisDirection.EAST, meters),
            csFactory.createCoordinateSystemAxis(
                name("Northing"), "y", AxisDirection.NORTH, meters));
    out.println();
    out.println("create Coodinate Reference System....8: ");
    out.println(cartCS); // No WKT for coordinate systems

    final Hints hints = new Hints();
    hints.put(Hints.DATUM_FACTORY, datumFactory);
    hints.put(Hints.CS_FACTORY, csFactory);
    hints.put(Hints.CRS_FACTORY, crsFactory);
    hints.put(Hints.MATH_TRANSFORM_FACTORY, mtFactory);

    final ReferencingFactoryContainer container = new ReferencingFactoryContainer(hints);
    assertSame(datumFactory, container.getDatumFactory());
    assertSame(csFactory, container.getCSFactory());
    assertSame(crsFactory, container.getCRSFactory());
    assertSame(mtFactory, container.getMathTransformFactory());

    final Conversion conversion = new DefiningConversion("GBN grid", param);
    final ProjectedCRS projCRS =
        crsFactory.createProjectedCRS(
            name("Great_Britian_National_Grid"), geogCRS, conversion, cartCS);
    out.println();
    out.println("create Coodinate System....9: ");
    out.println(projCRS.toWKT());
  }