Пример #1
0
        public async Task GeostationaryUnderlay()
        {
            var definition = SatelliteRegistry.Locate(Goes16DefinitionPrefix);

            Assert.NotNull(definition, "Unable to find satellite definition");

            var options = new UnderlayProjectionData(
                ProjectionType.Geostationary,
                InterpolationType.NearestNeighbour, "underlay.jpg", 5424, 1000);

            var underlay = await UnderlayService.GetUnderlayAsync(options, definition);

            underlay.Width.Should().Be(1000);
            underlay.Height.Should().Be(1000);

            // Retrieve cached
            underlay = await UnderlayService.GetUnderlayAsync(options, definition);

            underlay.Width.Should().Be(1000);
            underlay.Height.Should().Be(1000);

            // Verify changing options doesn't retrieve cached underlay
            options = new UnderlayProjectionData(
                ProjectionType.Geostationary,
                InterpolationType.NearestNeighbour, "underlay.jpg", 5424, 1500);

            underlay = await UnderlayService.GetUnderlayAsync(options, definition);

            underlay.Width.Should().Be(1500);
            underlay.Height.Should().Be(1500);
        }
        public void ProjectionKauai()
        {
            var definition = SatelliteRegistry.Locate(Goes17DefinitionPrefix);

            Assert.NotNull(definition, "Unable to find satellite definition");

            var imageOffset = Constants.Satellite.Offset.TwoKm;

            const int x = 1614;
            const int y = 1564;

            // Convert from scanning angle to geodetic
            var scanningX = imageOffset.ToHorizontalScanningAngle(x);
            var scanningY = imageOffset.ToVerticalScanningAngle(y);

            ReverseGeostationaryProjection.ToLatitudeLongitude(scanningX, scanningY, definition.Longitude, definition.Height, out var latitude, out var longitude);

            FromRadians(latitude).Degrees.Should().BeApproximately(21.869911403254573, Precision);
            FromRadians(longitude).Degrees.Should().BeApproximately(-159.66206692006023, Precision);

            // Convert back to scanning angle
            GeostationaryProjection.ToScanningAngle(latitude, longitude, definition, out var scanningXResult, out var scanningYResult);
            scanningXResult.Should().BeApproximately(scanningX, Precision);
            scanningYResult.Should().BeApproximately(scanningY, Precision);

            imageOffset.ToImageCoordinates(scanningXResult, scanningYResult, out var targetX, out var targetY);

            Math.Round(targetX).Should().BeApproximately(x, PixelPrecision);
            Math.Round(targetY).Should().BeApproximately(y, PixelPrecision);
        }
        public void ProjectionLakeTaupo()
        {
            var definition = SatelliteRegistry.Locate(Goes17DefinitionPrefix);

            Assert.NotNull(definition, "Unable to find satellite definition");

            var imageOffset = Constants.Satellite.Offset.TwoKm;

            const int x = 1050;
            const int y = 4533;

            // Convert from scanning angle to geodetic
            var scanningX = imageOffset.ToHorizontalScanningAngle(x);
            var scanningY = imageOffset.ToVerticalScanningAngle(y);

            ReverseGeostationaryProjection.ToLatitudeLongitude(scanningX, scanningY, definition.Longitude, definition.Height, out var latitude, out var longitude);

            FromRadians(latitude).Degrees.Should().BeApproximately(-38.70625734950147, Precision);
            FromRadians(longitude).Degrees.Should().BeApproximately(175.9626023681634, Precision);

            // Convert back to scanning angle
            GeostationaryProjection.ToScanningAngle(latitude, longitude, definition, out var scanningXResult, out var scanningYResult);
            scanningXResult.Should().BeApproximately(scanningX, Precision);
            scanningYResult.Should().BeApproximately(scanningY, Precision);

            imageOffset.ToImageCoordinates(scanningXResult, scanningYResult, out var targetX, out var targetY);

            Math.Round(targetX).Should().BeApproximately(x, PixelPrecision);
            Math.Round(targetY).Should().BeApproximately(y, PixelPrecision);
        }
        public void ProjectionCalifornia()
        {
            var definition = SatelliteRegistry.Locate(Goes17DefinitionPrefix);

            Assert.NotNull(definition, "Unable to find satellite definition");

            var imageOffset = Constants.Satellite.Offset.TwoKm;

            const int x = 3717;
            const int y = 1275;

            // Convert from scanning angle to geodetic
            var scanningX = imageOffset.ToHorizontalScanningAngle(x);
            var scanningY = imageOffset.ToVerticalScanningAngle(y);

            ReverseGeostationaryProjection.ToLatitudeLongitude(scanningX, scanningY, definition.Longitude, definition.Height, out var latitude, out var longitude);

            FromRadians(latitude).Degrees.Should().BeApproximately(28.007393788242464, Precision);
            FromRadians(longitude).Degrees.Should().BeApproximately(-115.44783176403854, Precision);

            // Convert back to scanning angle
            GeostationaryProjection.ToScanningAngle(latitude, longitude, definition, out var scanningXResult, out var scanningYResult);
            scanningXResult.Should().BeApproximately(scanningX, Precision);
            scanningYResult.Should().BeApproximately(scanningY, Precision);

            imageOffset.ToImageCoordinates(scanningXResult, scanningYResult, out var targetX, out var targetY);

            Math.Round(targetX).Should().BeApproximately(x, PixelPrecision);
            Math.Round(targetY).Should().BeApproximately(y, PixelPrecision);
        }
