Class DistanceUtils
DistanceCalculator, retrieved from SpatialContext.getDistCalc() should be used in preference to calling
these methods directly.
This code came from Apache Lucene, LUCENE-1387, which in turn came from "LocalLucene".
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final doublestatic final doubleDeprecated.static final doubleDeprecated.static final doubleDeprecated.static final doublestatic final doubleEquivalent to degrees2Dist(1, EARTH_MEAN_RADIUS_KM)static final doublestatic final doublestatic final doublestatic final doubleThe International Union of Geodesy and Geophysics says the Earth's mean radius in KM is: [1] http://en.wikipedia.org/wiki/Earth_radiusstatic final doublestatic final doublestatic final doublestatic final doublestatic final doublestatic final doubleDeprecated. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic doublecalcBoxByDistFromPt_deltaLonDEG(double lat, double lon, double distDEG) The delta longitude of a point-distance.static doublecalcBoxByDistFromPt_latHorizAxisDEG(double lat, double lon, double distDEG) The latitude of the horizontal axis (e.g.static RectanglecalcBoxByDistFromPtDEG(double lat, double lon, double distDEG, SpatialContext ctx, Rectangle reuse) Calculates the bounding box of a circle, as specified by its center point and distance.static doublecalcLonDegreesAtLat(double lat, double dist) Calculates the degrees longitude distance at latitudelatto cover a distancedist.static doubledegrees2Dist(double degrees, double radius) Convertsdegrees(1/360th of circumference of a circle) into a distance as measured by the units of the radius.static doubledist2Degrees(double dist, double radius) Converts a distance in the units of the radius to degrees (360 degrees are in a circle).static doubledist2Radians(double dist, double radius) Converts a distance in the units ofradius(e.g.static doubledistHaversineRAD(double lat1, double lon1, double lat2, double lon2) static doubledistLawOfCosinesRAD(double lat1, double lon1, double lat2, double lon2) Calculates the distance between two lat-lon's using the Law of Cosines.static doubledistSquaredCartesian(double[] vec1, double[] vec2) Deprecated.static doubledistVincentyRAD(double lat1, double lon1, double lat2, double lon2) Calculates the great circle distance using the Vincenty Formula, simplified for a spherical model.static doublenormLatDEG(double lat_deg) Puts in range -90 <= lat_deg <= 90.static doublenormLonDEG(double lon_deg) Puts in range -180 <= lon_deg <= +180.static PointpointOnBearingRAD(double startLat, double startLon, double distanceRAD, double bearingRAD, SpatialContext ctx, Point reuse) Given a start point (startLat, startLon), distance, and a bearing on a sphere, return the destination point.static doubleradians2Dist(double radians, double radius) Convertsradians(multiples of theradius) to distance in the units of the radius (e.g.static doubletoDegrees(double radians) Same asMath.toDegrees(double)but 3x faster (multiply vs.static doubletoRadians(double degrees) Same asMath.toRadians(double)but 3x faster (multiply vs.static double[]vectorBoxCorner(double[] center, double[] result, double distance, boolean upperRight) Deprecated.static doublevectorDistance(double[] vec1, double[] vec2, double power) Deprecated.static doublevectorDistance(double[] vec1, double[] vec2, double power, double oneOverPower) Deprecated.
-
Field Details
-
DEG_45_AS_RADS
-
SIN_45_AS_RADS
Deprecated. -
DEG_90_AS_RADS
public static final double DEG_90_AS_RADS- See Also:
-
DEG_180_AS_RADS
public static final double DEG_180_AS_RADS- See Also:
-
DEG_225_AS_RADS
-
DEG_270_AS_RADS
-
DEGREES_TO_RADIANS
public static final double DEGREES_TO_RADIANS- See Also:
-
RADIANS_TO_DEGREES
public static final double RADIANS_TO_DEGREES- See Also:
-
KM_TO_MILES
public static final double KM_TO_MILES- See Also:
-
MILES_TO_KM
public static final double MILES_TO_KM- See Also:
-
EARTH_MEAN_RADIUS_KM
public static final double EARTH_MEAN_RADIUS_KMThe International Union of Geodesy and Geophysics says the Earth's mean radius in KM is: [1] http://en.wikipedia.org/wiki/Earth_radius- See Also:
-
EARTH_EQUATORIAL_RADIUS_KM
public static final double EARTH_EQUATORIAL_RADIUS_KM- See Also:
-
DEG_TO_KM
public static final double DEG_TO_KMEquivalent to degrees2Dist(1, EARTH_MEAN_RADIUS_KM)- See Also:
-
KM_TO_DEG
public static final double KM_TO_DEG- See Also:
-
EARTH_MEAN_RADIUS_MI
public static final double EARTH_MEAN_RADIUS_MI- See Also:
-
EARTH_EQUATORIAL_RADIUS_MI
public static final double EARTH_EQUATORIAL_RADIUS_MI- See Also:
-
-
Constructor Details
-
DistanceUtils
private DistanceUtils()
-
-
Method Details
-
vectorDistance
Deprecated.Calculate the p-norm (i.e. length) between two vectors.See Lp space
- Parameters:
vec1- The first vectorvec2- The second vectorpower- The power (2 for cartesian distance, 1 for manhattan, etc.)- Returns:
- The length.
- See Also:
-
vectorDistance
@Deprecated public static double vectorDistance(double[] vec1, double[] vec2, double power, double oneOverPower) Deprecated.Calculate the p-norm (i.e. length) between two vectors.- Parameters:
vec1- The first vectorvec2- The second vectorpower- The power (2 for cartesian distance, 1 for manhattan, etc.)oneOverPower- If you've pre-calculated oneOverPower and cached it, use this method to save one division operation overvectorDistance(double[], double[], double).- Returns:
- The length.
-
vectorBoxCorner
@Deprecated public static double[] vectorBoxCorner(double[] center, double[] result, double distance, boolean upperRight) Deprecated.Return the coordinates of a vector that is the corner of a box (upper right or lower left), assuming a Rectangular coordinate system. Note, this does not apply for points on a sphere or ellipse (although it could be used as an approximation).- Parameters:
center- The center pointresult- Holds the result, potentially resizing if needed.distance- The d from the center to the cornerupperRight- If true, return the coords for the upper right corner, else return the lower left.- Returns:
- The point, either the upperLeft or the lower right
-
pointOnBearingRAD
public static Point pointOnBearingRAD(double startLat, double startLon, double distanceRAD, double bearingRAD, SpatialContext ctx, Point reuse) Given a start point (startLat, startLon), distance, and a bearing on a sphere, return the destination point.- Parameters:
startLat- The starting point latitude, in radiansstartLon- The starting point longitude, in radiansdistanceRAD- The distance to travel along the bearing in radians.bearingRAD- The bearing, in radians. North is a 0, moving clockwise till radians(360).reuse- A preallocated object to hold the results.- Returns:
- The destination point, IN RADIANS.
-
normLonDEG
public static double normLonDEG(double lon_deg) Puts in range -180 <= lon_deg <= +180. -
normLatDEG
public static double normLatDEG(double lat_deg) Puts in range -90 <= lat_deg <= 90. -
calcBoxByDistFromPtDEG
public static Rectangle calcBoxByDistFromPtDEG(double lat, double lon, double distDEG, SpatialContext ctx, Rectangle reuse) Calculates the bounding box of a circle, as specified by its center point and distance.reuseis an optional argument to store the results to avoid object creation. -
calcBoxByDistFromPt_deltaLonDEG
public static double calcBoxByDistFromPt_deltaLonDEG(double lat, double lon, double distDEG) The delta longitude of a point-distance. In other words, half the width of the bounding box of a circle. -
calcBoxByDistFromPt_latHorizAxisDEG
public static double calcBoxByDistFromPt_latHorizAxisDEG(double lat, double lon, double distDEG) The latitude of the horizontal axis (e.g. left-right line) of a circle. The horizontal axis of a circle passes through its furthest left-most and right-most edges. On a 2D plane, this result is alwaysfrom.getY()but, perhaps surprisingly, on a sphere it is going to be slightly different. -
calcLonDegreesAtLat
public static double calcLonDegreesAtLat(double lat, double dist) Calculates the degrees longitude distance at latitudelatto cover a distancedist.Used to calculate a new expanded buffer distance to account for skewing effects for shapes that use the lat-lon space as a 2D plane instead of a sphere. The expanded buffer will be sure to cover the intended area, but the shape is still skewed and so it will cover a larger area. For latitude 0 (the equator) the result is the same buffer. At 60 (or -60) degrees, the result is twice the buffer, meaning that a shape at 60 degrees is twice as high as it is wide when projected onto a lat-lon plane even if in the real world it's equal all around.
If the result added to abs(
lat) is >= 90 degrees, then skewing is so severe that the caller should consider tossing the shape and substituting a spherical cap instead.- Parameters:
lat- latitude in degreesdist- distance in degrees- Returns:
- longitudinal degrees (x delta) at input latitude that is >= dist distance. Will be >= dist and <= 90.
-
distSquaredCartesian
Deprecated.The square of the cartesian Distance. Not really a distance, but useful if all that matters is comparing the result to another one.- Parameters:
vec1- The first pointvec2- The second point- Returns:
- The squared cartesian distance
-
distHaversineRAD
public static double distHaversineRAD(double lat1, double lon1, double lat2, double lon2) - Parameters:
lat1- The y coordinate of the first point, in radianslon1- The x coordinate of the first point, in radianslat2- The y coordinate of the second point, in radianslon2- The x coordinate of the second point, in radians- Returns:
- The distance between the two points, as determined by the Haversine formula, in radians.
-
distLawOfCosinesRAD
public static double distLawOfCosinesRAD(double lat1, double lon1, double lat2, double lon2) Calculates the distance between two lat-lon's using the Law of Cosines. Due to numeric conditioning errors, it is not as accurate as the Haversine formula for small distances. But with double precision, it isn't that bad -- allegedly 1 meter.The arguments and return value are in radians.
-
distVincentyRAD
public static double distVincentyRAD(double lat1, double lon1, double lat2, double lon2) Calculates the great circle distance using the Vincenty Formula, simplified for a spherical model. This formula is accurate for any pair of points. The equation was taken from Wikipedia.The arguments are in radians, and the result is in radians.
-
dist2Degrees
public static double dist2Degrees(double dist, double radius) Converts a distance in the units of the radius to degrees (360 degrees are in a circle). A spherical earth model is assumed. -
degrees2Dist
public static double degrees2Dist(double degrees, double radius) Convertsdegrees(1/360th of circumference of a circle) into a distance as measured by the units of the radius. A spherical earth model is assumed. -
dist2Radians
public static double dist2Radians(double dist, double radius) Converts a distance in the units ofradius(e.g. kilometers) to radians (multiples of the radius). A spherical earth model is assumed. -
radians2Dist
public static double radians2Dist(double radians, double radius) Convertsradians(multiples of theradius) to distance in the units of the radius (e.g. kilometers). -
toRadians
public static double toRadians(double degrees) Same asMath.toRadians(double)but 3x faster (multiply vs. divide). See CompareRadiansSnippet.java in tests. -
toDegrees
public static double toDegrees(double radians) Same asMath.toDegrees(double)but 3x faster (multiply vs. divide). See CompareRadiansSnippet.java in tests.
-