Java源码示例:org.opengis.referencing.operation.MathTransform2D
示例1
/**
* Adds the location identified by the given label
*
* @param label a label that identify the location to add.
* @param location the location to add to the list of locations shown by this widget.
* @throws FactoryException if a transformation to the display CRS can not be obtained.
* @throws TransformException if an error occurred while transforming an envelope.
*/
public void addLocation(final String label, final AbstractLocation location) throws FactoryException, TransformException {
final Envelope envelope = location.getEnvelope();
final MathTransform2D tr = (MathTransform2D) CRS.findOperation(
envelope.getCoordinateReferenceSystem(), displayCRS, null).getMathTransform();
final Shape shape = tr.createTransformedShape(new IntervalRectangle(envelope));
if (locations.putIfAbsent(label, shape) != null) {
throw new IllegalArgumentException("A location is already defined for " + label);
}
final Rectangle2D b = shape.getBounds2D();
if (bounds == null) {
bounds = b;
} else {
bounds.add(b);
}
}
示例2
/**
* Gets the derivative of this transform at a point.
*
* @param point the coordinate point where to evaluate the derivative.
* @return the derivative at the specified point (never {@code null}).
* @throws TransformException if the derivative can't be evaluated at the specified point.
*/
@Override
public Matrix derivative(final Point2D point) throws TransformException {
final MathTransform2D transform1 = (MathTransform2D) this.transform1;
final MathTransform2D transform2 = (MathTransform2D) this.transform2;
final Matrix matrix1 = transform1.derivative(point);
final Matrix matrix2 = transform2.derivative(transform1.transform(point,null));
return Matrices.multiply(matrix2, matrix1);
}
示例3
/**
* Creates the inverse transform of this object.
*/
@Override
public synchronized MathTransform2D inverse() throws NoninvertibleTransformException {
if (inverse == null) {
inverse = new PassThroughTransform2D(firstAffectedCoordinate, subTransform.inverse(), numTrailingCoordinates);
inverse.inverse = this;
}
return (MathTransform2D) inverse;
}
示例4
/**
* Tests the interfaces implemented by the transforms returned by {@link MathTransforms#translation(double...)}.
*/
@Test
public void testTranslation() {
MathTransform tr = MathTransforms.translation(4);
assertInstanceOf("1D", MathTransform1D.class, tr);
assertFalse("isIdentity", tr.isIdentity());
tr = MathTransforms.translation(4, 7);
assertInstanceOf("2D", MathTransform2D.class, tr);
assertFalse("isIdentity", tr.isIdentity());
}
示例5
/**
* Executed after every test in order to ensure that the {@linkplain #transform transform}
* implements the {@link MathTransform1D} or {@link MathTransform2D} interface as needed.
* In addition, all Apache SIS classes for linear transforms shall implement
* {@link LinearTransform} and {@link Parameterized} interfaces.
*/
@After
public final void ensureImplementRightInterface() {
if (transform instanceof TransformResultComparator) {
transform = ((TransformResultComparator) transform).tested;
}
/*
* Below is a copy of MathTransformTestCase.validate(), with minor modifications
* due to the fact that this class does not extend MathTransformTestCase.
*/
assertNotNull("The 'transform' field shall be assigned a value.", transform);
Validators.validate(transform);
final int dimension = transform.getSourceDimensions();
if (transform.getTargetDimensions() == dimension && !skipInterfaceCheckForDimension(dimension)) {
assertEquals("MathTransform1D", dimension == 1, (transform instanceof MathTransform1D));
assertEquals("MathTransform2D", dimension == 2, (transform instanceof MathTransform2D));
} else {
assertFalse("MathTransform1D", transform instanceof MathTransform1D);
assertFalse("MathTransform2D", transform instanceof MathTransform2D);
}
assertInstanceOf("Parameterized", Parameterized.class, transform);
/*
* End of MathTransformTestCase.validate(). Remaining is specific to LinearTransform implementations.
*/
assertInstanceOf("Not a LinearTransform.", LinearTransform.class, transform);
final Matrix tm = ((LinearTransform) transform).getMatrix();
assertTrue("The matrix declared by the MathTransform is not equal to the one given at creation time.",
Matrices.equals(matrix, tm, tolerance, false));
assertSame("ParameterDescriptor",
Affine.getProvider(transform.getSourceDimensions(), transform.getTargetDimensions(), true).getParameters(),
((Parameterized) transform).getParameterDescriptors());
}
示例6
/**
* Validates the current {@linkplain #transform transform}. This method verifies that
* the transform implements {@link MathTransform1D} or {@link MathTransform2D} if the
* transform dimension suggests that it should. In addition, all Apache SIS transforms
* shall implement {@link Parameterized}.
*
* @see Validators#validate(MathTransform)
*/
protected final void validate() {
assertNotNull("The 'transform' field shall be assigned a value.", transform);
Validators.validate(transform);
final int dimension = transform.getSourceDimensions();
if (transform.getTargetDimensions() == dimension) {
assertEquals("transform instanceof MathTransform1D:", (transform instanceof MathTransform1D), dimension == 1);
assertEquals("transform instanceof MathTransform2D:", (transform instanceof MathTransform2D), dimension == 2);
} else {
assertFalse("transform instanceof MathTransform1D:", transform instanceof MathTransform1D);
assertFalse("transform instanceof MathTransform2D:", transform instanceof MathTransform2D);
}
assertInstanceOf("The transform does not implement all expected interfaces.", Parameterized.class, transform);
}
示例7
/**
* Tests the transformation of an envelope or rectangle. This is a relatively simple test case
* working in the two-dimensional space only, with a coordinate operation of type "conversion"
* (not a "transformation") and with no need to adjust for poles.
*
* @throws FactoryException if an error occurred while creating the operation.
* @throws TransformException if an error occurred while transforming the envelope.
*/
@Test
public final void testTransform() throws FactoryException, TransformException {
final ProjectedCRS targetCRS = CommonCRS.WGS84.universal(10, -123.5);
final GeographicCRS sourceCRS = targetCRS.getBaseCRS();
final Conversion conversion = targetCRS.getConversionFromBase();
final MathTransform2D transform = (MathTransform2D) conversion.getMathTransform();
/*
* Transforms envelopes using MathTransform. Geographic coordinates are in (latitude, longitude) order.
* Opportunistically check that the transform using a CoordinateOperation object produces the same result.
*/
final G rectλφ = createFromExtremums(sourceCRS, -20, -126, 40, -120);
final G rectXY = transform(targetCRS, transform, rectλφ);
assertEquals("Conversion should produce the same result.", rectXY, transform(conversion, rectλφ));
/*
* Expected values are determined empirically by projecting many points.
* Those values are the same than in EnvelopesTest.testTransform().
*/
final G expected = createFromExtremums(targetCRS, 166021.56, -2214294.03,
833978.44, 4432069.06);
assertGeometryEquals(expected, rectXY, LINEAR_TOLERANCE, LINEAR_TOLERANCE);
/*
* Test the inverse conversion.
* Final envelope should be slightly bigger than the original.
*/
final G rectBack = transform(sourceCRS, transform.inverse(), rectXY);
assertTrue("Transformed envelope should not be smaller than the original one.", contains(rectBack, rectλφ));
assertGeometryEquals(rectλφ, rectBack, 0.05, 1.0);
}
示例8
/**
* Adds all locations in the given area of interest.
*
* @param coder the encoder to use for computing locations and their envelopes.
* @param areaOfInterest the geographic or projected area where to get locations.
* @throws FactoryException if a transformation to the display CRS can not be obtained.
* @throws TransformException if an error occurred while transforming an envelope.
*/
public void addLocations(final MilitaryGridReferenceSystem.Coder coder, final Envelope areaOfInterest)
throws FactoryException, TransformException
{
final Iterator<String> it = coder.encode(areaOfInterest);
while (it.hasNext()) {
final String code = it.next();
addLocation(code, coder.decode(code));
}
envelope = ((MathTransform2D) CRS.findOperation(areaOfInterest.getCoordinateReferenceSystem(), displayCRS, null)
.getMathTransform()).createTransformedShape(new IntervalRectangle(areaOfInterest));
}
示例9
/**
* Returns the inverse of this transform.
*/
@Override
public MathTransform2D inverse() {
return inverse;
}
示例10
/**
* Returns the inverse of this transform, which is the enclosing {@link SatelliteGroundTrack} transform.
*/
@Override
public MathTransform2D inverse() {
return SatelliteGroundTrack.this;
}
示例11
/**
* Returns the inverse of this math transform.
*/
@Override
public MathTransform2D inverse() {
return forward;
}
示例12
/**
* Returns the inverse of this math transform.
*/
@Override
public MathTransform2D inverse() {
return forward;
}
示例13
/**
* Returns the inverse transform of this transform.
*/
@Override
public MathTransform2D inverse() {
return (MathTransform2D) super.inverse();
}
示例14
/**
* Returns the inverse transform of this transform.
*/
@Override
public MathTransform2D inverse() {
return (MathTransform2D) super.inverse();
}
示例15
/**
* Returns the inverse transform of this transform.
*/
@Override
public MathTransform2D inverse() {
return (MathTransform2D) super.inverse();
}
示例16
/**
* Constructs a concatenated transform.
*/
public ConcatenatedTransformDirect2D(final MathTransform2D transform1,
final MathTransform2D transform2)
{
super(transform1, transform2);
}
示例17
/**
* Creates the inverse transform of this object.
*/
@Override
public MathTransform2D inverse() throws NoninvertibleTransformException {
return (MathTransform2D) super.inverse();
}
示例18
/**
* Concatenates the two given transforms.
* If the concatenation result works with two-dimensional input and output points,
* then the returned transform will implement {@link MathTransform2D}.
* Likewise if the concatenation result works with one-dimensional input and output points,
* then the returned transform will implement {@link MathTransform1D}.
*
* <div class="note"><b>Implementation note:</b>
* {@code ConcatenatedTransform} implementations are available in two versions: direct and non-direct.
* The "non-direct" versions use an intermediate buffer when performing transformations; they are slower
* and consume more memory. They are used only as a fallback when a "direct" version can not be created.</div>
*
* @param tr1 the first math transform.
* @param tr2 the second math transform.
* @param factory the factory which is (indirectly) invoking this method, or {@code null} if none.
* @return the concatenated transform.
*
* @see MathTransforms#concatenate(MathTransform, MathTransform)
*/
public static MathTransform create(MathTransform tr1, MathTransform tr2, final MathTransformFactory factory)
throws FactoryException, MismatchedDimensionException
{
final int dim1 = tr1.getTargetDimensions();
final int dim2 = tr2.getSourceDimensions();
if (dim1 != dim2) {
throw new MismatchedDimensionException(Resources.format(Resources.Keys.CanNotConcatenateTransforms_2, getName(tr1),
getName(tr2)) + ' ' + Errors.format(Errors.Keys.MismatchedDimension_2, dim1, dim2));
}
MathTransform mt = createOptimized(tr1, tr2, factory);
if (mt != null) {
return mt;
}
/*
* Can not avoid the creation of a ConcatenatedTransform object.
* Check for the type to create (1D, 2D, general case...)
*/
final int dimSource = tr1.getSourceDimensions();
final int dimTarget = tr2.getTargetDimensions();
if (dimSource == 1 && dimTarget == 1) {
/*
* Result needs to be a MathTransform1D.
*/
if (tr1 instanceof MathTransform1D && tr2 instanceof MathTransform1D) {
return new ConcatenatedTransformDirect1D((MathTransform1D) tr1,
(MathTransform1D) tr2);
} else {
return new ConcatenatedTransform1D(tr1, tr2);
}
} else if (dimSource == 2 && dimTarget == 2) {
/*
* Result needs to be a MathTransform2D.
*/
if (tr1 instanceof MathTransform2D && tr2 instanceof MathTransform2D) {
return new ConcatenatedTransformDirect2D((MathTransform2D) tr1,
(MathTransform2D) tr2);
} else {
return new ConcatenatedTransform2D(tr1, tr2);
}
} else if (dimSource == tr1.getTargetDimensions() // dim1 = tr1.getTargetDimensions() and
&& dimTarget == tr2.getSourceDimensions()) // dim2 = tr2.getSourceDimensions() may not be true anymore.
{
return new ConcatenatedTransformDirect(tr1, tr2);
} else {
return new ConcatenatedTransform(tr1, tr2);
}
}
示例19
/**
* Returns the inverse transform of this transform.
*/
@Override
public MathTransform2D inverse() {
return (MathTransform2D) super.inverse();
}
示例20
/**
* Returns the inverse transform of this transform.
*/
@Override
public MathTransform2D inverse() {
return (MathTransform2D) super.inverse();
}
示例21
/**
* Returns the inverse transform of this transform.
*/
@Override
public MathTransform2D inverse() {
return (MathTransform2D) super.inverse();
}
示例22
/**
* Returns the inverse transform of this transform.
*/
@Override
public MathTransform2D inverse() {
return (MathTransform2D) super.inverse();
}
示例23
/**
* Returns the inverse transform of this object.
*/
@Override
public MathTransform2D inverse() throws NoninvertibleTransformException {
return (MathTransform2D) super.inverse();
}
示例24
/**
* Returns the inverse transform of this object.
*/
@Override
public MathTransform2D inverse() {
return (MathTransform2D) super.inverse();
}
示例25
/**
* Creates the inverse transform of this object.
*/
@Override
public MathTransform2D inverse() throws NoninvertibleTransformException {
return (MathTransform2D) super.inverse();
}
示例26
/**
* Tests conversions of an envelope or rectangle over a pole using a coordinate operation.
*
* @throws FactoryException if an error occurred while creating the operation.
* @throws TransformException if an error occurred while transforming the envelope.
*/
@Test
@DependsOnMethod("testTransform")
public final void testTransformOverPole() throws FactoryException, TransformException {
final ProjectedCRS sourceCRS = (ProjectedCRS) CRS.fromWKT(
"PROJCS[“WGS 84 / Antarctic Polar Stereographic”,\n" +
" GEOGCS[“WGS 84”,\n" +
" DATUM[“World Geodetic System 1984”,\n" +
" SPHEROID[“WGS 84”, 6378137.0, 298.257223563]],\n" +
" PRIMEM[“Greenwich”, 0.0],\n" +
" UNIT[“degree”, 0.017453292519943295]],\n" +
" PROJECTION[“Polar Stereographic (variant B)”],\n" +
" PARAMETER[“standard_parallel_1”, -71.0],\n" +
" UNIT[“m”, 1.0]]");
final GeographicCRS targetCRS = sourceCRS.getBaseCRS();
final Conversion conversion = inverse(sourceCRS.getConversionFromBase());
final MathTransform2D transform = (MathTransform2D) conversion.getMathTransform();
/*
* The rectangle to test, which contains the South pole.
*/
G rectangle = createFromExtremums(sourceCRS,
-3943612.4042124213, -4078471.954436003,
3729092.5890516187, 4033483.085688618);
/*
* This is what we get without special handling of singularity point.
* Note that is does not include the South pole as we would expect.
* The commented out values are what we get by projecting an arbitrary
* larger amount of points.
*/
G expected = createFromExtremums(targetCRS,
// -178.4935231040927 -56.61747883535035 // empirical values
-179.8650137390031, -88.99136583196396, // anti-regression values
// 178.8122742080059 -40.90577500420587] // empirical values
137.9769431693009, -40.90577500420587); // anti-regression values
/*
* Tests what we actually get. First, test using the method working on MathTransform.
* Next, test again the same transform, but using the API on Envelope objects.
*/
G actual = transform(targetCRS, transform, rectangle);
assertGeometryEquals(expected, actual, ANGULAR_TOLERANCE, ANGULAR_TOLERANCE);
/*
* Using the transform(CoordinateOperation, …) method,
* the singularity at South pole is taken in account.
*/
expected = createFromExtremums(targetCRS, -180, -90, 180, -40.905775004205864);
actual = transform(conversion, rectangle);
assertGeometryEquals(expected, actual, ANGULAR_TOLERANCE, ANGULAR_TOLERANCE);
/*
* Another rectangle containing the South pole, but this time the south
* pole is almost in a corner of the rectangle
*/
rectangle = createFromExtremums(sourceCRS, -4000000, -4000000, 300000, 30000);
expected = createFromExtremums(targetCRS, -180, -90, 180, -41.03163170198091);
actual = transform(conversion, rectangle);
assertGeometryEquals(expected, actual, ANGULAR_TOLERANCE, ANGULAR_TOLERANCE);
/*
* Another rectangle with the South pole close to the border.
* This test should execute the step #3 in the transform method code.
*/
rectangle = createFromExtremums(sourceCRS, -2000000, -1000000, 200000, 2000000);
expected = createFromExtremums(targetCRS, -180, -90, 180, -64.3861643256928);
actual = transform(conversion, rectangle);
assertGeometryEquals(expected, actual, ANGULAR_TOLERANCE, ANGULAR_TOLERANCE);
}
示例27
/**
* Returns the inverse of this map projection.
* Subclasses do not need to override this method, as they should override
* {@link #inverseTransform(double[], int, double[], int) inverseTransform(…)} instead.
*
* @return the inverse of this map projection.
*/
@Override
public MathTransform2D inverse() {
return inverse;
}
示例28
/**
* Returns the inverse of this map projection.
*
* @return the inverse of this map projection.
*/
@Override
public MathTransform2D inverse() {
return inverse;
}
示例29
/**
* Concatenates the given two-dimensional transforms. This is a convenience methods
* delegating to {@link #concatenate(MathTransform, MathTransform)} and casting the
* result to a {@link MathTransform2D} instance.
*
* @param tr1 the first math transform.
* @param tr2 the second math transform.
* @return the concatenated transform.
* @throws MismatchedDimensionException if the output dimension of the first transform
* does not match the input dimension of the second transform.
*/
public static MathTransform2D concatenate(MathTransform2D tr1, MathTransform2D tr2)
throws MismatchedDimensionException
{
return (MathTransform2D) concatenate((MathTransform) tr1, (MathTransform) tr2);
}
示例30
/**
* Concatenates the three given two-dimensional transforms. This is a convenience methods
* delegating to {@link #concatenate(MathTransform, MathTransform, MathTransform)} and
* casting the result to a {@link MathTransform2D} instance.
*
* @param tr1 the first math transform.
* @param tr2 the second math transform.
* @param tr3 the third math transform.
* @return the concatenated transform.
* @throws MismatchedDimensionException if the output dimension of a transform
* does not match the input dimension of next transform.
*/
public static MathTransform2D concatenate(MathTransform2D tr1, MathTransform2D tr2, MathTransform2D tr3)
throws MismatchedDimensionException
{
return (MathTransform2D) concatenate((MathTransform) tr1, (MathTransform) tr2, (MathTransform) tr3);
}