117 lines
3.3 KiB
Java
117 lines
3.3 KiB
Java
|
/*
|
|||
|
* Author: Cedric Holzl - Mohamed Khadri
|
|||
|
* Sciper: 257844 - 261203
|
|||
|
*/
|
|||
|
package ch.epfl.alpano;
|
|||
|
|
|||
|
import java.util.Locale;
|
|||
|
import static java.lang.Math.abs;
|
|||
|
import static java.lang.Math.cos;
|
|||
|
import static java.lang.Math.sin;
|
|||
|
import static java.lang.Math.PI;
|
|||
|
import static java.lang.Math.atan2;
|
|||
|
import static java.lang.Math.sqrt;
|
|||
|
import static java.lang.Math.toDegrees;
|
|||
|
import static ch.epfl.alpano.Preconditions.checkArgument;
|
|||
|
import static ch.epfl.alpano.Math2.haversin;
|
|||
|
import static ch.epfl.alpano.Distance.toMeters;
|
|||
|
import static ch.epfl.alpano.Azimuth.fromMath;
|
|||
|
import static ch.epfl.alpano.Azimuth.canonicalize;
|
|||
|
|
|||
|
/**
|
|||
|
* Definition of a geographical point on Earth's surface using spherical
|
|||
|
* coordinates.
|
|||
|
*/
|
|||
|
public class GeoPoint {
|
|||
|
|
|||
|
private final double longitude;
|
|||
|
private final double latitude;
|
|||
|
|
|||
|
/**
|
|||
|
* Constructor of a GeoPoint
|
|||
|
*
|
|||
|
* @param longitude
|
|||
|
* : longitude position
|
|||
|
* @param latitude
|
|||
|
* : latitude position
|
|||
|
* @throws IllegalArgumentException
|
|||
|
* if longitude is not in [−Pi;Pi] or latitude is not in
|
|||
|
* [−2Pi;2Pi]
|
|||
|
*/
|
|||
|
public GeoPoint(double longitude, double latitude) {
|
|||
|
checkArgument(!(abs(longitude) > PI || abs(latitude) * 2.0 > PI));
|
|||
|
|
|||
|
this.longitude = longitude;
|
|||
|
this.latitude = latitude;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Returns the longitude value of the GeoPoint
|
|||
|
*
|
|||
|
* @return longitude
|
|||
|
*/
|
|||
|
public double longitude() {
|
|||
|
return this.longitude;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Returns the latitude value of the GeoPoint
|
|||
|
*
|
|||
|
* @return latitude
|
|||
|
*/
|
|||
|
public double latitude() {
|
|||
|
return this.latitude;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Computes the distance between two points
|
|||
|
*
|
|||
|
* @param that
|
|||
|
* : a GeoPoint
|
|||
|
* @return distance in meters between two points
|
|||
|
*/
|
|||
|
public double distanceTo(GeoPoint that) {
|
|||
|
return toMeters(
|
|||
|
2 * Math.asin(sqrt(haversin(this.latitude - that.latitude)
|
|||
|
+ cos(this.latitude) * cos(that.latitude)
|
|||
|
* haversin(this.longitude - that.longitude))));
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Mathematical angular distance from a geoPoint to another
|
|||
|
*
|
|||
|
* @param that
|
|||
|
* @return angle expressed in radian in the mathematical convention
|
|||
|
*/
|
|||
|
private double mathAzimuthTo(GeoPoint that) {
|
|||
|
return atan2(
|
|||
|
(sin(this.longitude - that.longitude) * cos(that.latitude)),
|
|||
|
(cos(this.latitude) * sin(that.latitude)
|
|||
|
- sin(this.latitude) * cos(that.latitude)
|
|||
|
* cos(this.longitude - that.longitude)));
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Angular distance from a geoPoint to another in azimuth
|
|||
|
*
|
|||
|
* @param that
|
|||
|
* : a GeoPoint
|
|||
|
* @return angle expressed in radian in the azimuth convention
|
|||
|
*/
|
|||
|
public double azimuthTo(GeoPoint that) {
|
|||
|
return fromMath(canonicalize(mathAzimuthTo(that)));
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Redefines the to String method
|
|||
|
*
|
|||
|
* @return a string , [lon,lat], lon and lat being the longitude and
|
|||
|
* latitude values of the GeoPoint
|
|||
|
*/
|
|||
|
@Override
|
|||
|
public String toString() {
|
|||
|
return String.format((Locale) null, "(%.4f,%.4f)",
|
|||
|
toDegrees(this.longitude), toDegrees(this.latitude));
|
|||
|
}
|
|||
|
}
|