Пример #5
0
        public void HimawariMatched()
        {
            var(definition, timestamp) = SatelliteRegistry.Locate("c:/images/Himawari8_FD_IR_20200908T015100Z.jpg");
            definition.Should().NotBeNull("satellite definition should have been found");
            timestamp.Should().NotBeNull("timestamp should have been extracted");

            definition !.FilenameParserType.Should().Be(FilenameParserType.Goesproc);
            timestamp.Should().Be(new DateTime(2020, 09, 08, 01, 51, 0));
        }
Пример #6
0
        public void Gk2AMatched()
        {
            var(definition, timestamp) = SatelliteRegistry.Locate("c:/images/IMG_FD_003_IR105_20201217_003006.jpg");
            definition.Should().NotBeNull("satellite definition should have been found");
            timestamp.Should().NotBeNull("timestamp should have been extracted");

            definition !.FilenameParserType.Should().Be(FilenameParserType.Xrit);
            timestamp.Should().Be(new DateTime(2020, 12, 17, 00, 30, 06));
        }
Пример #7
0
        public void Goes16Matched()
        {
            var(definition, timestamp) = SatelliteRegistry.Locate("c:/images/GOES16_FD_CH13_20200908T005019Z.jpg");
            definition.Should().NotBeNull("satellite definition should have been found");
            timestamp.Should().NotBeNull("timestamp should have been extracted");

            definition !.FilenameParserType.Should().Be(FilenameParserType.Goesproc);
            timestamp.Should().Be(new DateTime(2020, 09, 08, 0, 50, 19));
        }
