gps-0.2.4: For manipulating GPS coordinates and trails.




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.


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

heading :: a -> a -> HeadingSource

getVector :: a -> a -> VectorSource

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

A location is a coordinate at a specific time


getCoordinate :: loc -> coordSource

getTime :: loc -> timeSource

getUTC :: loc -> UTCTimeSource

speed :: loc -> loc -> SpeedSource


data DMSCoordinate Source

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




latitude :: DMS
longitude :: DMS

data DMS Source

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




type Heading = DoubleSource

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

type Speed = DoubleSource

Speed is hard coded as meters per second

type Vector = (Distance, Heading)Source

type Trail a = [a]Source

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 degreesminutesseconds into just degrees and decimal minutes: DMSCoord (DMS 45 36.938455 0) (DMS ...)

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

type KML = ElementSource

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.