wx

package
v0.14.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 5, 2026 License: GPL-3.0 Imports: 30 Imported by: 0

Documentation

Index

Constants

View Source
const METARFilename = "METAR-flate.msgpack.zst"

METARFilename is the standard filename for the consolidated METAR file

View Source
const ManifestFilename = "manifest-int64time.msgpack.zst"

ManifestFilename is the standard filename for int64-based compressed manifests

View Source
const NumSampleLevels = 40

This is fairly specialized to our needs we ingest from: at each lat-long, we store a vertical stack of 40 levels with samples from the source HRRR files (wind direction, speed, temperature, dewpoint, height). The vertical indexing of is low to high where LevelIndexFromId and IdFromLevelIndex perform the indexing and its inverse.

Variables

View Source
var AtmosARTCCs = []string{

	"ZAB", "ZAN", "ZAU", "ZBW", "ZDC", "ZDV", "ZFW", "ZHU",
	"ZID", "ZJX", "ZKC", "ZLA", "ZLC", "ZMA", "ZME", "ZMP", "ZNY",
	"ZOA", "ZOB", "ZSE", "ZTL",
}
View Source
var AtmosTRACONs = []string{
	"A11", "A80", "A90", "AAC", "ABE", "ABQ", "AGS", "ALB", "ASE", "AUS", "AVL", "BGR", "BHM", "BIL", "BNA", "BOI",
	"BTV", "BUF", "C90", "CHS", "CID", "CLE", "CLT", "COS", "CPR", "D01", "D10", "D21", "DAB", "EWR", "F11", "GSO",
	"GSP", "GTF", "I90", "IND", "JAX", "L30", "M98", "MCI", "MDT", "MIA", "MKE", "N90", "NCT", "OKC", "P31", "P50",
	"P80", "PCT", "PHL", "PIT", "PVD", "PWM", "R90", "RDU", "S46", "S56", "SAT", "SAV", "SBA", "SBN", "SCT", "SDF",
	"SGF", "SYR", "TPA", "Y90",

	"FAI",
}

vice -listscenarios 2>/dev/null | cut -d / -f 1 | uniq

Functions

func AtmosIntervals added in v0.13.2

func AtmosIntervals(times []time.Time) []util.TimeInterval

AtmosIntervals converts atmosphere timestamps to time intervals suitable for weather data.

func BuildObjectPath added in v0.13.2

func BuildObjectPath(prefix, identifier string, t time.Time) string

BuildObjectPath constructs a weather data object path from a prefix, identifier, and timestamp. Returns a path in the format: "prefix/identifier/{RFC3339 time}.msgpack.zst"

func CheckAtmosConversion added in v0.13.0

func CheckAtmosConversion(at AtmosByPoint, soa AtmosByPointSOA) error

func FetchRadarImage

func FetchRadarImage(center math.Point2LL, radius float32, resolution int) (image.Image, math.Extent2D, error)

func FullDataDays added in v0.13.0

func FullDataDays(metar, precip, atmos []time.Time) []util.TimeInterval

FullDataDays computes time intervals where all three data sources (METAR, precip, atmos) have continuous coverage, aligned to full 24-hour periods at midnight UTC.

func GetMETAR added in v0.14.0

func GetMETAR(airports []string) (map[string]METARSOA, error)

GetMETAR returns METAR data from bundled resources for the specified airports.

func GetTimeIntervals added in v0.14.0

func GetTimeIntervals() map[string][]util.TimeInterval

GetTimeIntervals returns available time intervals from bundled resources. Returns a map from TRACON to available time intervals.

func IdFromLevelIndex added in v0.13.0

func IdFromLevelIndex(i int) string

func LevelIndexFromId added in v0.13.0

func LevelIndexFromId(b []byte) int

func METARIntervals added in v0.13.2

func METARIntervals(times []time.Time) []util.TimeInterval

METARIntervals converts METAR timestamps to time intervals suitable for weather data.

func ManifestPath added in v0.13.2