Пример #8
0
        public void ToScanningAngleTopLeft()
        {
            var definition = SatelliteRegistry.Locate(Goes16Filename);

            Assert.NotNull(definition);

            var scanningX = Constants.Satellite.Offset.TwoKm.ToHorizontalScanningAngle(0);
            var scanningY = Constants.Satellite.Offset.TwoKm.ToVerticalScanningAngle(0);

            scanningX.Should().BeApproximately(-0.151844, Precision);
            scanningY.Should().BeApproximately(0.151844, Precision);
        }
        public void TextbookToScanningAngleCentre()
        {
            var definition = SatelliteRegistry.Locate(Goes17DefinitionPrefix);

            Assert.NotNull(definition);

            var scanningX = Constants.Satellite.Offset.TwoKm.ToHorizontalScanningAngle(2712);
            var scanningY = Constants.Satellite.Offset.TwoKm.ToVerticalScanningAngle(2711);

            scanningX.Should().BeApproximately(0.000028, Precision);
            scanningY.Should().BeApproximately(0.000028, Precision);
        }
        public void ToScanningAngleBottomRight()
        {
            var definition = SatelliteRegistry.Locate(Goes17DefinitionPrefix);

            Assert.NotNull(definition);

            var scanningX = Constants.Satellite.Offset.TwoKm.ToHorizontalScanningAngle(5423);
            var scanningY = Constants.Satellite.Offset.TwoKm.ToVerticalScanningAngle(5423);

            scanningX.Should().BeApproximately(0.151844, Precision);
            scanningY.Should().BeApproximately(-0.151844, Precision);
        }
        public void TextbookToImageCoordinates()
        {
            var definition = SatelliteRegistry.Locate(Goes17DefinitionPrefix);

            Assert.NotNull(definition, "Cannot find satellite definition");

            var imageOffset = Constants.Satellite.Offset.TwoKm;

            imageOffset.ToImageCoordinates(0.000028, 0.000028, out var x, out var y);
            x.Should().BeApproximately(2712f, Precision);
            y.Should().BeApproximately(2711f, Precision);
        }
Пример #12
0
        public void ElectroMatched()
        {
            // Verify 4-9 definition
            var(definition, timestamp) = SatelliteRegistry.Locate("c:/images/200830_0230_6.jpg");
            definition.Should().NotBeNull("satellite definition should have been found");
            timestamp.Should().NotBeNull("timestamp should have been extracted");

            definition !.FilenameParserType.Should().Be(FilenameParserType.Electro);
            timestamp.Should().Be(new DateTime(2020, 08, 29, 23, 30, 0));

            // Verify 1-3 definition
            (definition, _) = SatelliteRegistry.Locate("c:/images/200830_0230_1.jpg");
            definition.Should().NotBeNull("satellite definition should have been found");
        }
Пример #13
0
        public void PerformanceTest()
        {
            for (var i = 0; i < 10000; i++)
            {
                var(definition, _) = SatelliteRegistry.Locate("c:/images/GOES17_FD_CH13_20200911T080031Z.jpg");
                definition.Should().NotBeNull();

                (definition, _) = SatelliteRegistry.Locate("c:/images/IMG_FD_020_IR105_20190907_032006.jpg");
                definition.Should().NotBeNull();

                (definition, _) = SatelliteRegistry.Locate("c:/images/EWS-G1_1_20200911T080031Z.jpg");
                definition.Should().NotBeNull();
            }
        }
Пример #14
0
        public void TextbookToScanningAngle()
        {
            var(definition, _) = SatelliteRegistry.Locate(Goes16DefinitionPrefix);
            Assert.NotNull(definition, "Unable to find satellite definition");

            GeostationaryProjection.ToScanningAngle(
                FromDegrees(33.846162).Radians,
                FromDegrees(-84.690932).Radians,
                definition !,
                out var scanningX,
                out var scanningY);

            scanningX.Should().BeApproximately(-0.023807, Precision);
            scanningY.Should().BeApproximately(0.0953439, Precision);
        }
Пример #15
0
        public async Task EquirectangularUnderlay()
        {
            var definition = SatelliteRegistry.Locate(Goes16DefinitionPrefix);

            Assert.NotNull(definition, "Unable to find satellite definition");

            var options = new UnderlayProjectionData(
                ProjectionType.Equirectangular,
                InterpolationType.NearestNeighbour,
                "underlay.jpg",
                5424);

            var underlay = await UnderlayService.GetUnderlayAsync(options, definition);

            underlay.Width.Should().Be(10848);
            underlay.Height.Should().Be(5424);
        }
