public final class CoordinateSystems extends Static
CoordinateSystem
objects and their axes.
Those methods allow for example to estimate an angle between two axes
or determining the change of axis directions and units
between two coordinate systems.Defined in the sis-referencing
module
Modifier and Type | Method and Description |
---|---|
static Angle |
angle(AxisDirection source,
AxisDirection target)
Returns the arithmetic (counterclockwise) angle from the first axis direction to the second direction.
|
static AxisDirection |
directionAlongMeridian(AxisDirection baseDirection,
double meridian)
Returns an axis direction from a pole along a meridian.
|
static AxisDirection |
parseAxisDirection(String name)
Returns an axis direction code from the given direction name.
|
static CoordinateSystem |
replaceAxes(CoordinateSystem cs,
AxisFilter filter)
Returns a coordinate system derived from the given one but with a modified list of axes.
|
static Matrix |
swapAndScaleAxes(CoordinateSystem sourceCS,
CoordinateSystem targetCS)
Returns an affine transform between two coordinate systems.
|
public static AxisDirection parseAxisDirection(String name) throws IllegalArgumentException
'-'
, '_'
or spaces as separator between the cardinal points."deg"
or "°"
symbol. Note that the meridian is not necessarily relative
to Greenwich (see directionAlongMeridian(…)
for more information).name
- The direction name (e.g. "north", "north-east", etc.).IllegalArgumentException
- if the given name is not a known axis direction.public static AxisDirection directionAlongMeridian(AxisDirection baseDirection, double meridian)
directionAlongMeridian(AxisDirection.SOUTH, -90)
returns an axis direction for
“South along 90°W”.baseDirection
- The base direction, which must be AxisDirection.NORTH
or AxisDirection.SOUTH
.meridian
- The meridian in degrees, relative to a unspecified (usually Greenwich) prime meridian.
Meridians in the East hemisphere are positive and meridians in the West hemisphere are negative.public static Angle angle(AxisDirection source, AxisDirection target)
null
if no angle can be computed.
EAST
to NORTH
is 90°SOUTH
to WEST
is -90°CoordinateSystem
instance.UP
vertical direction as 90°, and the angle of any compass direction to the DOWN
vertical direction as -90°. The sign of those angles gives no indication about whether the coordinate system
is right-handed or left-handed. Those angles are returned as instances of ElevationAngle
.
All angles are approximative since this method does not take the Earth ellipsoidal or geoidal shape in account.
angle(A, A) = 0°
angle(A, opposite(A)) = ±180°
angle(A, B) = -angle(B, A)
source
- The source axis direction.target
- The target axis direction.null
if this value can not be computed.public static Matrix swapAndScaleAxes(CoordinateSystem sourceCS, CoordinateSystem targetCS) throws IllegalArgumentException, ConversionException
sourceCS
is a CartesianCS
,
then targetCS
must be a CartesianCS
too.
sourceCS
are (x,y) tuples in metres
and coordinates in targetCS
are (-y,x) tuples in centimetres,
then the transformation can be performed as below:
┌ ┐ ┌ ┐ ┌ ┐ │-y(cm)│ │ 0 -100 0 │ │ x(m)│ │ x(cm)│ = │ 100 0 0 │ │ y(m)│ │ 1 │ │ 0 0 1 │ │ 1 │ └ ┘ └ ┘ └ ┘
sourceCS
- The source coordinate system.targetCS
- The target coordinate system.sourceCS
to targetCS
as an affine transform.
Only axis direction and units are taken in account.IllegalArgumentException
- if the CS are not of the same type, or axes do not match.ConversionException
- if the units are not compatible, or the conversion is non-linear.Matrices.createTransform(AxisDirection[], AxisDirection[])
public static CoordinateSystem replaceAxes(CoordinateSystem cs, AxisFilter filter)
CoordinateSystem cs = ...; cs = CoordinateSystems.replaceAxes(cs, new AxisFilter() { @Override public Unit<?> getUnitReplacement(Unit<?> unit) { if (Units.isAngular(unit)) { unit = NonSI.DEGREE_ANGLE; } return unit; } });
swapAndScaleAxes(…)
for normalizing the
coordinate values given to a math transform.
CoordinateSystem sourceCS = ...; CoordinateSystem targetCS = ...; Matrix step1 = swapAndScaleAxes(sourceCS, replaceAxes(sourceCS, AxisConvention.NORMALIZED)); Matrix step2 = ...; // some transform working on coordinates with standard axis order and unit. Matrix step3 = swapAndScaleAxes(replaceAxes(targetCS, AxisConvention.NORMALIZED), targetCS);
cs
- The coordinate system, or null
.filter
- The modifications to apply on coordinate system axes.cs
if the given coordinate system was null or does not need any change.IllegalArgumentException
- if the specified coordinate system can not be normalized.AxesConvention.NORMALIZED
Copyright © 2010–2015 The Apache Software Foundation. All rights reserved.