func ManifestPath(prefix string) string

ManifestPath returns the full path to a manifest file for a given prefix

func MergeAndAlignToMidnight added in v0.13.2

func MergeAndAlignToMidnight(intervals ...[]util.TimeInterval) []util.TimeInterval

MergeAndAlignToMidnight merges multiple sets of time intervals and aligns them to full 24-hour periods starting and ending at midnight UTC (0000Z).

func MonthlyManifestPath added in v0.13.2

func MonthlyManifestPath(prefix, month string) string

MonthlyManifestPath returns the full path to a monthly manifest file. The month parameter should be in "YYYY-MM" format (e.g., "2025-08"). Returns a path like "prefix/manifest-int64time-YYYY-MM.msgpack.zst"

func MonthlyManifestPrefix added in v0.13.2

func MonthlyManifestPrefix(prefix string) string

MonthlyManifestPrefix returns the prefix used for listing monthly manifest files. Returns a prefix like "prefix/manifest-int64time-"

func ParseWeatherObjectPath added in v0.13.2

func ParseWeatherObjectPath(relativePath string) (identifier string, timestamp int64, err error)

ParseWeatherObjectPath extracts the TRACON/airport identifier and timestamp from a weather data object path. Expected format: "TRACON/2025-08-06T03:00:00Z.msgpack.zst"

func PrecipIntervals added in v0.13.2

func PrecipIntervals(times []time.Time) []util.TimeInterval

PrecipIntervals converts precipitation timestamps to time intervals suitable for weather data.

func PressureFromLevelIndex added in v0.13.0

func PressureFromLevelIndex(i int) float32

PressureFromLevelIndex returns pressure in millibars at the level.

func RadarImageToDBZ

func RadarImageToDBZ(img image.Image) []byte

Types

type AtmosByPoint added in v0.13.0

type AtmosByPoint struct {
	// Lat-longs to stack of levels
	SampleStacks map[math.Point2LL]*AtmosSampleStack
}

func MakeAtmosByPoint added in v0.13.0

func MakeAtmosByPoint() AtmosByPoint

func (*AtmosByPoint) Average added in v0.13.0

func (ap *AtmosByPoint) Average() (math.Point2LL, *AtmosSampleStack)

Average returns the averaged location and atmospheric data across all sample stacks

func (AtmosByPoint) GetGrid added in v0.13.0

func (ap AtmosByPoint) GetGrid() *AtmosGrid

func (AtmosByPoint) ToSOA added in v0.13.0

func (ap AtmosByPoint) ToSOA() (AtmosByPointSOA, error)

type AtmosByPointSOA added in v0.13.0

type AtmosByPointSOA struct {
	Lat, Long []float32
	Levels    [NumSampleLevels]AtmosLevelsSOA
}

For storage, this information is encoded in structure-of-arrays format, which makes it more compressible.

func MakeFallbackAtmosFromMETAR added in v0.13.2

func MakeFallbackAtmosFromMETAR(metar METAR, location math.Point2LL) (*AtmosByPointSOA, error)

MakeFallbackAtmosFromMETAR creates a simple AtmosByPointSOA from METAR wind data. This is used as a fallback when actual atmospheric data is not available for a TRACON. The resulting grid has a single point at the specified location with uniform wind at all altitude levels based on the METAR surface wind.

func (AtmosByPointSOA) ToAOS added in v0.13.0

func (atsoa AtmosByPointSOA) ToAOS() AtmosByPoint

type AtmosByTime added in v0.13.0

type AtmosByTime struct {
	SampleStacks map[time.Time]*AtmosSampleStack
}

func GetAtmosByTime added in v0.14.0

func GetAtmosByTime(tracon string) (*AtmosByTime, error)

GetAtmosByTime returns atmospheric data for a TRACON from bundled resources.

func (*AtmosByTime) GetWindsAloftAtTime added in v0.14.0

func (at *AtmosByTime) GetWindsAloftAtTime(t time.Time, altitudeFeet float32) (direction, speed float32, ok bool)

