Method: Navaid#initialize

Defined in:
lib/navaid.rb

#initialize(arg = nil) ⇒ Navaid

Returns a new instance of Navaid.



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/navaid.rb', line 19

def initialize(arg=nil)
  @vors = Array.new
  @runways = Array.new
  @lonSort = Array.new
  @latSort = Array.new
  @rwlatSort = Array.new
  @rwlonSort = Array.new
  @navaidFile = NAVAID_FILE
  
  vorCount = 0
  rwCount = 0
  
  checkForNavaidFile(arg)
  
  begin
    Zlib::GzipReader.open(@navaidFile) {|gz|
      gz.each_line do |l|
        vordata=[]
        if l[0,2] == "2 " or l[0,2] == "3 " then
          vordata = l.split(" ")
          # is it a NDB?
          if l[0,2] == "2 " then
            freq = vordata[4].to_i
            type = "NDB"
          else
            # freq is in MHz * 100
            freq = vordata[4].to_i / 100.0
            type = vordata[-1]
          end
          @vors << Vor.new( vordata[1], vordata[2], freq, vordata[7], vordata[8..-2].join(" "), type, nil)
          @latSort << [vordata[1].to_f, vorCount]
          @lonSort << [vordata[2].to_f, vorCount]
          vorCount += 1
        end

        # check for runways
        if l[0,2] == "4 " then
          rwdata = l.split(" ")
          # freq is in MHz * 100
          @runways << Runway.new( rwdata[1], rwdata[2], rwdata[4].to_i / 100.0, rwdata[3].to_i, 
              rwdata[6].to_f, rwdata[8], rwdata[9], nil)
          @rwlatSort << [rwdata[1].to_f, rwCount]
          @rwlonSort << [rwdata[2].to_f, rwCount]
          rwCount += 1
        end
      end
    }

    @runways.sort! do |a,b|
      a.airportName <=> b.airportName
    end

    Zlib::GzipReader.open(@navaidFile) {|gz|
      mmdata = nil
      range = nil
      gz.each_line do |l|
        # check for MiddleMarker used for placement of cone peak
        if l[0,2] == "8 " then
          mmdata = l.split(" ")
          range = @runways.bsearch_range {|rw| rw.airportName <=> mmdata[8]}
          rwMod = @runways[range].find do |rw|
            rw.runwayName == mmdata[9]
          end
          # exchange lat and lon with position of corresponding MiddleMarker
          if !rwMod.nil? then
            rwMod.lat = mmdata[1]
            rwMod.lon = mmdata[2]
          end
        end
      end
    }


    @latSort.sort! do |a,b|
      a[0] <=> b[0]
    end
    @lonSort.sort! do |a,b|
      a[0] <=> b[0]
    end
    @rwlatSort.sort! do |a,b|
      a[0] <=> b[0]
    end
    @rwlonSort.sort! do |a,b|
      a[0] <=> b[0]
    end
  rescue Errno::ENOENT
    puts "Warning. Could not find data file for VORs."
  end
#   ap @vors
end