rinex

package
v0.39.0 Latest Latest
Warning

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

Go to latest
Published: Mar 13, 2026 License: Apache-2.0 Imports: 23 Imported by: 5

Documentation

Index

Constants

View Source
const (
	MaxLengthContent = 60
	MaxLengthLabel   = 20
)
View Source
const MinorVersionMultiplier float64 = 100.

Variables

View Source
var (
	ErrBlankSystem = errors.New("system identifier is blank")
)
View Source
var ObservationKeyLookup = map[gnss.System]map[string]observation.ObservationKey{
	gnss.GPS: {

		"L1": {Frequency: observation.GPS_L1, SignalType: observation.C},
		"L2": {Frequency: observation.GPS_L2, SignalType: observation.W},
		"L5": {Frequency: observation.GPS_L5, SignalType: observation.Q},

		"P1": {Frequency: observation.GPS_L1, SignalType: observation.W},
		"P2": {Frequency: observation.GPS_L2, SignalType: observation.W},
		"C1": {Frequency: observation.GPS_L1, SignalType: observation.C},
		"C2": {Frequency: observation.GPS_L2, SignalType: observation.L},
		"C5": {Frequency: observation.GPS_L5, SignalType: observation.Q},

		"D1": {Frequency: observation.GPS_L1, SignalType: observation.C},
		"D2": {Frequency: observation.GPS_L2, SignalType: observation.W},
		"D5": {Frequency: observation.GPS_L5, SignalType: observation.Q},

		"S1": {Frequency: observation.GPS_L1, SignalType: observation.C},
		"S2": {Frequency: observation.GPS_L2, SignalType: observation.W},
		"S5": {Frequency: observation.GPS_L5, SignalType: observation.Q},
	},
	gnss.GLONASS: {

		"L1": {Frequency: observation.GLONASS_G1, SignalType: observation.C},
		"L2": {Frequency: observation.GLONASS_G2, SignalType: observation.C},

		"C1": {Frequency: observation.GLONASS_G1, SignalType: observation.C},
		"P1": {Frequency: observation.GLONASS_G1, SignalType: observation.P},
		"C2": {Frequency: observation.GLONASS_G2, SignalType: observation.C},
		"P2": {Frequency: observation.GLONASS_G2, SignalType: observation.P},

		"D1": {Frequency: observation.GLONASS_G1, SignalType: observation.C},
		"D2": {Frequency: observation.GLONASS_G2, SignalType: observation.C},

		"S1": {Frequency: observation.GLONASS_G1, SignalType: observation.C},
		"S2": {Frequency: observation.GLONASS_G2, SignalType: observation.C},
	},
	gnss.SBAS: {

		"L1": {Frequency: observation.SBAS_L1, SignalType: observation.C},
		"L5": {Frequency: observation.SBAS_L5, SignalType: observation.I},

		"C1": {Frequency: observation.SBAS_L1, SignalType: observation.C},
		"C5": {Frequency: observation.SBAS_L5, SignalType: observation.I},

		"D1": {Frequency: observation.SBAS_L1, SignalType: observation.C},
		"D5": {Frequency: observation.SBAS_L5, SignalType: observation.I},

		"S1": {Frequency: observation.SBAS_L1, SignalType: observation.C},
		"S5": {Frequency: observation.SBAS_L5, SignalType: observation.I},
	},
	gnss.GALILEO: {

		"C1": {Frequency: observation.Galileo_E1, SignalType: observation.C},
		"C5": {Frequency: observation.Galileo_E5a, SignalType: observation.Q},
		"C7": {Frequency: observation.Galileo_E5b, SignalType: observation.Q},
		"C8": {Frequency: observation.Galileo_E5ab, SignalType: observation.Q},
		"C6": {Frequency: observation.Galileo_E6, SignalType: observation.C},

		"L1": {Frequency: observation.Galileo_E1, SignalType: observation.C},
		"L5": {Frequency: observation.Galileo_E5a, SignalType: observation.Q},
		"L7": {Frequency: observation.Galileo_E5b, SignalType: observation.Q},
		"L8": {Frequency: observation.Galileo_E5ab, SignalType: observation.Q},
		"L6": {Frequency: observation.Galileo_E6, SignalType: observation.C},

		"D1": {Frequency: observation.Galileo_E1, SignalType: observation.C},
		"D5": {Frequency: observation.Galileo_E5a, SignalType: observation.Q},
		"D7": {Frequency: observation.Galileo_E5b, SignalType: observation.Q},
		"D8": {Frequency: observation.Galileo_E5ab, SignalType: observation.Q},
		"D6": {Frequency: observation.Galileo_E6, SignalType: observation.C},

		"S1": {Frequency: observation.Galileo_E1, SignalType: observation.C},
		"S5": {Frequency: observation.Galileo_E5a, SignalType: observation.Q},
		"S7": {Frequency: observation.Galileo_E5b, SignalType: observation.Q},
		"S8": {Frequency: observation.Galileo_E5ab, SignalType: observation.Q},
		"S6": {Frequency: observation.Galileo_E6, SignalType: observation.C},
	},
}

