示例#1
0
        public static void ToScanningAngle(LatitudeCalculations latitudeCalculations, double longitude, SatelliteDefinition definition, out double scanningX, out double scanningY)
        {
            var satelliteLongitude = definition.Longitude;
            var satelliteHeight    = definition.Height + RadiusEquator;

            var sx  = satelliteHeight - latitudeCalculations.RcCosLatitude * Cos(longitude - satelliteLongitude);
            var sy  = -latitudeCalculations.RcCosLatitude * Sin(longitude - satelliteLongitude);
            var sy2 = sy * sy;

            // Check if geodetic angle is visible from satellite
            if (satelliteHeight * (satelliteHeight - sx) < sy2 + latitudeCalculations.RadiusRatioSz2)
            {
                scanningX = scanningY = double.NaN;
                return;
            }

            // Calculate (x,y) scanning angle
            scanningX = Asin(-sy / Sqrt(sx * sx + sy2 + latitudeCalculations.Sz2));
            scanningY = Atan(latitudeCalculations.Sz / sx);
        }
示例#2
0
        public static LatitudeCalculations LatitudeCalculations(double latitude)
        {
            var geocentricLatitude = Atan(RadiusPolarSquared / RadiusEquatorSquared * Tan(latitude));
            var cosLatitude        = Cos(geocentricLatitude);
            var sinLatitude        = Sin(geocentricLatitude);

            var rc = RadiusPolar / Sqrt(1 - Eccentricity * Eccentricity * cosLatitude * cosLatitude);
            var sz = rc * sinLatitude;

            var calculations = new LatitudeCalculations
            {
                CosLatitude = cosLatitude,
                Rc          = rc,
                Sz          = sz,
                Sz2         = sz * sz
            };

            calculations.RcCosLatitude  = calculations.Rc * calculations.CosLatitude;
            calculations.RadiusRatioSz2 = RadiusEquatorSquared / RadiusPolarSquared * calculations.Sz2;

            return(calculations);
        }