GetWindsAloftAtTime returns wind direction (true heading, degrees) and speed (knots) at the given altitude for the given time. If no data is available, ok is false. Uses linear interpolation between pressure levels.

func (AtmosByTime) ToSOA added in v0.13.0

func (at AtmosByTime) ToSOA() (AtmosByTimeSOA, error)

type AtmosByTimeSOA added in v0.13.0

type AtmosByTimeSOA struct {
	Times  []int64 // Delta-encoded Unix timestamps
	Levels [NumSampleLevels]AtmosLevelsSOA
}

AtmosByTimeSOA stores atmospheric data for multiple time points at a single location (used for offline weather packaging)

func (AtmosByTimeSOA) ToAOS added in v0.13.0

func (atsoa AtmosByTimeSOA) ToAOS() AtmosByTime

type AtmosGrid added in v0.13.0

type AtmosGrid struct {
	Extent   math.Extent2D
	Res      [3]int
	AltRange [2]float32
	Points   []Sample
	// contains filtered or unexported fields
}

func MakeAtmosGrid added in v0.13.0

func MakeAtmosGrid(sampleStacks map[math.Point2LL]*AtmosSampleStack) *AtmosGrid

func (*AtmosGrid) AltitudeForIndex added in v0.13.0

func (g *AtmosGrid) AltitudeForIndex(idx int) float32

func (*AtmosGrid) Lookup added in v0.13.0

func (g *AtmosGrid) Lookup(p math.Point2LL, alt float32) (Sample, bool)

func (*AtmosGrid) PtToGrid added in v0.14.0

func (g *AtmosGrid) PtToGrid(p [2]float32) [2]float32

func (*AtmosGrid) SamplesAtLevel added in v0.13.0

func (g *AtmosGrid) SamplesAtLevel(level, step int) iter.Seq2[math.Point2LL, Sample]

type AtmosLevelsSOA added in v0.13.0

type AtmosLevelsSOA struct {
	// All of the following are delta encoded
	Heading     []uint8 // degrees/2
	Speed       []uint8 // knots
	Temperature []int8  // Temperature in Celsius
	Dewpoint    []int8  // Dewpoint in Celsius
	Height      []uint8 // geopotential height (MSL) + windHeightOffset in meters
}

type AtmosResult added in v0.13.0

type AtmosResult struct {
	AtmosByPointSOA *AtmosByPointSOA
	Time            time.Time
	NextTime        time.Time
	Err             error
}

type AtmosSample added in v0.13.0

type AtmosSample struct {
	UComponent  float32 // eastward velocity m/s
	VComponent  float32 // northward velocity m/s
	Temperature float32 // Kelvin
	Dewpoint    float32 // Kelvin
	Height      float32 // geopotential height (meters)
}

AtmosSample stores wind as velocity vectors (direction the air mass is moving). UComponent is the eastward wind velocity in m/s (positive = moving east). VComponent is the northward wind velocity in m/s (positive = moving north). These match the standard GRIB2 UGRD/VGRD convention.

type AtmosSampleStack added in v0.13.0

type AtmosSampleStack struct {
	Levels [NumSampleLevels]AtmosSample
}

type CompressedMETAR added in v0.13.2

type CompressedMETAR struct {
	// contains filtered or unexported fields
}

CompressedMETAR is a collection of compressed METAR data indexed by ICAO code.

func LoadCompressedMETAR added in v0.13.2

func LoadCompressedMETAR(r io.Reader) (CompressedMETAR, error)

LoadCompressedMETAR reads a complete compressed METAR file The reader should be the zstd-compressed msgpack file.

func NewCompressedMETAR added in v0.13.2

func NewCompressedMETAR() CompressedMETAR

NewCompressedMETAR creates a new empty CompressedMETAR collection.

func (CompressedMETAR) Airports added in v0.13.2

func (cm CompressedMETAR) Airports() iter.Seq[string]

func (CompressedMETAR) GetAirportMETAR added in v0.13.2

