module Numeric.Geocalc (getDistance) where
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(lon2lon1)
)
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