ObservationKeyLookup maps a GNSS system and its RINEX 2.11 observation code (e.g. "L2") to a ObservationKey.

Unfortunantly, the RINEX 2.11 observation codes cannot be mapped to RINEX 3&4 observation codes without making assumptions about how the RINEX file was generated. For example, we don't know if the "L2" column contains L2C or L2W values.

View Source
var (
	// REGEX_TYPE_SV_MSSG is a regular expression for capturing TYPE/SV/MSSG from RINEX 4 navigation files.
	REGEX_TYPE_SV_MSSG = regexp.MustCompile(`^> (EPH|STO|EOP|ION)\s([A-Z])([0-9]{2}|\s{2})\s([A-Z0-9]{1,4})(?:\s+([A-Z0-9]{1,4}))?\s*$`)
)

Functions

func FormatBlankIfZero added in v0.18.5

func FormatBlankIfZero(value int) string

Strings to be either whitespace or value: ssi, lossOfLock, antiSpoofing

func FormatDateForSettings added in v0.18.3

func FormatDateForSettings(date time.Time) string

func GetLeapSeconds

func GetLeapSeconds(queryTime time.Time) (s int, err error)

func IsVersionSupported added in v0.18.3

func IsVersionSupported(version float64) bool

func SerializeRnxObs added in v0.15.0

func SerializeRnxObs(w io.Writer, epochMap observation.Epoch, settings *Settings) error

func SerializeRnxObs2

func SerializeRnxObs2(w io.Writer, epoch observation.Epoch, settings *Settings) (err error)

SerializeRnxObs2 writes a observation.Epoch as RINEX 2 to the provided io.Writer interface.

func SerializeRnxObs3

func SerializeRnxObs3(w io.Writer, epoch observation.Epoch, settings *Settings) (err error)

SerializeRnxObs3 writes a observation.EpochMap as RINEX 3 to the provided io.Writer interface.

func SerializeRnxObs4

func SerializeRnxObs4(w io.Writer, epoch observation.Epoch, settings *Settings) (err error)

SerializeRnxObs4 writes a observation.Epoch as RINEX 4 to the provided io.Writer interface. The ordering of the observation types are in gnssSet. The selection of measurements to be output (phase, range, snr, doppler) is controlled by outputSettings.

func ToRinex2Nav added in v0.15.0

func ToRinex2Nav(w io.Writer, ephemeris ephemeris.GenericEphemeris) error

func ToRinex3Nav added in v0.15.0

func ToRinex3Nav(w io.Writer, ephemeris ephemeris.GenericEphemeris) error

func ToRinex4Nav added in v0.14.1

func ToRinex4Nav(w io.Writer, ephemeris ephemeris.GenericEphemeris) error

func ValidateION added in v0.23.0

func ValidateION(sys gnss.System, msgType, subtype string) (canonMsg string, canonSubtype string, nLines int, err error)