func (cm CompressedMETAR) GetAirportMETAR(icao string) ([]METAR, error)

GetAirportMETAR retrieves and decodes METAR data for a specific ICAO airport code.

func (CompressedMETAR) GetAirportMETARSOA added in v0.13.2

func (cm CompressedMETAR) GetAirportMETARSOA(icao string) (METARSOA, error)

func (CompressedMETAR) Len added in v0.13.2

func (cm CompressedMETAR) Len() int

func (CompressedMETAR) MarshalMsgpack added in v0.13.2

func (cm CompressedMETAR) MarshalMsgpack() ([]byte, error)

MarshalMsgpack implements custom msgpack encoding for CompressedMETAR. This allows the unexported field 'm' to be properly serialized.

func (CompressedMETAR) Save added in v0.13.2

func (cm CompressedMETAR) Save(w io.Writer) error

SaveMETAR writes a complete METAR file (METARFilename format). The data should be a map of airport ICAO codes to compressed METARSOA data. The writer will receive zstd-compressed msgpack data.

func (CompressedMETAR) SetAirportMETAR added in v0.13.2

func (cm CompressedMETAR) SetAirportMETAR(icao string, metar []METAR) error

func (*CompressedMETAR) UnmarshalMsgpack added in v0.13.2

func (cm *CompressedMETAR) UnmarshalMsgpack(b []byte) error

UnmarshalMsgpack implements custom msgpack decoding for CompressedMETAR. This allows the unexported field 'm' to be properly deserialized.

type FlightRulesFilter added in v0.14.0

type FlightRulesFilter int

FlightRulesFilter represents user preference for VMC/IMC

const (
	FlightRulesAny FlightRulesFilter = iota
	FlightRulesVMC
	FlightRulesIMC
)

type GustFilter added in v0.14.0

type GustFilter int

GustFilter represents user preference for gusting winds

const (
	GustAny GustFilter = iota
	GustYes
	GustNo
)

type METAR

type METAR struct {
	ICAO        string `json:"icaoId"`
	Time        time.Time
	Temperature float32 `json:"temp"`
	Dewpoint    float32 `json:"dewp"`
	Altimeter   float32 `json:"altim"`
	WindDir     *int    `json:"-"` // nil for variable winds, otherwise heading 0-360
	WindSpeed   int     `json:"wspd"`
	WindGust    *int    `json:"wgst"`
	Raw         string  `json:"rawOb"`

	// WindDirRaw and ReportTime are used for JSON unmarshaling only
	WindDirRaw any    `json:"wdir"` // nil or string "VRB" for variable, else number for heading
	ReportTime string `json:"reportTime"`
}

This is as much of the METAR as we need at runtime.

func METARForTime added in v0.13.0

func METARForTime(metar []METAR, t time.Time) METAR

func SampleMETAR added in v0.13.0

func SampleMETAR(metar []METAR, intervals []util.TimeInterval, avgHdg float32) *METAR

Given an average headings (e.g. runway directions) and a slice of valid time intervals, randomly sample a METAR entry with wind that is compatible with the headings.

func SampleMETARWithFilter added in v0.14.0

func SampleMETARWithFilter(metar []METAR, intervals []util.TimeInterval, filter *WeatherFilter, magVar float32) *METAR

SampleMETARWithFilter randomly samples a METAR that matches the weather filter

func SampleMETARWithSpec added in v0.13.0

func SampleMETARWithSpec(metar []METAR, intervals []util.TimeInterval, spec *WindSpecifier, magVar float32) *METAR

SampleMETARWithSpec randomly samples a METAR that matches the wind specifier

func SampleMatchingMETAR added in v0.13.0

func SampleMatchingMETAR(metar []METAR, intervals []util.TimeInterval, match func(METAR) bool) *METAR

SampleMatchingMETAR randomly samples from METARs that match a predicate using reservoir sampling

func SampleWeatherWithFilter added in v0.14.0

