Author: Thomas DuBuisson Copyright: Thomas DuBuisson License: BSD3

A basic GPS library with calculations for distance and speed along with helper functions for filtering/smoothing trails. All distances are in meters and time is in seconds. Speed is thus meters/second

The current intent of this library is to 1) Provide a standard type class interface for coordinates 2) Include fleshed out support for relevant libraries, a task too often neglected in modern Hackage packages.

Integration includes KML support via the xml package, pretty printing, anb binary.

- class Coordinate a where
- toDMS :: a -> DMSCoordinate
- fromDMS :: DMSCoordinate -> a
- distance :: a -> a -> Distance
- heading :: a -> a -> Heading
- getVector :: a -> a -> Vector

- class Coordinate coord => Location loc coord time | loc -> coord, loc -> time where
- data DMSCoordinate = DMSCoord {}
- data DMS = DMS {}
- type Heading = Double
- type Speed = Double
- type Vector = (Distance, Heading)
- type Trail a = [a]
- smoothTrails :: Location a b c => Speed -> Trail a -> [Trail a]
- longestSmoothTrail :: Location a b c => Speed -> Trail a -> Trail a
- restLocations :: Location a b c => Distance -> NominalDiffTime -> Trail a -> [Trail a]
- closestDistance :: Coordinate a => Trail a -> Trail a -> Maybe Distance
- normalizeDMS :: DMSCoordinate -> DMSCoordinate
- type KML = Element
- trailToKML :: Coordinate a => String -> Trail a -> KML
- pointsToKML :: Coordinate a => String -> [a] -> [String] -> KML
- kmlToString :: KML -> String

# Types and Classes

class Coordinate a whereSource

A coordinate is a place on earths surface. While twoDMS and fromDMS are the only required functions, coordinate systems may provide more accurate calculations of heading, distance, and vectors without the intermediate translation.

toDMS :: a -> DMSCoordinateSource

fromDMS :: DMSCoordinate -> aSource

distance :: a -> a -> DistanceSource

Coordinate DMSCoordinate | |

Coordinate c => Coordinate (c, UTCTime) |

class Coordinate coord => Location loc coord time | loc -> coord, loc -> time whereSource

A location is a coordinate at a specific time

getCoordinate :: loc -> coordSource

Coordinate c => Location (c, UTCTime) c UTCTime |

data DMSCoordinate Source

DMSCoordinate is the typical degree minute second for latitude/longitude used by most civilian GPS devices.

DMS is the degree, minute, seconds used for both latitude and longitude

Angles are expressed in radians from North.
0 == North
pi/2 == West
pi == South
(3*2)pi == East == - (pi * 2)

# Helper Functions

smoothTrails :: Location a b c => Speed -> Trail a -> [Trail a]Source

'smoothTrails speed trail' should separate points that would mandate a speed
in excess of the given rate into separate Trails. No point are deleted;
if there is only one `correct`

trail expected then the largest resulting
trail will likely be the one your looking for.

longestSmoothTrail :: Location a b c => Speed -> Trail a -> Trail aSource

longestSmoothTrail is ust `smoothTrails`

returning only the longest smooth trail.

restLocations :: Location a b c => Distance -> NominalDiffTime -> Trail a -> [Trail a]Source

closestDistance :: Coordinate a => Trail a -> Trail a -> Maybe DistanceSource

Returns the closest distance between two trails (or Nothing if a trail is empty) O( (n * m) * log (n * m) )

normalizeDMS :: DMSCoordinate -> DMSCoordinateSource

Typically useful for printing, normalizes degrees*minutes*seconds
into just degrees and decimal minutes:
DMSCoord (DMS 45 36.938455 0) (DMS ...)

# KML Operations (Open format used by GoogleEarth, among others)

The KML type and operations might be moved into a Data.KML module in the future

trailToKML :: Coordinate a => String -> Trail a -> KMLSource

converts a given set of coordinates to a trail in KML format. Useful for saving as a file.

pointsToKML :: Coordinate a => String -> [a] -> [String] -> KMLSource

converts a given set of coordinates to points in KML format. Useful for saving as a file.

kmlToString :: KML -> StringSource

Converts the KML elements to a string and prepends the proper XML header, thus making it the correct format for saving as a file and opening it with other programs such as GoogleEarth.