crinex

package module
v1.3.0 Latest Latest
Warning

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

Go to latest
Published: Nov 26, 2023 License: MIT Imports: 12 Imported by: 0

README

crinex

Golang package for decoding compact RINEX (Hatanaka RINEX Format)

USAGE

Scanner

crinex.NewScanner returns a scanner that provides sequential data decoding epoch by epoch.

Example:

package main

import (
    "bufio"
    "fmt"
    "os"

    "github.com/satoshi-pes/crinex"
)

func main() {
    crx := "example.crx"

    f, err := os.Open(crx)
    if err != nil {
        panic(err.Error())
    }
    defer f.Close()

    // create crinex scanner
    s, err := crinex.NewScanner(f)
    if err != nil {
        panic(err)
    }

    // output to stdout
    w := bufio.NewWriter(os.Stdout)
    defer w.Flush()

    // scan header contents
    s.ParseHeader()

    // output header as RINEX format
    fmt.Fprintf(w, "%s", string(s.Header()))

    // scan data epoch by epoch
    for s.ScanEpoch() {

        // output data as RINEX format
        fmt.Fprintf(w, "%s", s.EpochAsBytes()) // epoch record
        fmt.Fprintf(w, "%s", s.DataAsBytes())  // observables
    }
}

Decoded data can be retrieved by the following functions.

  • Header() -> []bytes // stores original header bytes
  • Epoch() -> time.Time
  • SatList() -> []string
  • ClockOffset() -> float64
  • Data() -> []SatObss // stores all data for the epoch
// get time tag as time.Time
epoch := s.Epoch()
// -> time.Date(2023, time.January, 1, 0, 0, 0, 0, time.UTC)

// get satellite list for current epoch
satlist := s.SatList()
// -> []string{"G03", "G23", "G01", "G27", "G08", "G32", "G14", "G10", "G21", "G22"}

// get clock offset
clkoff := s.ClockOffset()
// -> 0.000000000

// get data as []SatObss
data := s.Data()

// print the observable of first obscode for the first satellite
i := 0  // index of the satellites (="G03")
j := 0  // index of the observation codes
fmt.Printf("Sat: %s\n", data[i].SatId)                  // Satellite 
fmt.Printf("Val: %f\n", data[i].ObsData[j].Data)        // observable
fmt.Printf("LLI: %s\n", string(data[i].ObsData[j].LLI)) // LLI (as byte)
fmt.Printf("SS : %s\n", string(data[i].ObsData[j].SS))  // SS (as byte)
// -> Sat: G03
// -> Val: 25065306.219000
// -> LLI: 
// -> SS : 5

Reader

crinex.NewReader returns a reader, and you can get extracted RINEX strings line by line.

package main

import (
    "bufio"
    "fmt"
    "os"

    "github.com/satoshi-pes/crinex"
)

func main() {
    crx := "example.crx"

    f, err := os.Open(crx)
    if err != nil {
        panic(err.Error())
    }
    defer f.Close()

    // create crinex reader and scanner
    r, err := crinex.NewReader(f)
    if err != nil {
        panic(err)
    }
    s := bufio.NewScanner(r)

    // output to stdout
    w := bufio.NewWriter(os.Stdout)
    defer w.Flush()

    for s.Scan() {
        t := s.Text()
        fmt.Fprintln(w, t)
    }
}

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrBadMagic            = errors.New("crinex: Bad magic value")
	ErrNotSupportedVersion = errors.New("crinex: Not supported version")
	ErrInvalidHeader       = errors.New("crinex: Invalid Header")
	ErrInvalidEpochStr     = errors.New("crinex: Invalid EpochStr found")
	ErrInvalidData         = errors.New("crinex: Invalid record found")
	ErrInvalidMaxDiff      = errors.New("crinex: Invalid maxdiff found")
	ErrRecovered           = errors.New("crinex: Invalid record found and recovered")
)
View Source
var VALID_SATSYS = []string{" ", "G", "R", "E", "J", "C", "I", "S"}

valid satellite systems (" " denotes GPS)

Functions

func NewReader

func NewReader(r io.Reader) (io.Reader, error)

func NewSatDataRecord

func NewSatDataRecord(obsCodes []string) satDataRecord

NewSatDataRecord returns a new satDataRecord initialized with obsCodes.

Types

type SatObsData added in v1.0.0

type SatObsData struct {
	Data float64 // math.NaN represents the missing data
	LLI  byte
	SS   byte
}

func (*SatObsData) StringRINEX added in v1.0.0

func (d *SatObsData) StringRINEX() (s string)

type SatObss added in v1.0.0

type SatObss struct {
	SatId   string
	ObsData []SatObsData
}

func (*SatObss) StringRINEX added in v1.0.0

func (o *SatObss) StringRINEX() (s string)

type Scanner added in v1.0.0

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

func NewScanner added in v1.0.0

func NewScanner(r io.Reader) (*Scanner, error)

func (*Scanner) ClockOffset added in v1.0.0

func (s *Scanner) ClockOffset() (clkoff float64)

ClockOffset returns clock offset as float64 value. Returns math.NaN() if the clock offset record is missing or unexpected error found.

func (*Scanner) Data added in v1.0.0

func (s *Scanner) Data() (obs []SatObss)

Data returns decompressed RINEX data

func (*Scanner) DataAsBytes added in v1.0.0

func (s *Scanner) DataAsBytes() (buf []byte)

Data returns decompressed RINEX data as RINEX bytes

func (*Scanner) Epoch added in v1.0.0

func (s *Scanner) Epoch() time.Time

Epoch returns the time tag for current epoch as time.Time

func (*Scanner) EpochAsBytes added in v1.0.0

func (s *Scanner) EpochAsBytes() []byte

func (*Scanner) Header added in v1.0.0

func (s *Scanner) Header() []byte

Header returns the header contents for the file

func (*Scanner) ObsTypes added in v1.0.0

func (s *Scanner) ObsTypes() map[string][]string

ObsTypes returns the observation types defined for the file

func (*Scanner) ParseHeader added in v1.0.0

func (s *Scanner) ParseHeader() (err error)

ParseHeader parses the header, stores header contents and obstypes to s.header and s.obsTypes, and advance reader position to the head of the first data block.

func (*Scanner) SatList added in v1.0.0

func (s *Scanner) SatList() []string

SatList reuturns the list of satellites for current epoch

func (*Scanner) Scan added in v1.2.5

func (s *Scanner) Scan() bool

func (*Scanner) ScanEpoch added in v1.0.0

func (s *Scanner) ScanEpoch() bool

ScanEpoch reads Hatanaka compressed data for an epoch and set decoded values. Returns true if scan is successful. In the case the scan failed, the error is stored in s.err. Returns true for io.EOF.

Jump to

Keyboard shortcuts

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