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); }
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)); }
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)); }
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)); }
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); }
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"); }
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(); } }
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); }
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); }
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); }
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); }
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); }
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); }
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"); }
public async Task SetupAsync() => await SatelliteRegistry.InitialiseAsync();
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"); }