Пример #16
0
        public async Task EquirectangularUnderlayWithCrop()
        {
            var(definition, _) = SatelliteRegistry.Locate(Goes16DefinitionPrefix);
            Assert.NotNull(definition, "Unable to find satellite definition");

            var options = new UnderlayProjectionData(
                ProjectionType.Equirectangular,
                InterpolationType.NearestNeighbour,
                "underlay.jpg",
                5424,
                latitudeCrop: new Range(Angle.FromDegrees(45), Angle.FromDegrees(-45)));

            RenderOptions.EquirectangularRender = new EquirectangularRenderOptions(false, false, false);
            var underlay = await UnderlayService.GetUnderlayAsync(options, definition);

            underlay.Width.Should().Be(10848);
            underlay.Height.Should().Be(2712);
        }
Пример #17
0
        public async Task EquirectangularUnderlayWithCrop()
        {
            var definition = SatelliteRegistry.Locate(Goes16DefinitionPrefix);

            Assert.NotNull(definition, "Unable to find satellite definition");

            var options = new UnderlayProjectionOptions(
                ProjectionType.Equirectangular,
                InterpolationType.NearestNeighbour,
                5424,
                Constants.DefaultUnderlayPath,
                latitudeCrop: new Range(Angle.FromDegrees(45), Angle.FromDegrees(-45)),
                longitudeCrop: new Range(Angle.FromDegrees(-100), Angle.FromDegrees(100)));

            var underlay = await UnderlayService.GetUnderlayAsync(options, definition);

            underlay.Width.Should().Be(10848);
            underlay.Height.Should().Be(2712);
        }
Пример #18
0
        public async Task EquirectangularUnderlayNoCrop()
        {
            var(definition, _) = SatelliteRegistry.Locate(Goes16DefinitionPrefix);
            Assert.NotNull(definition, "Unable to find satellite definition");

            var data = new UnderlayProjectionData(
                ProjectionType.Equirectangular,
                InterpolationType.NearestNeighbour,
                "underlay.jpg",
                1000,
                new Size(5424, 5424),
                new Range(0, Math.PI / 2));

            RenderOptions.EquirectangularRender = new EquirectangularRenderOptions(false, true, false);
            var underlay = await UnderlayService.GetUnderlayAsync(data, definition);

            underlay.Width.Should().Be(5424);
            underlay.Height.Should().Be(5424);
        }
Пример #19
0
        public void ProjectionFernandinaIsland()
        {
            var(definition, _) = SatelliteRegistry.Locate(Goes16Filename);
            Assert.NotNull(definition, "Unable to find satellite definition");

            var imageOffset = Constants.Satellite.Offset.TwoKm;

            const int x = 4866;
            const int y = 2735;

            // Convert from scanning angle to geodetic
            var scanningX = imageOffset.ToHorizontalScanningAngle(x);
            var scanningY = imageOffset.ToVerticalScanningAngle(y);

            ReverseGeostationaryProjection.ToLatitudeLongitude(scanningX, scanningY, definition !.Longitude, definition.Height, out var latitude, out var longitude);

            FromRadians(latitude).Degrees.Should().BeApproximately(-0.4489090116682934, Precision);
            FromRadians(longitude).Degrees.Should().BeApproximately(-91.39243691622593, Precision);
        }
Пример #20
0
 public void NwsNotMatched()
 {
     var(definition, _) = SatelliteRegistry.Locate("c:/images/20210101T230000Z_20210101230001-pac48per_latestBW.gif");
     definition.Should().BeNull("satellite definition should not have been found for an NWS image");
 }
Пример #21
0
 public async Task SetupAsync() => await SatelliteRegistry.InitialiseAsync();
Пример #22
0
 public void Goes16EnhancedNotMatched()
 {
     var(definition, _) = SatelliteRegistry.Locate("c:/images/GOES16_FD_CH13_enhanced_20200908T005019Z.jpg");
     definition.Should().BeNull("satellite definition should have not have been found for enhanced images");
 }