func SampleWeatherWithFilter(
	metar []METAR,
	atmosByTime *AtmosByTime,
	intervals []util.TimeInterval,
	filter *WeatherFilter,
	windsAloftAltitude float32,
	magVar float32,
) *METAR

SampleWeatherWithFilter randomly samples a METAR that matches both ground wind filter (METAR) and winds aloft filter (atmospheric data at specified altitude). If atmosByTime is nil, only the ground wind filter is checked.

func (METAR) Altimeter_inHg

func (m METAR) Altimeter_inHg() float32

func (METAR) Ceiling added in v0.13.0

func (m METAR) Ceiling() (int, error)

Ceiling returns ceiling in feet AGL (above ground level)

func (METAR) IsVMC added in v0.13.0

func (m METAR) IsVMC() bool

IsVMC returns true if Visual Meteorological Conditions apply VMC requires >= 3 miles visibility and >= 1000' ceiling AGL

func (*METAR) UnmarshalJSON added in v0.13.0

func (m *METAR) UnmarshalJSON(data []byte) error

UnmarshalJSON handles converting WindDirRaw to WindDir

func (METAR) Visibility added in v0.13.0

func (m METAR) Visibility() (float32, error)

Visibility extracts visibility in statute miles from the raw METAR

type METARSOA added in v0.13.0

type METARSOA struct {
	// These are all delta coded
	ReportTime  [][]byte
	Temperature []int16 // fixed point, one decimal digit
	Dewpoint    []int16 // fixed point, one decimal digit
	Altimeter   []int16 // fixed point, one decimal digit
	WindDir     []int16
	WindSpeed   []int16
	WindGust    []int16

	// This is not; it's not worth delta encoding the raw METAR reports
	// since there's generally not much character alignment between
	// successive reports.
	Raw []string
}

Structure-of-arrays representation of an array of METAR objects for better compressability.

func MakeMETARSOA added in v0.13.0

func MakeMETARSOA(recs []METAR) (METARSOA, error)

func (METARSOA) Check added in v0.13.2

func (soa METARSOA) Check(orig []METAR) error

func (METARSOA) Decode added in v0.13.2

func (soa METARSOA) Decode() []METAR

type Manifest added in v0.13.2

type Manifest struct {
	// contains filtered or unexported fields
}

Manifest represents a weather data manifest that maps TRACONs/airports to compressed timestamps. The manifest provides efficient access to available data timestamps for each location.

func GenerateManifest added in v0.13.2

func GenerateManifest(paths map[string]int64, pathParser func(string) (string, int64, error)) (*Manifest, error)

GenerateManifest creates a manifest from a map of object paths to their sizes/timestamps. The pathParser function extracts the identifier and timestamp from each path. Timestamps are sorted, delta-encoded, and compressed for each identifier.

func GenerateManifestWithPrefix added in v0.13.2

func GenerateManifestWithPrefix(paths map[string]int64, prefix string) (*Manifest, error)

GenerateManifestWithPrefix is a convenience function that generates a manifest from paths that include a prefix. The prefix is stripped before parsing. This is commonly used with storage backends that return full paths.

func LoadManifest added in v0.13.2

func LoadManifest(r io.Reader) (*Manifest, error)

LoadManifest reads a manifest from an io.Reader. The manifest format is msgpack-encoded RawManifest, compressed with zstd.

func MakeManifest added in v0.13.2

func MakeManifest(data RawManifest) *Manifest

MakeManifest creates a manifest from raw manifest data. This is useful when loading data from storage systems.

func MakeManifestFromMap added in v0.13.2

func MakeManifestFromMap(m map[string][]time.Time) (*Manifest, error)

func NewManifest added in v0.13.2

func NewManifest() *Manifest

NewManifest creates an empty manifest with caching enabled

func (*Manifest) Count added in v0.13.2

func (m *Manifest) Count() int

Count returns the number of TRACONs/airports in the manifest

func (*Manifest) GetAllTimestamps added in v0.13.2

func (m *Manifest) GetAllTimestamps() []time.Time

