EncDotNet.S100.Datasets.TropicalCyclones
0.27.0
See the version list below for details.
dotnet add package EncDotNet.S100.Datasets.TropicalCyclones --version 0.27.0
NuGet\Install-Package EncDotNet.S100.Datasets.TropicalCyclones -Version 0.27.0
<PackageReference Include="EncDotNet.S100.Datasets.TropicalCyclones" Version="0.27.0" />
<PackageVersion Include="EncDotNet.S100.Datasets.TropicalCyclones" Version="0.27.0" />
<PackageReference Include="EncDotNet.S100.Datasets.TropicalCyclones" />
paket add EncDotNet.S100.Datasets.TropicalCyclones --version 0.27.0
#r "nuget: EncDotNet.S100.Datasets.TropicalCyclones, 0.27.0"
#:package EncDotNet.S100.Datasets.TropicalCyclones@0.27.0
#addin nuget:?package=EncDotNet.S100.Datasets.TropicalCyclones&version=0.27.0
#tool nuget:?package=EncDotNet.S100.Datasets.TropicalCyclones&version=0.27.0
EncDotNet.S100.Datasets.TropicalCyclones
EncDotNet.S100.Datasets.TropicalCyclones reads tropical cyclone advisories
from the US National Hurricane Center's GIS data
(https://www.nhc.noaa.gov/gis/) into one model: the storm, the advisory,
every forecast point with its intensity and wind radii, the cone of
uncertainty, and the storm's track so far.
It depends on EncDotNet.S100.Core and
NetTopologySuite. The pipeline processor that loads it,
TropicalCycloneDatasetProcessor, is in
EncDotNet.S100.Datasets.Pipelines,
under the format name TC. The portrayal, TropicalCycloneStyle, is in
EncDotNet.S100.Datasets.Weather.
Not for navigation. NHC advisories aren't S-100 products or official navigational warnings. Hosts label them so wherever they appear.
The design is in the vector weather design note
(docs/design/vector-weather.md, §8.1 and §3.1).
Install
dotnet add package EncDotNet.S100.Datasets.TropicalCyclones
Read an advisory
NHC publishes each advisory as three shapefile zips. Download them into one folder:
| Zip | What it holds | Needed |
|---|---|---|
al092022_5day_020.zip |
Forecast points, track line and cone | Yes |
al092022_fcst_020.zip |
34, 50 and 64 kt wind radii for each forecast time | No |
al092022_best_track.zip |
The storm's past track and observed radii | No |
Then read the forecast zip. The reader finds the other two beside it:
using EncDotNet.S100.Datasets.TropicalCyclones;
var advisory = NhcAdvisoryReader.Read("al092022_5day_020.zip");
Console.WriteLine($"{advisory.Storm.Name} ({advisory.Storm.AtcfId}), advisory {advisory.Advisory}");
Console.WriteLine($"Issued {advisory.IssueTime:u}");
foreach (var point in advisory.Forecast)
{
Console.WriteLine($"+{point.Tau} h {point.ValidTime:u}: {point.Position}, {point.MaxWindKnots} kt, {point.Classification}");
foreach (var radius in point.Radii)
Console.WriteLine($" {radius.ThresholdKnots} kt: NE {radius.NortheastNauticalMiles} nm, SE {radius.SoutheastNauticalMiles} nm, ...");
}
You can also pass a folder holding one storm's zips. The reader takes its
latest advisory, so 20A comes after 20. To read zips that aren't on disk,
pass their streams to NhcAdvisoryReader.Read(forecast, windRadii, bestTrack).
The last two can be null.
What the model holds
TropicalCycloneAdvisory holds:
- Storm. The ATCF id (
AL092022), the name, and the basin, number and year the id gives. - Advisory. The number as NHC writes it (
"20", or"20A"for an intermediate advisory), and the issue time. The issue time keeps the offset of NHC's local time, such as EDT. Hosts show it in the viewer's own zone. - Forecast. One
TropicalCycloneForecastPointper forecast time, in tau order. Each has the valid time in UTC, the position, the maximum wind and gusts, and the class (TropicalCycloneClass, with NHC's code and letter). The point at tau 0 also has the pressure and the storm's motion. Values NHC doesn't forecast arenull. - Wind radii. Each forecast point's 34, 50 and 64 kt radii, as nautical
miles in each quadrant (NE, SE, SW, NW) and NHC's polygon. A radius whose
quadrants are all 0 is left out, so a tropical depression has none.
QuadrantSurface(centre, pointsPerQuadrant)builds the area from the four quadrants, a quarter circle each, for a radius that has no polygon of NHC's. - Cone.
TropicalCycloneConeholds NHC's polygon unchanged, and the same area split at 72 hours intoDaysOneToThreeandDaysFourToFive. It isnullwhen the advisory has no cone, as some final advisories don't. - Past track. The best-track points up to the advisory's synoptic time, with the intensity, class and observed radii at each. A best track downloaded later holds the storm's whole life, so points after the advisory are left out.
- Final advisory.
IsFinalis true for a storm's last advisory, when NHC has stopped issuing advisories for it. NHC's files don't say so: a host that sees the storm leave NHC's active list writes a marker beside the zips (NhcAdvisoryFiles.FinalMarkerName,al092022_final.txt), andNhcAdvisoryFiles.Findreports it (IsFinal) so the reader marks the advisory.
All positions are WGS-84 degrees. NHC computes on a sphere, and the difference is far smaller than the data's precision.
How the cone is split
NHC's GIS files give only the whole five-day cone. The split that the chart draws (days 1 to 3 plain, days 4 and 5 stippled) is made by cutting the cone with a line through the 72-hour position, square to the track there. This matches NHC's own graphic for any track that doesn't double back within the cone. When the forecast ends at or before 72 hours, the whole cone is days 1 to 3.
The storm at a time
advisory.StormAt(time) gives the storm at any time in the advisory's range
as a TropicalCycloneStormAt: its Point (position, intensity, class,
motion and radii, as a forecast point valid at that time) and its Source:
ForecastPointon one of the advisory's forecast points;Estimatedbetween two, interpolated linearly in time: the position on the geodesic between them, the wind, gusts, pressure and each quadrant of each wind radius in between, and the earlier point's class. A radius that's zero at one end shrinks to nothing; when a point has no radii at all the radii are left out. The motion is the direction and speed between the two points. NHC doesn't forecast these positions;BestTrackbefore the advisory's synoptic time, interpolated the same way along the past track, with the observed radii where both points have them.
It's null before the first best-track point and after the last forecast
point. Across the antimeridian the longitude stays on the earlier point's
side, so it can pass 180°.
var storm = advisory.StormAt(new DateTime(2022, 9, 28, 6, 0, 0, DateTimeKind.Utc));
if (storm is { IsEstimated: true })
Console.WriteLine($"est. {storm.Point.Position}, {storm.Point.MaxWindKnots} kt");
Field names
The reader uses these fields, checked against NHC's archived files for 2022 and 2023:
| Layer | Fields |
|---|---|
_5day_pts |
ADVDATE, ADVISNUM, FCSTPRD, TAU, VALIDTIME, LAT, LON, MAXWIND, GUST, MSLP, STORMTYPE, DVLBL, TCDVLP, SSNUM, TCDIR, TCSPD, STORMNAME |
_5day_lin, _5day_pgn |
STORMNAME |
_forecastradii, _initialradii |
TAU, RADII, NE, SE, SW, NW, STORMID, VALIDTIME |
Best track _pts |
YEAR, MONTH, DAY, HHMM, DTG, INTENSITY, MSLP, STORMTYPE, SS, STORMNAME, LAT, LON |
Best track _radii |
SYNOPTIME, RADII, NE, SE, SW, NW |
NHC writes 9999 for a value it leaves out, and the reader returns null for
it. The watches and warnings layer (_ww_wwlin) and the best track's wind
swath aren't read yet.
The shapefiles are read by a small managed SHP and DBF reader in this package. It reads points, lines and polygons, including their Z and M forms. It isn't public API.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- EncDotNet.S100.Core (>= 0.27.0)
- NetTopologySuite (>= 2.6.0)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on EncDotNet.S100.Datasets.TropicalCyclones:
| Package | Downloads |
|---|---|
|
EncDotNet.S100.Datasets.Pipelines
Per-spec IDatasetProcessor implementations, the DatasetPipelineFactory (file -> processor detection), the weather grid processors (NetCDF-CF, GRIB2), the CAP weather warning processor, the tropical cyclone advisory processor (NHC GIS shapefiles), the headless image-render capability, the S-98 interoperability authority, and the validation runner for IHO S-100 product datasets. Consumed by the EncDotNet.S100 convenience package, the viewer, and the s100 CLI. |
|
|
EncDotNet.S100.Datasets.Weather
The shared in-memory model for wind and wave grids read from GRIB2 and NetCDF-CF files: a regular latitude/longitude weather grid set, the canonical parameter table with its GRIB2 and CF mappings, normalisation to the coverage pipeline's grid order, and an ICoverageSource with lazily decoded time steps, overview levels, wind speed and direction derived from U and V, and code-defined coverage styles for wave height, wind barbs, wind speed and wave direction. Also the surface analysis model (fronts, troughs and pressure centres) and a reader for the WPC coded surface bulletins, standard, high resolution and forecast. And the storm-ink portrayal of a tropical cyclone advisory: its cone, wind radii, tracks and WMO class symbols. Not for navigation. Depends on EncDotNet.S100.Core, EncDotNet.S100.Portrayals and EncDotNet.S100.Datasets.TropicalCyclones. |
GitHub repositories
This package is not used by any popular GitHub repositories.