/** * Creates a transform from the specified group of parameter values. * * @param parameters The group of parameter values. * @return The created math transform. * @throws ParameterNotFoundException if a required parameter was not found. */ @Override public MathTransform createMathTransform(final ParameterValueGroup parameters) throws ParameterNotFoundException { final MapProjection projection = (MapProjection) super.createMathTransform(parameters); if (projection.falseEasting == 0 && projection.falseNorthing == 0) { return projection; } final AffineTransform step = AffineTransform.getTranslateInstance( -2 * projection.falseEasting, -2 * projection.falseNorthing); return ConcatenatedTransform.create(ProjectiveTransform.create(step), projection); } }
ParameterValueGroup createTransverseMercatorParameters(int zoneIndex, boolean south, GeodeticDatum datum) { ParameterDescriptorGroup tmParameters = new TransverseMercator.Provider().getParameters(); ParameterValueGroup tmValues = tmParameters.createValue(); setValue(tmValues, MapProjection.AbstractProvider.SEMI_MAJOR, datum.getEllipsoid().getSemiMajorAxis()); setValue(tmValues, MapProjection.AbstractProvider.SEMI_MINOR, datum.getEllipsoid().getSemiMinorAxis()); setValue(tmValues, MapProjection.AbstractProvider.LATITUDE_OF_ORIGIN, 0.0); setValue(tmValues, MapProjection.AbstractProvider.CENTRAL_MERIDIAN, getCentralMeridian(zoneIndex)); setValue(tmValues, MapProjection.AbstractProvider.SCALE_FACTOR, 0.9996); setValue(tmValues, MapProjection.AbstractProvider.FALSE_EASTING, 500000.0); setValue(tmValues, MapProjection.AbstractProvider.FALSE_NORTHING, south ? 10000000.0 : 0.0); return tmValues; }
@Override public CoordinateReferenceSystem getCRS(final GeoPos referencePos, ParameterValueGroup parameters, GeodeticDatum datum) throws FactoryException { int zoneIndex = parameters.parameter(ZONE_NAME).intValue(); String hemisphere1 = parameters.parameter(HEMISPHERE_NAME).stringValue(); boolean south = (SOUTH_HEMISPHERE.equals(hemisphere1)); ParameterValueGroup tmParameters = createTransverseMercatorParameters(zoneIndex, south, datum); return createCrs(getProjectionName(zoneIndex, south), new TransverseMercator.Provider(), tmParameters, datum); }
@Override public CoordinateReferenceSystem getCRS(final GeoPos referencePos, ParameterValueGroup parameters, GeodeticDatum datum) throws FactoryException { int zoneIndex = getZoneIndex(referencePos.getLon()); final boolean south = referencePos.getLat() < 0.0; ParameterValueGroup tmParameters = createTransverseMercatorParameters(zoneIndex, south, datum); final String projName = getProjectionName(zoneIndex, south); return createCrs(projName, new TransverseMercator.Provider(), tmParameters, datum); } }
@Override public CoordinateReferenceSystem getCRS(final GeoPos referencePos, ParameterValueGroup parameters, GeodeticDatum datum) throws FactoryException { int zoneIndex = getZoneIndex(referencePos.getLon()); final boolean south = referencePos.getLat() < 0.0; ParameterValueGroup tmParameters = createTransverseMercatorParameters(zoneIndex, south, datum); final String projName = getProjectionName(zoneIndex, south); return createCrs(projName, new TransverseMercator.Provider(), tmParameters, datum); } }
ParameterValueGroup createTransverseMercatorParameters(int zoneIndex, boolean south, GeodeticDatum datum) { ParameterDescriptorGroup tmParameters = new TransverseMercator.Provider().getParameters(); ParameterValueGroup tmValues = tmParameters.createValue(); setValue(tmValues, MapProjection.AbstractProvider.SEMI_MAJOR, datum.getEllipsoid().getSemiMajorAxis()); setValue(tmValues, MapProjection.AbstractProvider.SEMI_MINOR, datum.getEllipsoid().getSemiMinorAxis()); setValue(tmValues, MapProjection.AbstractProvider.LATITUDE_OF_ORIGIN, 0.0); setValue(tmValues, MapProjection.AbstractProvider.CENTRAL_MERIDIAN, getCentralMeridian(zoneIndex)); setValue(tmValues, MapProjection.AbstractProvider.SCALE_FACTOR, 0.9996); setValue(tmValues, MapProjection.AbstractProvider.FALSE_EASTING, 500000.0); setValue(tmValues, MapProjection.AbstractProvider.FALSE_NORTHING, south ? 10000000.0 : 0.0); return tmValues; }
@Override public CoordinateReferenceSystem getCRS(final GeoPos referencePos, ParameterValueGroup parameters, GeodeticDatum datum) throws FactoryException { int zoneIndex = parameters.parameter(ZONE_NAME).intValue(); String hemisphere1 = parameters.parameter(HEMISPHERE_NAME).stringValue(); boolean south = (SOUTH_HEMISPHERE.equals(hemisphere1)); ParameterValueGroup tmParameters = createTransverseMercatorParameters(zoneIndex, south, datum); return createCrs(getProjectionName(zoneIndex, south), new TransverseMercator.Provider(), tmParameters, datum); }
/** * Creates a transform from the specified group of parameter values. * * @param parameters The group of parameter values. * @return The created math transform. * @throws ParameterNotFoundException if a required parameter was not found. */ protected MathTransform createMathTransform(final ParameterValueGroup parameters) throws ParameterNotFoundException { if (isSpherical(parameters)) { return new Spherical(parameters); } else { return new TransverseMercator(parameters); } } }
/** Returns a descriptor group for the specified parameters. */ static ParameterDescriptorGroup createDescriptorGroup( final ReferenceIdentifier[] identifiers) { return createDescriptorGroup( identifiers, new ParameterDescriptor[] { SEMI_MAJOR, SEMI_MINOR, CENTRAL_MERIDIAN, LATITUDE_OF_ORIGIN, SCALE_FACTOR, FALSE_EASTING, FALSE_NORTHING }); }