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 (32)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 degreesminutesseconds 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.