-- | An elevated curve is a geodetic curve with an elevation in metres. module Data.Geo.ElevatedCurve( ElevatedCurve, elevatedCurve, curveLength ) where import Data.Geo.GeodeticCurve import Data.Geo.Elevation import Data.Geo.Accessor.Curve import Data.Geo.Accessor.Ele import Data.Geo.Accessor.EllipsoidalDistance import Data.Geo.Accessor.Value data ElevatedCurve = ElevatedCurve GeodeticCurve Elevation deriving (Eq, Show) instance Curve ElevatedCurve where curve (ElevatedCurve x _) = x instance Ele ElevatedCurve where ele (ElevatedCurve _ x) = x -- | Construct an elevated curve. elevatedCurve :: GeodeticCurve -> Elevation -> ElevatedCurve elevatedCurve = ElevatedCurve -- | Compute the length of an elevated curve. curveLength :: ElevatedCurve -> Double curveLength c = let d = ellipsoidalDistance . curve $ c square x = x * x in sqrt (square d + square (value . ele $ c))