| Copyright | (c) 2018 Cedric Liegeois |
|---|---|
| License | BSD3 |
| Maintainer | Cedric Liegeois <ofmooseandmen@yahoo.fr> |
| Stability | experimental |
| Portability | portable |
| Safe Haskell | Safe |
| Language | Haskell2010 |
Data.Geo.Jord.Position
Description
Types and functions for working with positions.
All functions are implemented using the vector-based approached described in Gade, K. (2010). A Non-singular Horizontal Position Representation
This module assumes a spherical earth.
Synopsis
- class Position a where
- angularDistance :: NVector -> NVector -> Maybe NVector -> Angle
- antipode :: Position a => a -> a
- destination :: Position a => a -> Angle -> Length -> a
- destination' :: Position a => a -> Angle -> Length -> Length -> a
- distance :: Position a => a -> a -> Length
- distance' :: Position a => a -> a -> Length -> Length
- finalBearing :: Position a => a -> a -> Angle
- initialBearing :: Position a => a -> a -> Angle
- interpolate :: Position a => a -> a -> Double -> a
- isInside :: (Eq a, Position a) => a -> [a] -> Bool
- mean :: Position a => [a] -> Maybe a
- meanEarthRadius :: Length
- northPole :: Position a => a
- southPole :: Position a => a
The Position type
class Position a where Source #
The Position class defines 2 functions to convert a position to and from a NVector.
All functions in this module first convert Position to NVector and any resulting NVector back
to a Position. This allows the call site to pass either NVector or LatLong and to get back
the same class instance.
Minimal complete definition
Methods
fromNVector :: NVector -> a Source #
Geodetic calculations
destination :: Position a => a -> Angle -> Length -> a Source #
destination' assuming a radius of meanEarthRadius.
distance' :: Position a => a -> a -> Length -> Length Source #
Computes the surface distance (length of geodesic) in Meters assuming a
spherical Earth between the two given Positions and using the given earth radius.
finalBearing :: Position a => a -> a -> Angle Source #
Computes the final bearing arriving at given destination p2 Position from given Position p1.
the final bearing will differ from the initialBearing by varying degrees according to distance and latitude.
Returns 180 if both position are equals.
initialBearing :: Position a => a -> a -> Angle Source #
interpolate :: Position a => a -> a -> Double -> a Source #
isInside :: (Eq a, Position a) => a -> [a] -> Bool Source #
Determines whether the given Position is inside the polygon defined by the given list of Positions.
The polygon is closed if needed (i.e. if head ps /= last ps).
Uses the angle summation test: on a sphere, due to spherical excess, enclosed point angles will sum to less than 360°, and exterior point angles will be small but non-zero.
Always returns False if positions does not at least defines a triangle.
mean :: Position a => [a] -> Maybe a Source #
Computes the geographic mean Position of the given Positions if it is defined.
The geographic mean is not defined for the antipodals positions (since they cancel each other).
Special conditions:
mean [] == Nothing
mean [p] == Just p
mean [p1, p2, p3] == Just circumcentre
mean [p1, .., antipode p1] == Nothing
Misc.
meanEarthRadius :: Length Source #
Mean Earth radius: 6,371,008.8 metres.