Skip to content

s-celles/IGC.jl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

11 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Build Status

IGC

A Julia library to interact with IGC file.

Be aware that this library is alpha version (ie it shouldn't be considered as a release version).

IGC file format is defined using Technical Specification for IGC-approved GNSS Flight Recorder from FAI INTERNATIONAL GLIDING COMMISSION

Installation

julia> using Pkg
julia> Pkg.clone("https://github.com/scls19fr/IGC.jl")

Usage

Read an IGC file

julia> using IGC

julia> cd(joinpath(dirname(pathof(IGC)), "..", "test"))

julia> fname = joinpath("data", "example.igc")

julia> igcdoc = read(fname, IGCDocument)

julia> igcdoc.<press_tab>
comment_records       errors                 fix_records            k_records              security_records
dgps_records          event_records          header                 logger_id              stream
eol                   fix_record_extensions  k_record_extensions    satellite_records      task

julia> igcdoc.logger_id
IGC.A_record("XXX", "ABC", "FLIGHT:1")

julia> igcdoc.header
IGC.Header(IGC.H_record_FiXAccuracy('F', 35), IGC.H_record_DaTE('F', 2001-07-16), IGC.H_record_PiLoT('F', "Bloggs Bill D"), IGC.H_record_Copilot('F', "Smith-Barry John A"), IGC.H_record_GliderType('F', "Schleicher ASH-25"), IGC.H_record_GliderRegistration('F', "ABCD-1234"), IGC.H_record_GpsDatum('F', "WGS-1984"), IGC.H_record_FirmwareRevision('F', "6.4"), IGC.H_record_HardwareRevision('F', "3.0"), IGC.H_record_ManufacturerModel('F', "Manufacturer", "Model"), IGC.H_record_GpsReceiver('F', "MarconiCanada", "Superstar", 12, IGC.MaxAlt(10000, "m")), IGC.H_record_PressureAltitudeSensor('F', "Sensyn", "XYZ1111", IGC.MaxAlt(11000, "m")), IGC.H_record_CompetitionId('F', "XYZ-78910"), IGC.H_record_CompetitionClass('F', "15m Motor Glider"))

julia> igcdoc.task.info
IGC.C_record_task_info(IGC.DeclarationInstant(2001-07-15, 21:38:41), 2001-07-16, "0001", 2, "500K Tri")

julia> using DataFrames

julia> DataFrame(igcdoc.task.waypoints)
6ร—3 DataFrame
โ”‚ Row โ”‚ latitude             โ”‚ longitude               โ”‚ description            โ”‚
โ”‚     โ”‚ IGC.IGCLatitude      โ”‚ IGC.IGCLongitude        โ”‚ String                 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 1   โ”‚ IGCLatitude(51.1893) โ”‚ IGCLongitude(-1.03165)  โ”‚ Lasham Clubhouse       โ”‚
โ”‚ 2   โ”‚ IGCLatitude(51.1696) โ”‚ IGCLongitude(-1.04407)  โ”‚ Lasham Start S, Start  โ”‚
โ”‚ 3   โ”‚ IGCLatitude(52.1515) โ”‚ IGCLongitude(-2.92045)  โ”‚ Sarnesfield, TP1       โ”‚
โ”‚ 4   โ”‚ IGCLatitude(52.5025) โ”‚ IGCLongitude(-0.293533) โ”‚ Norman Cross, TP2      โ”‚
โ”‚ 5   โ”‚ IGCLatitude(51.1696) โ”‚ IGCLongitude(-1.04407)  โ”‚ Lasham Start S, Finish โ”‚
โ”‚ 6   โ”‚ IGCLatitude(51.1893) โ”‚ IGCLongitude(-1.03165)  โ”‚ Lasham Clubhouse       โ”‚

julia> DataFrame(igcdoc.fix_records)
9ร—9 DataFrame. Omitted printing of 3 columns
โ”‚ Row โ”‚ time     โ”‚ latitude             โ”‚ longitude              โ”‚ validity โ”‚ pressure_alt             โ”‚ gps_alt             โ”‚
โ”‚     โ”‚ Datesโ€ฆ   โ”‚ IGC.IGCLatitude      โ”‚ IGC.IGCLongitude       โ”‚ IGCโ€ฆ     โ”‚ IGC.IGCPressureAltitude  โ”‚ IGC.IGCGpsAltitude  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 1   โ”‚ 16:02:40 โ”‚ IGCLatitude(54.1187) โ”‚ IGCLongitude(-2.82237) โ”‚ Fix3D    โ”‚ IGCPressureAltitude(280) โ”‚ IGCGpsAltitude(421) โ”‚
โ”‚ 2   โ”‚ 16:02:45 โ”‚ IGCLatitude(51.1188) โ”‚ IGCLongitude(-1.82167) โ”‚ Fix3D    โ”‚ IGCPressureAltitude(288) โ”‚ IGCGpsAltitude(429) โ”‚
โ”‚ 3   โ”‚ 16:02:50 โ”‚ IGCLatitude(51.1189) โ”‚ IGCLongitude(-1.82138) โ”‚ Fix3D    โ”‚ IGCPressureAltitude(290) โ”‚ IGCGpsAltitude(432) โ”‚
โ”‚ 4   โ”‚ 16:02:55 โ”‚ IGCLatitude(51.119)  โ”‚ IGCLongitude(-1.82035) โ”‚ Fix3D    โ”‚ IGCPressureAltitude(290) โ”‚ IGCGpsAltitude(430) โ”‚
โ”‚ 5   โ”‚ 16:03:00 โ”‚ IGCLatitude(51.1192) โ”‚ IGCLongitude(-1.82003) โ”‚ Fix3D    โ”‚ IGCPressureAltitude(291) โ”‚ IGCGpsAltitude(432) โ”‚
โ”‚ 6   โ”‚ 16:03:05 โ”‚ IGCLatitude(51.1197) โ”‚ IGCLongitude(-1.81975) โ”‚ Fix3D    โ”‚ IGCPressureAltitude(291) โ”‚ IGCGpsAltitude(435) โ”‚
โ”‚ 7   โ”‚ 16:03:10 โ”‚ IGCLatitude(51.1202) โ”‚ IGCLongitude(-1.81957) โ”‚ Fix3D    โ”‚ IGCPressureAltitude(293) โ”‚ IGCGpsAltitude(435) โ”‚
โ”‚ 8   โ”‚ 16:02:48 โ”‚ IGCLatitude(51.1203) โ”‚ IGCLongitude(-1.81917) โ”‚ Fix3D    โ”‚ IGCPressureAltitude(494) โ”‚ IGCGpsAltitude(436) โ”‚
โ”‚ 9   โ”‚ 16:02:52 โ”‚ IGCLatitude(51.1222) โ”‚ IGCLongitude(-1.81878) โ”‚ Fix3D    โ”‚ IGCPressureAltitude(496) โ”‚ IGCGpsAltitude(439) โ”‚

Parse a string containing a given IGC record

julia> using IGC

julia> parse(Abstract_IGC_record, "B1602455107126N00149300WA002880042919509020")
IGC.B_record(Time(16:02:45), IGC.IGCLatitude(51.118766666666666), IGC.IGCLongitude(-1.8216666666666668), IGC.FixValidity.Fix3D, IGC.IGCPressureAltitude(288), IGC.IGCGpsAltitude(429), 36, "19509020", IGC.IGCExtension[])

Parse a string containing several IGC records

julia> using IGC

julia> records = parse(Vector{Abstract_IGC_record}, """B1602455107126N00149300WA002880042919509020
       B1602505107134N00149283WA002900043221009015
       B1602555107140N00149221WA002900043020009012""")
3-element Array{IGC.B_record,1}:
 IGC.B_record(16:02:45, IGC.IGCLatitude(51.118766666666666), IGC.IGCLongitude(-1.8216666666666668), IGC.FixValidity.Fix3D, IGC.IGCPressureAltitude(288), IGC.IGCGpsAltitude(429), 36, "19509020", IGC.IGCExtension[])
 IGC.B_record(16:02:50, IGC.IGCLatitude(51.1189), IGC.IGCLongitude(-1.8213833333333334), IGC.FixValidity.Fix3D, IGC.IGCPressureAltitude(290), IGC.IGCGpsAltitude(432), 36, "21009015", IGC.IGCExtension[])
 IGC.B_record(16:02:55, IGC.IGCLatitude(51.119), IGC.IGCLongitude(-1.82035), IGC.FixValidity.Fix3D, IGC.IGCPressureAltitude(290), IGC.IGCGpsAltitude(430), 36, "20009012", IGC.IGCExtension[])

julia> using DataFrames

julia> DataFrame(records)
3ร—9 DataFrame. Omitted printing of 3 columns
โ”‚ Row โ”‚ time     โ”‚ latitude             โ”‚ longitude              โ”‚ validity โ”‚ pressure_alt             โ”‚ gps_alt             โ”‚
โ”‚     โ”‚ Datesโ€ฆ   โ”‚ IGC.IGCLatitude      โ”‚ IGC.IGCLongitude       โ”‚ IGCโ€ฆ     โ”‚ IGC.IGCPressureAltitude  โ”‚ IGC.IGCGpsAltitude  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 1   โ”‚ 16:02:45 โ”‚ IGCLatitude(51.1188) โ”‚ IGCLongitude(-1.82167) โ”‚ Fix3D    โ”‚ IGCPressureAltitude(288) โ”‚ IGCGpsAltitude(429) โ”‚
โ”‚ 2   โ”‚ 16:02:50 โ”‚ IGCLatitude(51.1189) โ”‚ IGCLongitude(-1.82138) โ”‚ Fix3D    โ”‚ IGCPressureAltitude(290) โ”‚ IGCGpsAltitude(432) โ”‚
โ”‚ 3   โ”‚ 16:02:55 โ”‚ IGCLatitude(51.119)  โ”‚ IGCLongitude(-1.82035) โ”‚ Fix3D    โ”‚ IGCPressureAltitude(290) โ”‚ IGCGpsAltitude(430) โ”‚

Read an IGC file to a simple Vector of records

julia> records = parse(Vector{Abstract_IGC_record}, read(fname, String))
46-element Array{Abstract_IGC_record,1}:
 IGC.A_record("XXX", "ABC", "FLIGHT:1")
 IGC.H_record_FiXAccuracy('F', 35)
 IGC.H_record_DaTE('F', 2001-07-16)
 โ‹ฎ
 IGC.G_record("SKTO5427FGTNUT5621WKTC6714FT8957FGMKJ134527FGTR6751")
 IGC.G_record("K2489IERGNV3089IVJE39GO398535J3894N358954983FTGY546")
 IGC.G_record("12560DJUWT28719GTAOL5628FGWNIST78154INWTOLP7815FITN")

Write an IGC record to a string

julia> using Dates

julia> using IGC: B_record, IGCLatitude, IGCLongitude, FixValidity, IGCPressureAltitude, IGCGpsAltitude

julia> rec = B_record(Time(16, 02, 45), IGCLatitude(51.118766666666666), IGCLongitude(-1.8216666666666668), FixValidity.Fix3D, IGCPressureAltitude(288), IGCGpsAltitude(429), 36, "19509020")

julia> rec = B_record(Time(16, 02, 45), IGCLatitude(51.118766666666666), IGCLongitude(-1.8216666666666668), FixValidity.Fix3D, IGCPressureAltitude(288), IGCGpsAltitude(429), 36, "19509020")
B_record(Time(16:02:45), IGCLatitude(51.118766666666666), IGCLongitude(-1.8216666666666668), IGC.FixValidity.Fix3D, IGCPressureAltitude(288), IGCGpsAltitude(429), 36, "19509020", IGC.IGCExtension[])

julia> string(rec)
"B1602455107126N00149300WA002880042919509020"

Write an IGC file using a stream approach

julia> using IGC

julia> using IGC: ParsingMode, A_record, H_record_FiXAccuracy, H_record_DaTE, H_record_PiLoT, update!

julia> io = IOBuffer()  # this buffer is filled at each update! call
IOBuffer(data=UInt8[...], readable=true, writable=true, seekable=true, append=false, size=0, maxsize=Inf, ptr=1, mark=-1)

julia> igcdoc = IGCDocument(stream = io, parsing_mode = ParsingMode.STRICT)

julia> update!(igcdoc, A_record("XXX", "ABC", "FLIGHT:1"))
16

julia> update!(igcdoc, H_record_FiXAccuracy('F', 35))
3

julia> update!(igcdoc, H_record_DaTE('F', Date(2001, 07, 16)))
6

julia> update!(igcdoc, H_record_PiLoT('F', "Bloggs Bill D"))
13

julia> String(take!(io))
"AXXXABC FLIGHT:1\nHFFXA035\nHFDTE160701\nHFPLTPILOTINCHARGE:Bloggs Bill D"

Credits

Inspired by Python library aerofiles

About

A Julia library to interact with IGC file

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages