module Numeric.Geocalc (getDistance) where -- |getDistance takes two Coordinates in WSG84 and checks if they are valid. -- If they are it calculets the distance between them in kilometres getDistance :: (Double, Double) -> (Double, Double) -> Maybe Double getDistance (lat1, lon1) (lat2, lon2) | lat1>90.0 || lat1< -90.0 || lon1>180.0 || lon1< -180.0 = Nothing | lat2>90.0 || lat2< -90.0 || lon2>180.0 || lon2< -180.0 = Nothing | otherwise = Just $ 6378.388 * arccosinus ( sinus(lat1) * sinus(lat2) + cosinus(lat1) * cosinus(lat2) * cosinus(lon2-lon1) ) sinus :: Double -> Double sinus = sin . toRadian cosinus :: Double -> Double cosinus = cos . toRadian arccosinus :: Double -> Double arccosinus = acos toRadian :: Double -> Double toRadian deg = pi/180.0 * deg toDegree :: Double -> Double toDegree rad = 180/pi * rad