ValidateION validates and canonicalizes ION message types and subtypes. It returns the canonical msgType, canonical subtype (\"\" if blank/BNK), and the number of ION lines to parse.

Types

type ClockFile added in v0.30.1

type ClockFile struct {
	Header  *Header               // RINEX header
	Records []precise.ClockRecord // Clock data records
	Version Version               // RINEX version (3.00, 3.02, 3.04, etc.)
}

ClockFile represents a complete RINEX clock file

func NewClockFile added in v0.30.1

func NewClockFile(r io.Reader) (*ClockFile, error)

NewClockFile creates a new ClockFile from a reader This function reads the entire file into memory. For streaming access, use NewScanner() and NextClockEpoch() instead.

func (*ClockFile) GetClockBias added in v0.30.1

func (cf *ClockFile) GetClockBias(sys gnss.System, svID int, t time.Time, tolerance time.Duration) (float64, bool)

GetClockBias returns the clock bias for a given satellite at a specific time Returns the record with the closest time match (within tolerance)

func (*ClockFile) GetReceiverClockRecords added in v0.30.1

func (cf *ClockFile) GetReceiverClockRecords() []precise.ClockRecord

GetReceiverClockRecords returns all receiver clock records (AR, CR, or DR types)

func (*ClockFile) GetSatelliteClockRecords added in v0.30.1

func (cf *ClockFile) GetSatelliteClockRecords() []precise.ClockRecord

GetSatelliteClockRecords returns all satellite clock records (AS or MS types)

type Header struct {
	Records  []Record
	ObsTypes map[int][]string
}

Header is a struct for storing header records.

func NewHeader added in v0.15.0

func NewHeader(settings *Settings) (*Header, error)

func NewMetHeader added in v0.15.0

func NewMetHeader(settings *Settings) (*Header, error)

func NewNavHeader added in v0.15.0

func NewNavHeader(settings *Settings) (*Header, error)

func NewObsHeader added in v0.15.0

func NewObsHeader(settings *Settings) (*Header, error)

NewObsHeader creates a new RINEX observation header.

func (*Header) AddAntennaOffsetRecord added in v0.15.0

func (h *Header) AddAntennaOffsetRecord(antennaOffsetHEN [3]float64)

AddAntennaOffsetRecord adds an ANTENNA: DELTA H/E/N record to the header.

func (*Header) AddAntennaPositionRecord added in v0.15.0

func (h *Header) AddAntennaPositionRecord(antennaPosition [3]float64)

AddAntennaPositionRecord adds an APPROX POSITION XYZ record to the header.

func (*Header) AddAntennaRecord added in v0.15.0

func (h *Header) AddAntennaRecord(antennaSerial, antennaModel string)

AddAntennaRecord adds an ANT # / TYPE record to the header.

func (*Header) AddComments added in v0.21.6

func (h *Header) AddComments(comments []string)

AddComments adds COMMENT records to the header. Each comment will be on its own line. If a comment is greater than 60 chars, it will be split. The split will occur at the last space before the 60-character limit to avoid breaking words. Each line is padded to 60 characters.

func (*Header) AddEndOfHeaderRecord added in v0.15.0

func (h *Header) AddEndOfHeaderRecord()

AddEndOfHeaderRecord adds an END OF HEADER record to the header.

func (*Header) AddGlonassPhaseBias added in v0.18.5

func (h *Header) AddGlonassPhaseBias()

AddGlonassPhaseBias adds zeroes for GLONASS COD/PHS/BIS (Rinex 3)

func (*Header) AddGlonassSlot added in v0.18.5

func (h *Header) AddGlonassSlot(settings *Settings) error

AddGlonassSlot adds the GLONASS satellite numbers and frequency channels (Rinex 3/4)

func (*Header) AddLeapSecondsRecord added in v0.15.0

func (h *Header) AddLeapSecondsRecord()

AddLeapSecondsRecord adds a LEAP SECONDS record to the header. (optional)

func (*Header) AddMarkerNameRecord added in v0.15.0

func (h *Header) AddMarkerNameRecord(markerName string)

AddMarkerNameRecord adds a MARKER NAME record to the header.

func (*Header) AddMarkerNumberRecord added in v0.18.10

func (h *Header) AddMarkerNumberRecord(markerNumber string)

AddMarkerNumberRecord adds a MARKER NUMBER record to the header.

func (*Header) AddMarkerTypeRecord added in v0.18.5

func (h *Header) AddMarkerTypeRecord(markerType string)

AddMarkerTypeRecord adds a MARKER TYPE record to the header.

func (*Header) AddObsTypesRecord added in v0.15.0

func (h *Header) AddObsTypesRecord(settings *Settings)

AddObsTypesRecord adds a # / TYPES OF OBSERV or a SYS / # / OBS TYPES record to the header depending on the version.

func (*Header) AddObsTypesRecordV2 added in v0.15.0

func (h *Header) AddObsTypesRecordV2(settings *Settings)

func (*Header) AddObsTypesRecordV3 added in v0.15.0

func (h *Header) AddObsTypesRecordV3(settings *Settings) error

func (*Header) AddObserverRecord added in v0.15.0

func (h *Header) AddObserverRecord(observer, agency string)

AddObserverRecord adds an OBSERVER / AGENCY record to the header.

func (*Header) AddPhaseShifts added in v0.18.5

func (h *Header) AddPhaseShifts(settings *Settings) error

AddPhaseShifts adds phase shift corrections (Rinex 3)

func (*Header) AddProgramRecord added in v0.15.0

func (h *Header) AddProgramRecord(program, runBy string, date string)

AddProgramRecord adds a PGM / RUN BY / DATE record to the header.

func (*Header) AddReceiverRecord added in v0.15.0

func (h *Header) AddReceiverRecord(receiverSerial, receiverModel, receiverFirmware string)

AddReceiverRecord adds a REC # / TYPE / VERS record to the header.

func (*Header) AddTimeOfFirstObsRecord added in v0.15.0

func (h *Header) AddTimeOfFirstObsRecord(timeOfFirst time.Time)

AddTimeOfFirstObsRecord adds a TIME OF FIRST OBS record to the header.

func (*Header) AddTimeOfLastObsRecord added in v0.16.2

func (h *Header) AddTimeOfLastObsRecord(timeOfLast time.Time)

func (*Header) AddVersionRecord added in v0.15.0

func (h *Header) AddVersionRecord(rinexVersion Version, rinexType, rinexSystem string)

AddVersionRecord adds a RINEX VERSION / TYPE record to the header.

func (*Header) FindRecord added in v0.25.2

func (h *Header) FindRecord(labelPrefix string) (*Record, bool)

Helper to find the first record with a given label prefix

func (*Header) GetDate added in v0.15.0

func (h *Header) GetDate() (date string, err error)

func (*Header) GetRinex2Types

func (h *Header) GetRinex2Types() (typeMap map[int][]string, err error)

GetRinex2Types - Get the observation types for RINEX 2

func (*Header) GetRinex3Types

func (h *Header) GetRinex3Types() (types map[int][]string, err error)

GetRinex3Types -

func (*Header) GetRinexProgram added in v0.15.0

func (h *Header) GetRinexProgram() (program string, err error)

GetRinexPGM parses the program, run_by, and date fields from the RINEX header

func (*Header) GetRinexSystem

func (h *Header) GetRinexSystem() (system string, err error)

GetRinexSystem parses the system from the RINEX header.

func (*Header) GetRinexType

func (h *Header) GetRinexType() (rinexType string, err error)

GetRinexType parses the RINEX type from the header.

func (*Header) GetRinexVersion

func (h *Header) GetRinexVersion() (Version, error)

GetRinexVersion parses the RINEX version from the header.

func (*Header) GetRunBy added in v0.15.0

func (h *Header) GetRunBy() (runBy string, err error)

GetRunBy parses the run_by field from the RINEX header

func (*Header) IsCRINEX added in v0.39.0

func (h *Header) IsCRINEX() bool

IsCRINEX returns true if the header contains a CRINEX VERS / TYPE record, indicating the file body is Hatanaka-compressed and cannot be parsed directly.

func (*Header) String added in v0.15.0

func (h *Header) String() string

func (*Header) Write

func (h *Header) Write(w io.Writer) error

type LeapSecond

type LeapSecond struct {
	Time   time.Time
	Second int
}

type MajorVersion added in v0.35.0

type MajorVersion int8
const (
	MajorVersionUnknown MajorVersion = -1
	MajorVersion2       MajorVersion = 2
	MajorVersion3       MajorVersion = 3
	MajorVersion4       MajorVersion = 4
)

type MinorVersion added in v0.35.0

type MinorVersion int8
const (
	MinorVersionUnknown MinorVersion = -1
	MinorVersion0       MinorVersion = 0
	MinorVersion01      MinorVersion = 1
	MinorVersion02      MinorVersion = 2
	MinorVersion03      MinorVersion = 3
	MinorVersion04      MinorVersion = 4
	MinorVersion05      MinorVersion = 5
	MinorVersion06      MinorVersion = 6
	MinorVersion07      MinorVersion = 7
	MinorVersion08      MinorVersion = 8
	MinorVersion09      MinorVersion = 9
	MinorVersion10      MinorVersion = 10
	MinorVersion11      MinorVersion = 11
)

type ObsLineElement

type ObsLineElement struct {
	Value float64
	LLI   uint8
	SNR   uint8
}

type ObservationTypesMap added in v0.15.0

type ObservationTypesMap map[gnss.System][]string

type OutputSetting

type OutputSetting struct {
	OutputType
	Enabled bool
}

OutputSetting

type OutputSettings

type OutputSettings map[OutputType]bool

OutputSettings

func NewOutputSettings

func NewOutputSettings() *OutputSettings

NewOutputSettings

func (*OutputSettings) CountEnabled

func (os *OutputSettings) CountEnabled() (count int)

CountEnabled

type OutputType

type OutputType int
const (
	// Phase
	Phase OutputType = iota
	// Range
	Range
	// SNR
	SNR
	// Doppler
	Doppler
)

type Record added in v0.15.0

type Record struct {
	Content string
	Label   string
}

Record stores the header lines in a struct splitting the content (60 chars) and the label (20 chars) into two separate strings. Supports versions 2,3,4.

type Scanner

type Scanner struct {
	*bufio.Scanner
	Header  Header
	Version Version
	Type    string
	System  string
}

Scanner -

func NewScanner

func NewScanner(r io.Reader) (scanner Scanner, err error)

NewScanner creates a new RINEX scanner. It reads the header, extracting the version, type and system. Other type and version specific information is extracted in later steps.

func (Scanner) DeserializeRnx3NavValues

func (scanner Scanner) DeserializeRnx3NavValues(line string, nLines int) (vals []float64, err error)

func (Scanner) DeserializeRnx4NavValues

func (scanner Scanner) DeserializeRnx4NavValues(line string, nLines int) ([]float64, error)

DeserializeRnx4NavValues parses a standard RINEX 4 navigation data block, consisting of one line with epoch and 3 clock-related values, followed by nLines each containing 4 orbit values.

func (Scanner) DeserializeRnxClkEpoch3 added in v0.30.3

func (scanner Scanner) DeserializeRnxClkEpoch3() (precise.ClockRecord, error)

DeserializeRnxClkEpoch3 reads a single clock record from RINEX v3.00-3.02 Uses 4-character clock name field

func (Scanner) DeserializeRnxClkEpoch304 added in v0.30.3

func (scanner Scanner) DeserializeRnxClkEpoch304() (precise.ClockRecord, error)

DeserializeRnxClkEpoch304 reads a single clock record from RINEX v3.04+ Uses 9-character clock name field

func (Scanner) DeserializeRnxMet2Epoch

func (scanner Scanner) DeserializeRnxMet2Epoch() (epoch met.Epoch, err error)

func (Scanner) DeserializeRnxMet3Epoch

func (scanner Scanner) DeserializeRnxMet3Epoch() (epoch met.Epoch, err error)

func (Scanner) DeserializeRnxMet4Epoch

func (scanner Scanner) DeserializeRnxMet4Epoch() (epoch met.Epoch, err error)

func (Scanner) DeserializeRnxNavEpoch2

func (scanner Scanner) DeserializeRnxNavEpoch2() (eph ephemeris.GenericEphemeris, err error)

func (Scanner) DeserializeRnxNavEpoch3

func (scanner Scanner) DeserializeRnxNavEpoch3() (eph ephemeris.GenericEphemeris, err error)

func (Scanner) DeserializeRnxNavEpoch4

func (scanner Scanner) DeserializeRnxNavEpoch4() (eph ephemeris.GenericEphemeris, err error)

DeserializeRnxNavEpoch4 reads and deserializes a full RINEX 4 navigation record. It reads the header line, epoch line, and all subsequent data lines for a single record.

func (Scanner) DeserializeRnxNavGLO

func (scanner Scanner) DeserializeRnxNavGLO() (eph ephemeris.GenericEphemeris, err error)

func (Scanner) DeserializeRnxNavGPS

func (scanner Scanner) DeserializeRnxNavGPS() (eph ephemeris.GenericEphemeris, err error)

func (Scanner) DeserializeRnxObsEpoch2

func (scanner Scanner) DeserializeRnxObsEpoch2() (observation.Epoch, error)

DeserializeRnxObsEpoch2 -

func (Scanner) DeserializeRnxObsEpoch3

func (scanner Scanner) DeserializeRnxObsEpoch3() (observation.Epoch, error)

DeserializeRnxObsEpoch3 -

func (Scanner) DeserializeRnxObsEpoch4

func (scanner Scanner) DeserializeRnxObsEpoch4() (observation.Epoch, error)

DeserializeRnxObsEpoch4 -

func (Scanner) NextClockEpoch added in v0.30.3

func (scanner Scanner) NextClockEpoch() (rec precise.ClockRecord, err error)

NextClockEpoch reads the next clock record from a RINEX clock file

func (Scanner) NextMetEpoch

func (scanner Scanner) NextMetEpoch() (epoch met.Epoch, err error)

func (Scanner) NextNavEpoch

func (scanner Scanner) NextNavEpoch() (eph ephemeris.GenericEphemeris, err error)

NextNavEpoch -

func (Scanner) NextObsEpoch

func (scanner Scanner) NextObsEpoch() (epoch observation.Epoch, err error)

NextObsEpoch -

func (Scanner) ScanHeader

func (scanner Scanner) ScanHeader() (header Header, err error)

ScanHeader -

type Settings added in v0.15.0

type Settings struct {
	RinexVersion     Version              `json:"rinex_version"`
	RinexType        string               `json:"rinex_type"`
	RinexSystem      string               `json:"rinex_system"`
	Interval         float64              `json:"interval"`
	TimeOfFirst      time.Time            `json:"time_of_first"`
	TimeOfLast       time.Time            `json:"time_of_last"`
	MarkerName       string               `json:"marker_name"`
	MarkerNumber     string               `json:"marker_number"`
	MarkerType       string               `json:"marker_type"`
	Observer         string               `json:"observer"`
	Agency           string               `json:"agency"`
	Program          string               `json:"program"`
	RunBy            string               `json:"run_by"`
	Date             string               `json:"date"`
	Comments         []string             `json:"comments"`
	ReceiverModel    string               `json:"receiver_model"`
	ReceiverSerial   string               `json:"receiver_serial"`
	ReceiverFirmware string               `json:"receiver_firmware"`
	AntennaModel     string               `json:"antenna_model"`
	AntennaSerial    string               `json:"antenna_serial"`
	AntennaPosition  coordinates.Vector3D `json:"antenna_position"`
	AntennaOffsetHEN coordinates.Vector3D `json:"antenna_offsetHEN"`
	// Sets which observation types to output (e.g. range, phase, doppler, snr)
	OutputSettings *OutputSettings `json:"output_settings"`
	// This stores the order of the observation codes for each system.
	// The order of the observation codes is important for the RINEX 3&4 headers.
	// Important: RINEX 3 and 4 cannot be streamed because the header must be written before the data.
	ObservationsBySystem *observation.ObservationsBySystem `json:"observation_map"`
}

Settings - settings for RINEX header

func NewSettings added in v0.15.0

func NewSettings() *Settings

func (*Settings) FillFromSiteLog added in v0.18.9

func (s *Settings) FillFromSiteLog(site *sitelog.Site, date time.Time)

Updates the Settings with information from the sitelog Will try to fill using 9-char name but if empty fills using the 4-char name

type Version added in v0.35.0

type Version struct {
	Major MajorVersion
	Minor MinorVersion // out of 100
}

func LatestVersionFromMajor added in v0.35.0

func LatestVersionFromMajor(mv MajorVersion) Version

func VersionFromFloat added in v0.35.0

func VersionFromFloat(version float64) Version

func (Version) Equals added in v0.35.0

func (v Version) Equals(other Version) bool

func (Version) IsSupported added in v0.35.0

func (v Version) IsSupported() bool

func (Version) String added in v0.35.0

func (v Version) String() string

func (Version) ToFloat added in v0.35.0

func (v Version) ToFloat() float64

func (*Version) UnmarshalJSON added in v0.35.0

func (v *Version) UnmarshalJSON(data []byte) error

Jump to

Keyboard shortcuts

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