private static void expandEnvelopeOnExtremePoints( GeneralDirectPosition centerPt, GeneralEnvelope transformed, MathTransform geoToTarget, Envelope geoEnvelope) throws TransformException { GeneralDirectPosition workPoint = new GeneralDirectPosition(centerPt.getDimension()); double centerLon = centerPt.getOrdinate(0); double minLon = geoEnvelope.getMinimum(0); double maxLon = geoEnvelope.getMaximum(0); double minLat = geoEnvelope.getMinimum(1); double maxLat = geoEnvelope.getMaximum(1); if (minLon <= centerLon && centerLon <= maxLon) { // intersection at boundaries, south includeTransformedPoint(transformed, geoToTarget, workPoint, centerLon, minLat); // intersection at boundaries, north includeTransformedPoint(transformed, geoToTarget, workPoint, centerLon, maxLat); } double centerLat = centerPt.getOrdinate(1); if (minLat <= centerLat && centerLat <= maxLat) { // intersection at boundaries, west includeTransformedPoint(transformed, geoToTarget, workPoint, minLon, centerLat); // intersection at boundaries, east includeTransformedPoint(transformed, geoToTarget, workPoint, maxLon, centerLat); } }
/** * Transform the provided 3D direct position into 2D (Ellipsoidal height is ignored when * converting from {@link DefaultGeographicCRS#WGS84_3D} to {@link DefaultGeographicCRS#WGS84}). * * @param srcPosition Source 3D position * @param transformToWGS84_3D From source CRS to To WGS84_3D * @param transformFromWGS84 From WGS84 to target CRS * @return Position in target CRS as calculated by transform2 * @throws TransformException */ private static DirectPosition transformTo2D( GeneralDirectPosition srcPosition, MathTransform transformToWGS84_3D, MathTransform transformFromWGS84) throws TransformException { if (Double.isNaN(srcPosition.getOrdinate(2))) { srcPosition.setOrdinate( 2, 0.0); // lazy add 3rd ordinate if not provided to prevent failure } DirectPosition world3D = transformToWGS84_3D.transform(srcPosition, null); DirectPosition world2D = new GeneralDirectPosition(DefaultGeographicCRS.WGS84); world2D.setOrdinate(0, world3D.getOrdinate(0)); world2D.setOrdinate(1, world3D.getOrdinate(1)); DirectPosition targetPosition = transformFromWGS84.transform(world2D, null); return targetPosition; }
/** * Test case using example from EPSG Guidance Note number 7 part 2 (May 2005), section 2.4.3.1. */ @Test public void testTranslation() throws FactoryException, TransformException { final String classification = "Geocentric translations (geog2d domain)"; final MathTransformFactory factory = ReferencingFactoryFinder.getMathTransformFactory(null); final ParameterValueGroup param = factory.getDefaultParameters(classification); param.parameter("dx").setValue(84.87); param.parameter("dy").setValue(96.49); param.parameter("dz").setValue(116.95); final MathTransform test = factory.createParameterizedTransform(param); final GeneralDirectPosition position = new GeneralDirectPosition(3); position.setOrdinate(0, 3771793.97); position.setOrdinate(1, 140253.34); position.setOrdinate(2, 5124304.35); assertSame(position, test.transform(position, position)); assertEquals(3771878.84, position.getOrdinate(0), 1E-5); assertEquals(140349.83, position.getOrdinate(1), 1E-5); assertEquals(5124421.30, position.getOrdinate(2), 1E-5); }
/** * Test case using example from EPSG Guidance Note number 7 part 2 (May 2005), section * 2.4.3.2.1. */ @Test public void testSevenParam() throws FactoryException, TransformException { final String classification = "Position Vector transformation (geog2d domain)"; final MathTransformFactory factory = ReferencingFactoryFinder.getMathTransformFactory(null); final ParameterValueGroup param = factory.getDefaultParameters(classification); param.parameter("dx").setValue(0.000); param.parameter("dy").setValue(0.000); param.parameter("dz").setValue(4.5); param.parameter("ex").setValue(0.000); param.parameter("ey").setValue(0.000); param.parameter("ez").setValue(0.554); param.parameter("ppm").setValue(0.219); final MathTransform test = factory.createParameterizedTransform(param); final GeneralDirectPosition position = new GeneralDirectPosition(3); position.setOrdinate(0, 3657660.66); position.setOrdinate(1, 255768.55); position.setOrdinate(2, 5201382.11); assertSame(position, test.transform(position, position)); assertEquals(3657660.78, position.getOrdinate(0), 1E-2); assertEquals(255778.43, position.getOrdinate(1), 1E-5); assertEquals(5201387.75, position.getOrdinate(2), 1E-2); }
/** * Test case using example from EPSG Guidance Note number 7 part 2 (May 2005), section * 2.4.3.2.2. */ @Test public void testFrameRotation() throws FactoryException, TransformException { final String classification = "Coordinate Frame rotation (geog2d domain)"; final MathTransformFactory factory = ReferencingFactoryFinder.getMathTransformFactory(null); final ParameterValueGroup param = factory.getDefaultParameters(classification); param.parameter("dx").setValue(0.000); param.parameter("dy").setValue(0.000); param.parameter("dz").setValue(4.5); param.parameter("ex").setValue(0.000); param.parameter("ey").setValue(0.000); param.parameter("ez").setValue(-0.554); param.parameter("ppm").setValue(0.219); final MathTransform test = factory.createParameterizedTransform(param); final GeneralDirectPosition position = new GeneralDirectPosition(3); position.setOrdinate(0, 3657660.66); position.setOrdinate(1, 255768.55); position.setOrdinate(2, 5201382.11); assertSame(position, test.transform(position, position)); assertEquals(3657660.78, position.getOrdinate(0), 1E-2); assertEquals(255778.43, position.getOrdinate(1), 1E-5); assertEquals(5201387.75, position.getOrdinate(2), 1E-2); }
assertEquals(4.00, position.getOrdinate(0), 1E-2); assertEquals(55.00, position.getOrdinate(1), 1E-2); assertEquals(3.23, position.getOrdinate(2), 1E-2);
targetPt.setOrdinate(j, centerPt.getOrdinate(j)); targetPt.setOrdinate(i, centerPt.getOrdinate(i)); || targetProjection instanceof LambertAzimuthalEqualArea) { centerPt.setOrdinate(0, rollLongitude(centerPt.getOrdinate(0) - 90)); expandEnvelopeOnExtremePoints( centerPt, transformed, geoToTarget, geoEnvelope); centerPt.setOrdinate(0, rollLongitude(centerPt.getOrdinate(0) - 90)); expandEnvelopeOnExtremePoints( centerPt, transformed, geoToTarget, geoEnvelope); centerPt.setOrdinate(0, rollLongitude(centerPt.getOrdinate(0) - 90)); expandEnvelopeOnExtremePoints( centerPt, transformed, geoToTarget, geoEnvelope);