GetAllTimestamps returns all timestamps from all TRACONs/airports in the manifest. The timestamps are collected in an unspecified order.

func (*Manifest) GetTimestamps added in v0.13.2

func (m *Manifest) GetTimestamps(identifier string) ([]time.Time, bool)

GetTimestamps retrieves and decompresses the timestamps for a specific TRACON/airport. Results are cached to avoid repeated decompression. Returns nil, false if the TRACON/airport is not in the manifest.

func (*Manifest) RawManifest added in v0.13.2

func (m *Manifest) RawManifest() RawManifest

RawManifest returns the underlying RawManifest for compatibility with storage systems that need the raw format.

func (*Manifest) Save added in v0.13.2

func (m *Manifest) Save(w io.Writer) error

Save writes the manifest to an io.Writer in the standard format (msgpack + zstd compression)

func (*Manifest) SetFacilityTimestamps added in v0.14.0

func (m *Manifest) SetFacilityTimestamps(facilityID string, times []time.Time) error

SetFacilityTimestamps stores timestamps for a facility (TRACON or ARTCC).

func (*Manifest) TRACONs added in v0.13.2

func (m *Manifest) TRACONs() []string

TRACONs returns a sorted list of all TRACON/airport identifiers in the manifest

func (*Manifest) TotalEntries added in v0.13.2

func (m *Manifest) TotalEntries() int

TotalEntries returns the total number of timestamp entries across all TRACONs/airports

type Model added in v0.13.0

type Model struct {
	// contains filtered or unexported fields
}

func MakeModel added in v0.13.0

func MakeModel(provider Provider, facility string, primaryAirport string, startTime time.Time, lg *log.Logger) *Model

func (*Model) GetAtmosGrid added in v0.13.0

func (m *Model) GetAtmosGrid() *AtmosGrid

func (*Model) Lookup added in v0.13.0

func (m *Model) Lookup(p math.Point2LL, alt float32, t time.Time) Sample

type Precip added in v0.13.0

type Precip struct {
	DBZ        []byte
	Resolution int
	Latitude   float32
	Longitude  float32
}

Precip is the object type that is stored in GCS after wx ingest for precipitation.

func DecodePrecip added in v0.13.0

func DecodePrecip(r io.Reader) (*Precip, error)

func (Precip) BoundsLL added in v0.13.0

func (p Precip) BoundsLL() math.Extent2D

lat-long bounds

type Provider added in v0.13.0

type Provider interface {
	// GetPrecipURL returns precipitation radar URL (GCS only).
	// Returns the item at-or-before the given time.
	GetPrecipURL(facility string, t time.Time) (string, time.Time, error)

	// GetAtmosGrid returns atmospheric grid for simulation.
	// GCS provides full spatial grid; local fallback provides single averaged sample.
	// Returns atmos, its time, the time for the next one in the series.
	// If primaryAirport is non-empty and no atmos data is available, creates
	// a fallback grid from the primary airport's METAR wind data.
	GetAtmosGrid(facility string, t time.Time, primaryAirport string) (*AtmosByPointSOA, time.Time, time.Time, error)
}

type RawManifest added in v0.13.2

type RawManifest map[string][]byte

RawManifest is the underlying storage format for manifests. It maps TRACON/airport identifiers to compressed, delta-encoded int64 Unix timestamps.

type Sample

type Sample struct {
	WindSample
	// contains filtered or unexported fields
}

func LerpSample added in v0.13.0

func LerpSample(x float32, s0, s1 Sample) Sample

func MakeSample added in v0.13.2

func MakeSample(windVec [2]float32, temperature, dewpoint, pressure float32) Sample

MakeSample creates a Sample from float32 values, quantizing them appropriately. Values are clamped to prevent overflow.

func MakeStandardSampleForAltitude added in v0.13.0

func MakeStandardSampleForAltitude(alt float32) Sample

func (Sample) Dewpoint added in v0.13.0

func (s Sample) Dewpoint() float32

