Select Git revision
GnomonicProjection.java
Forked from
tdt4140-staff / examples
27 commits behind the upstream repository.
-
Hallvard Trætteberg authoredHallvard Trætteberg authored
GnomonicProjection.java 1.64 KiB
/*
* FX Map Control - https://github.com/ClemensFischer/FX-Map-Control
* © 2017 Clemens Fischer
*/
package fxmapcontrol;
import static fxmapcontrol.AzimuthalProjection.getAzimuthDistance;
import javafx.geometry.Point2D;
import static fxmapcontrol.AzimuthalProjection.getLocation;
/**
* Transforms geographic coordinates to cartesian coordinates according to the Gnomonic Projection.
*/
public class GnomonicProjection extends AzimuthalProjection {
public GnomonicProjection() {
this("AUTO2:97001"); // GeoServer non-standard CRS ID
}
public GnomonicProjection(String crsId) {
this.crsId = crsId;
}
@Override
public Point2D locationToPoint(Location location) {
if (location.equals(projectionCenter)) {
return new Point2D(0d, 0d);
}
double[] azimuthDistance = getAzimuthDistance(projectionCenter, location);
double azimuth = azimuthDistance[0];
double distance = azimuthDistance[1];
double mapDistance = distance < Math.PI / 2d ? WGS84_EQUATORIAL_RADIUS * Math.tan(distance) : Double.POSITIVE_INFINITY;
return new Point2D(mapDistance * Math.sin(azimuth), mapDistance * Math.cos(azimuth));
}
@Override
public Location pointToLocation(Point2D point) {
double x = point.getX();
double y = point.getY();
if (x == 0d && y == 0d) {
return projectionCenter;
}
double azimuth = Math.atan2(x, y);
double mapDistance = Math.sqrt(x * x + y * y);
double distance = Math.atan(mapDistance / WGS84_EQUATORIAL_RADIUS);
return getLocation(projectionCenter, azimuth, distance);
}
}