Dewpoint returns the dewpoint in Celsius

func (Sample) Pressure added in v0.13.0

func (s Sample) Pressure() float32

Pressure returns the pressure in millibars

func (Sample) RelativeHumidity added in v0.13.0

func (s Sample) RelativeHumidity() float32

func (Sample) String added in v0.13.0

func (s Sample) String() string

func (Sample) Temperature

func (s Sample) Temperature() float32

Temperature returns the temperature in Celsius

type WeatherFilter added in v0.14.0

type WeatherFilter struct {
	FlightRules FlightRulesFilter

	// Ground wind speed range in knots (nil means no constraint)
	WindSpeedMin *int
	WindSpeedMax *int

	Gusting GustFilter

	// Ground wind direction range in magnetic degrees (nil means no constraint)
	// Uses the same wraparound logic as WindSpecifier
	WindDirMin *int
	WindDirMax *int

	// Temperature range in Celsius (nil means no constraint)
	TemperatureMin *int
	TemperatureMax *int

	// Winds aloft constraints (for time selection only)
	// WindsAloftSpeedMin/Max in knots (nil means no constraint)
	WindsAloftSpeedMin *int
	WindsAloftSpeedMax *int
	// WindsAloftDirMin/Max in magnetic degrees (nil means no constraint)
	WindsAloftDirMin *int
	WindsAloftDirMax *int
}

WeatherFilter defines UI-specified constraints for sampling weather data. All fields are optional; nil/zero means "don't care".

func (*WeatherFilter) IsEmpty added in v0.14.0

func (wf *WeatherFilter) IsEmpty() bool

IsEmpty returns true if no filter constraints are set

func (*WeatherFilter) Matches added in v0.14.0

func (wf *WeatherFilter) Matches(metar METAR, magVar float32) bool

Matches checks if a METAR matches this weather filter

func (*WeatherFilter) MatchesWindsAloft added in v0.14.0

func (wf *WeatherFilter) MatchesWindsAloft(atmosByTime *AtmosByTime, t time.Time, altitudeFeet float32, magVar float32) bool

MatchesWindsAloft checks if winds aloft at the specified altitude match the filter constraints. atmosByTime provides atmospheric data, t is the time to check, altitudeFeet is the altitude in feet, and magVar is the magnetic variation to convert from true to magnetic heading.

type WindSample

type WindSample struct {
	// contains filtered or unexported fields
}

func (WindSample) Component added in v0.13.0

func (s WindSample) Component(course float32) float32

Component calculates the wind component along a given course in knots. Positive values indicate tailwind, negative values indicate headwind.

func (WindSample) Deflection added in v0.13.0

func (s WindSample) Deflection(v [2]float32) float32

Deflection calculates the heading correction needed to compensate for wind. Given a velocity vector v, it returns the deflection angle that should be subtracted from the heading to fly into the wind.

func (WindSample) WindDirection added in v0.13.0

func (s WindSample) WindDirection() float32

func (WindSample) WindSpeed added in v0.13.0

func (s WindSample) WindSpeed() float32

func (WindSample) WindVec added in v0.13.0

func (s WindSample) WindVec() [2]float32

WindVec returns the dequantized wind velocity vector in nm/s

type WindSpecifier added in v0.13.0

type WindSpecifier struct {
	Direction   string `json:"direction,omitempty"`    // e.g., "30-90", "270", empty for any
	Speed       string `json:"speed,omitempty"`        // e.g., "5+", "5-", "5-15", empty for any
	FlightRules string `json:"flight_rules,omitempty"` // "VMC" or "IMC", empty defaults to "VMC"
}

WindSpecifier defines constraints for sampling weather data

func (*WindSpecifier) Matches added in v0.13.0

func (ws *WindSpecifier) Matches(metar METAR, magVar float32) bool

Matches checks if a METAR matches this wind specifier

func (*WindSpecifier) Validate added in v0.13.0

func (ws *WindSpecifier) Validate() error

Validate checks if the wind specifier is valid

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL