aixm 0.3.5 → 0.3.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/.travis.yml +4 -0
- data/CHANGELOG.md +15 -0
- data/README.md +7 -7
- data/aixm.gemspec +1 -0
- data/{Gemfile → gems.rb} +0 -0
- data/lib/aixm.rb +4 -0
- data/lib/aixm/component/fato.rb +255 -0
- data/lib/aixm/component/helipad.rb +59 -4
- data/lib/aixm/component/layer.rb +2 -2
- data/lib/aixm/component/lighting.rb +133 -0
- data/lib/aixm/component/runway.rb +31 -6
- data/lib/aixm/component/surface.rb +45 -2
- data/lib/aixm/d.rb +3 -3
- data/lib/aixm/document.rb +3 -1
- data/lib/aixm/feature/airport.rb +39 -5
- data/lib/aixm/feature/airspace.rb +7 -1
- data/lib/aixm/feature/unit.rb +3 -1
- data/lib/aixm/p.rb +88 -0
- data/lib/aixm/refinements.rb +15 -15
- data/lib/aixm/shortcuts.rb +4 -0
- data/lib/aixm/version.rb +1 -1
- data/lib/aixm/w.rb +86 -0
- data/lib/aixm/xy.rb +6 -0
- data/{Rakefile → rakefile.rb} +10 -0
- data/spec/factory.rb +64 -6
- data/spec/lib/aixm/component/fato_spec.rb +260 -0
- data/spec/lib/aixm/component/helipad_spec.rb +68 -3
- data/spec/lib/aixm/component/lighting_spec.rb +88 -0
- data/spec/lib/aixm/component/runway_spec.rb +63 -3
- data/spec/lib/aixm/component/surface_spec.rb +36 -0
- data/spec/lib/aixm/d_spec.rb +2 -2
- data/spec/lib/aixm/document_spec.rb +280 -2
- data/spec/lib/aixm/feature/airport_spec.rb +161 -8
- data/spec/lib/aixm/p_spec.rb +189 -0
- data/spec/lib/aixm/refinements_spec.rb +16 -16
- data/spec/lib/aixm/w_spec.rb +150 -0
- data/spec/lib/aixm/xy_spec.rb +11 -0
- data/spec/macros/marking.rb +12 -0
- metadata +32 -4
data/lib/aixm/component/layer.rb
CHANGED
@@ -111,10 +111,10 @@ module AIXM
|
|
111
111
|
%Q(#<#{original_class} class=#{@klass.inspect}>)
|
112
112
|
end
|
113
113
|
|
114
|
-
alias_method :original_class, :class
|
115
|
-
|
116
114
|
# @!attribute class
|
115
|
+
# @note Use +original_class+ to query the Ruby object class.
|
117
116
|
# @return [Symbol] class of layer (see {CLASSES})
|
117
|
+
alias_method :original_class, :class
|
118
118
|
def class
|
119
119
|
@klass
|
120
120
|
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
using AIXM::Refinements
|
2
|
+
|
3
|
+
module AIXM
|
4
|
+
class Component
|
5
|
+
|
6
|
+
# Lighting of a runway, helipad etc
|
7
|
+
#
|
8
|
+
# ===Cheat Sheet in Pseudo Code:
|
9
|
+
# lighting = AIXM.lighting(
|
10
|
+
# position: POSITIONS
|
11
|
+
# )
|
12
|
+
# lighting.description = String or nil
|
13
|
+
# lighting.intensity = INTENSITIES or nil
|
14
|
+
# lighting.color = COLORS or nil
|
15
|
+
# lighting.remarks = String or nil
|
16
|
+
#
|
17
|
+
# @see https://github.com/openflightmaps/ofmx/wiki/Airport#rls-runway-direction-lighting
|
18
|
+
# @see https://github.com/openflightmaps/ofmx/wiki/Airport#fls-fato-direction-lighting
|
19
|
+
# @see https://github.com/openflightmaps/ofmx/wiki/Airport#tls-helipad-tlof-lighting
|
20
|
+
class Lighting
|
21
|
+
POSITIONS = {
|
22
|
+
TDZ: :touch_down_zone,
|
23
|
+
AIM: :aiming_point,
|
24
|
+
CL: :center_line,
|
25
|
+
EDGE: :edge,
|
26
|
+
THR: :threshold,
|
27
|
+
SWYEDGE: :stopway_edge,
|
28
|
+
DESIG: :runway_designation,
|
29
|
+
AFTTHR: :after_threshold,
|
30
|
+
DISPTHR: :displaced_threshold,
|
31
|
+
SWYCL: :stopway_center_line,
|
32
|
+
END: :runway_end,
|
33
|
+
SWYEND: :stopway_end,
|
34
|
+
TWYINT: :taxiway_intersection,
|
35
|
+
HOLDBAY: :taxyway_hold_bay,
|
36
|
+
RTWYINT: :rapid_taxiway_intersection,
|
37
|
+
OTHER: :other # specify in remarks
|
38
|
+
}
|
39
|
+
|
40
|
+
INTENSITIES = {
|
41
|
+
LIL: :low,
|
42
|
+
LIM: :medium,
|
43
|
+
LIH: :high,
|
44
|
+
OTHER: :other # specify in remarks
|
45
|
+
}
|
46
|
+
|
47
|
+
COLORS = {
|
48
|
+
YEL: :yellow,
|
49
|
+
RED: :red,
|
50
|
+
WHI: :white,
|
51
|
+
BLU: :blue,
|
52
|
+
GRN: :green,
|
53
|
+
PRP: :purple,
|
54
|
+
OTHER: :other # specify in remarks
|
55
|
+
}
|
56
|
+
|
57
|
+
# @return [AIXM::Component::Runway::Direction, AIXM::Component::FATO::Direction, AIXM::Component::Helipad] lighted entity
|
58
|
+
attr_reader :lightable
|
59
|
+
|
60
|
+
# @return [Symbol, nil] position of the lighting system (see {POSITIONS})
|
61
|
+
attr_reader :position
|
62
|
+
|
63
|
+
# @return [String, nil] detailed description
|
64
|
+
attr_reader :description
|
65
|
+
|
66
|
+
# @return [Symbol, nil] intensity of lights (see {INTENSITIES})
|
67
|
+
attr_reader :intensity
|
68
|
+
|
69
|
+
# @return [Symbol, nil] color of lights (see {COLORS})
|
70
|
+
attr_reader :color
|
71
|
+
|
72
|
+
# @return [String, nil] free text remarks
|
73
|
+
attr_reader :remarks
|
74
|
+
|
75
|
+
def initialize(position:)
|
76
|
+
self.position = position
|
77
|
+
end
|
78
|
+
|
79
|
+
# @return [String]
|
80
|
+
def inspect
|
81
|
+
%Q(#<#{self.class} position=#{position.inspect}>)
|
82
|
+
end
|
83
|
+
|
84
|
+
def lightable=(value)
|
85
|
+
fail(ArgumentError, "invalid lightable") unless value.respond_to? :lightings
|
86
|
+
@lightable = value
|
87
|
+
end
|
88
|
+
private :lightable=
|
89
|
+
|
90
|
+
def position=(value)
|
91
|
+
@position = POSITIONS.lookup(value.to_s.to_sym, nil) || fail(ArgumentError, "invalid position")
|
92
|
+
end
|
93
|
+
|
94
|
+
def description=(value)
|
95
|
+
@description = value&.to_s
|
96
|
+
end
|
97
|
+
|
98
|
+
def intensity=(value)
|
99
|
+
@intensity = value.nil? ? nil : INTENSITIES.lookup(value.to_s.to_sym, nil) || fail(ArgumentError, "invalid intensity")
|
100
|
+
end
|
101
|
+
|
102
|
+
def color=(value)
|
103
|
+
@color = value.nil? ? nil : COLORS.lookup(value.to_s.to_sym, nil) || fail(ArgumentError, "invalid color")
|
104
|
+
end
|
105
|
+
|
106
|
+
def remarks=(value)
|
107
|
+
@remarks = value&.to_s
|
108
|
+
end
|
109
|
+
|
110
|
+
# @return [String] UID markup
|
111
|
+
def to_uid(as:)
|
112
|
+
builder = Builder::XmlMarkup.new(indent: 2)
|
113
|
+
builder.tag!(as) do |tag|
|
114
|
+
tag << lightable.to_uid.indent(2)
|
115
|
+
tag.codePsn(POSITIONS.key(position).to_s)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# @return [String] AIXM or OFMX markup
|
120
|
+
def to_xml(as:)
|
121
|
+
builder = Builder::XmlMarkup.new(indent: 2)
|
122
|
+
builder.tag!(as) do |tag|
|
123
|
+
tag << to_uid(as: "#{as}Uid").indent(2)
|
124
|
+
tag.txtDescr(description) if description
|
125
|
+
tag.codeIntst(INTENSITIES.key(intensity).to_s) if intensity
|
126
|
+
tag.codeColour(COLORS.key(color).to_s) if color
|
127
|
+
tag.txtRmk(remarks) if remarks
|
128
|
+
end
|
129
|
+
builder.target!
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -157,8 +157,9 @@ module AIXM
|
|
157
157
|
rwy.txtRmk(remarks) if remarks
|
158
158
|
end
|
159
159
|
%i(@forth @back).each do |direction|
|
160
|
-
direction = instance_variable_get(direction)
|
161
|
-
|
160
|
+
if direction = instance_variable_get(direction)
|
161
|
+
builder << direction.to_xml
|
162
|
+
end
|
162
163
|
end
|
163
164
|
builder.target!
|
164
165
|
end
|
@@ -200,8 +201,12 @@ module AIXM
|
|
200
201
|
# @return [String, nil] free text remarks
|
201
202
|
attr_reader :remarks
|
202
203
|
|
204
|
+
# @return [Array<AIXM::Component::Lighting>] installed lighting systems
|
205
|
+
attr_reader :lightings
|
206
|
+
|
203
207
|
def initialize(runway:, name:)
|
204
208
|
self.runway, self.name = runway, name
|
209
|
+
@lightings = []
|
205
210
|
end
|
206
211
|
|
207
212
|
# @return [String]
|
@@ -258,6 +263,17 @@ module AIXM
|
|
258
263
|
@remarks = value&.to_s
|
259
264
|
end
|
260
265
|
|
266
|
+
# Add a lighting system to the runway direction.
|
267
|
+
#
|
268
|
+
# @param lighting [AIXM::Component::Lighting] lighting instance
|
269
|
+
# @return [self]
|
270
|
+
def add_lighting(lighting)
|
271
|
+
fail(ArgumentError, "invalid lighting") unless lighting.is_a? AIXM::Component::Lighting
|
272
|
+
lighting.send(:lightable=, self)
|
273
|
+
@lightings << lighting
|
274
|
+
self
|
275
|
+
end
|
276
|
+
|
261
277
|
# @return [AIXM::A] magnetic orientation (magnetic bearing) in degrees
|
262
278
|
def magnetic_orientation
|
263
279
|
if geographic_orientation && runway.airport.declination
|
@@ -265,14 +281,20 @@ module AIXM
|
|
265
281
|
end
|
266
282
|
end
|
267
283
|
|
284
|
+
# @return [String] UID markup
|
285
|
+
def to_uid
|
286
|
+
builder = Builder::XmlMarkup.new(indent: 2)
|
287
|
+
builder.RdnUid do |rdn_uid|
|
288
|
+
rdn_uid << runway.to_uid.indent(2)
|
289
|
+
rdn_uid.txtDesig(name)
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
268
293
|
# @return [String] AIXM or OFMX markup
|
269
294
|
def to_xml
|
270
295
|
builder = Builder::XmlMarkup.new(indent: 2)
|
271
296
|
builder.Rdn do |rdn|
|
272
|
-
rdn
|
273
|
-
rdn_uid << runway.to_uid.indent(4)
|
274
|
-
rdn_uid.txtDesig(name)
|
275
|
-
end
|
297
|
+
rdn << to_uid.indent(2)
|
276
298
|
rdn.geoLat(xy.lat(AIXM.schema))
|
277
299
|
rdn.geoLong(xy.long(AIXM.schema))
|
278
300
|
rdn.valTrueBrg(geographic_orientation) if geographic_orientation
|
@@ -299,6 +321,9 @@ module AIXM
|
|
299
321
|
rdd.txtRmk(remarks) if remarks
|
300
322
|
end
|
301
323
|
end
|
324
|
+
lightings.each do |lighting|
|
325
|
+
builder << lighting.to_xml(as: :Rls)
|
326
|
+
end
|
302
327
|
builder.target!
|
303
328
|
end
|
304
329
|
end
|
@@ -6,12 +6,15 @@ module AIXM
|
|
6
6
|
# Surface of a runway, helipad etc
|
7
7
|
#
|
8
8
|
# ===Cheat Sheet in Pseudo Code:
|
9
|
-
# surface = AIXM.
|
9
|
+
# surface = AIXM.surface(
|
10
10
|
# composition: COMPOSITIONS or nil
|
11
11
|
# preparation: PREPARATIONS or nil
|
12
12
|
# condition: CONDITIONS or nil
|
13
13
|
# )
|
14
|
-
# surface.pcn = String
|
14
|
+
# surface.pcn = String or nil
|
15
|
+
# surface.siwl_weight = AIXM.w
|
16
|
+
# surface.siwl_tire_pressure = AIXM.p
|
17
|
+
# surface.auw_weight = AIXM.w
|
15
18
|
# surface.remarks = String or nil
|
16
19
|
#
|
17
20
|
# ===Constants:
|
@@ -24,11 +27,15 @@ module AIXM
|
|
24
27
|
ASPH: :asphalt,
|
25
28
|
BITUM: :bitumen, # dug up, bound and rolled ground
|
26
29
|
CONC: :concrete,
|
30
|
+
'CONC+ASPH': :concrete_and_asphalt,
|
31
|
+
'CONC+GRS': :concrete_and_grass,
|
27
32
|
GRADE: :graded_earth, # graded or rolled earth possibly with some grass
|
28
33
|
GRASS: :grass, # lawn
|
29
34
|
GRAVE: :gravel, # small and midsize rounded stones
|
30
35
|
MACADAM: :macadam, # small rounded stones
|
36
|
+
METAL: :metal,
|
31
37
|
SAND: :sand,
|
38
|
+
SNOW: :snow,
|
32
39
|
WATER: :water,
|
33
40
|
OTHER: :other # specify in remarks
|
34
41
|
}
|
@@ -61,6 +68,15 @@ module AIXM
|
|
61
68
|
# @return [Symbol, nil] condition of the surface (see {CONDITIONS})
|
62
69
|
attr_reader :condition
|
63
70
|
|
71
|
+
# @return [AIXM::W, nil] single isolated wheel load weight
|
72
|
+
attr_reader :siwl_weight
|
73
|
+
|
74
|
+
# @return [AIXM::P, nil] single isolated wheel load tire pressure
|
75
|
+
attr_reader :siwl_tire_pressure
|
76
|
+
|
77
|
+
# @return [AIXM::W, nil] all-up wheel weight
|
78
|
+
attr_reader :auw_weight
|
79
|
+
|
64
80
|
# @return [String, nil] free text remarks
|
65
81
|
attr_reader :remarks
|
66
82
|
|
@@ -96,6 +112,21 @@ module AIXM
|
|
96
112
|
@pcn = match.named_captures.reject{ |k| k == 'pcn' }
|
97
113
|
end
|
98
114
|
|
115
|
+
def siwl_weight=(value)
|
116
|
+
fail(ArgumentError, "invalid siwl_weight") unless value.nil? || value.is_a?(AIXM::W)
|
117
|
+
@siwl_weight = value
|
118
|
+
end
|
119
|
+
|
120
|
+
def siwl_tire_pressure=(value)
|
121
|
+
fail(ArgumentError, "invalid siwl_tire_pressure") unless value.nil? || value.is_a?(AIXM::P)
|
122
|
+
@siwl_tire_pressure = value
|
123
|
+
end
|
124
|
+
|
125
|
+
def auw_weight=(value)
|
126
|
+
fail(ArgumentError, "invalid auw_weight") unless value.nil? || value.is_a?(AIXM::W)
|
127
|
+
@auw_weight = value
|
128
|
+
end
|
129
|
+
|
99
130
|
def remarks=(value)
|
100
131
|
@remarks = value&.to_s
|
101
132
|
end
|
@@ -114,6 +145,18 @@ module AIXM
|
|
114
145
|
builder.codePcnEvalMethod(@pcn['evaluation_method'])
|
115
146
|
end
|
116
147
|
builder.txtPcnNote(@remarks) if remarks
|
148
|
+
if siwl_weight
|
149
|
+
builder.valSiwlWeight(siwl_weight.wgt.trim)
|
150
|
+
builder.uomSiwlWeight(siwl_weight.unit.to_s.upcase)
|
151
|
+
end
|
152
|
+
if siwl_tire_pressure
|
153
|
+
builder.valSiwlTirePressure(siwl_tire_pressure.pres.trim)
|
154
|
+
builder.uomSiwlTirePressure(siwl_tire_pressure.unit.to_s.upcase)
|
155
|
+
end
|
156
|
+
if auw_weight
|
157
|
+
builder.valAuwWeight(auw_weight.wgt.trim)
|
158
|
+
builder.uomAuwWeight(auw_weight.unit.to_s.upcase)
|
159
|
+
end
|
117
160
|
builder.target!
|
118
161
|
end
|
119
162
|
end
|
data/lib/aixm/d.rb
CHANGED
@@ -18,7 +18,7 @@ module AIXM
|
|
18
18
|
}.freeze
|
19
19
|
|
20
20
|
# @!method zero?
|
21
|
-
# @return [Boolean] whether
|
21
|
+
# @return [Boolean] whether distance is zero
|
22
22
|
def_delegator :@dist, :zero?
|
23
23
|
|
24
24
|
# @return [Float] distance
|
@@ -56,7 +56,7 @@ module AIXM
|
|
56
56
|
# @!method to_km
|
57
57
|
# @!method to_m
|
58
58
|
# @!method to_nm
|
59
|
-
# @return [AIXM::
|
59
|
+
# @return [AIXM::D] convert distance
|
60
60
|
UNITS.each_key do |target_unit|
|
61
61
|
define_method "to_#{target_unit}" do
|
62
62
|
return self if unit == target_unit
|
@@ -67,7 +67,7 @@ module AIXM
|
|
67
67
|
# @see Object#<=>
|
68
68
|
# @return [Integer]
|
69
69
|
def <=>(other)
|
70
|
-
|
70
|
+
dist <=> other.send(:"to_#{unit}").dist
|
71
71
|
end
|
72
72
|
|
73
73
|
# @see Object#==
|
data/lib/aixm/document.rb
CHANGED
@@ -15,6 +15,8 @@ module AIXM
|
|
15
15
|
#
|
16
16
|
# @see https://github.com/openflightmaps/ofmx/wiki/Snapshot
|
17
17
|
class Document
|
18
|
+
REGION_RE = /\A[A-Z]{2}\z/.freeze
|
19
|
+
|
18
20
|
NAMESPACE_RE = /\A[a-f\d]{8}-[a-f\d]{4}-[a-f\d]{4}-[a-f\d]{4}-[a-f\d]{12}\z/.freeze
|
19
21
|
|
20
22
|
# @return [String] OFMX region all features in this document belong to
|
@@ -43,7 +45,7 @@ module AIXM
|
|
43
45
|
end
|
44
46
|
|
45
47
|
def region=(value)
|
46
|
-
fail(ArgumentError, "invalid region") unless value.nil? || value
|
48
|
+
fail(ArgumentError, "invalid region") unless value.nil? || value&.upcase&.match?(REGION_RE)
|
47
49
|
@region = value&.upcase
|
48
50
|
end
|
49
51
|
|
data/lib/aixm/feature/airport.rb
CHANGED
@@ -20,12 +20,17 @@ module AIXM
|
|
20
20
|
# airport.declination = Float or nil
|
21
21
|
# airport.transition_z = AIXM.z or nil
|
22
22
|
# airport.timetable = AIXM.timetable or nil
|
23
|
+
# airport.operator = String or nil
|
23
24
|
# airport.remarks = String or nil
|
24
25
|
# airport.add_runway(AIXM.runway)
|
26
|
+
# airport.add_fato(AIXM.fato)
|
25
27
|
# airport.add_helipad(AIXM.helipad)
|
26
28
|
# airport.add_usage_limitation(UsageLimitation::TYPES)
|
27
29
|
# airport.add_address(AIXM.address)
|
28
30
|
#
|
31
|
+
# For airports without an +id+, you may assign the two character region
|
32
|
+
# (e.g. "LF") which will be combined with an 8 character digest of +name+.
|
33
|
+
#
|
29
34
|
# @see https://github.com/openflightmaps/ofmx/wiki/Airport#ahp-airport
|
30
35
|
class Airport < Feature
|
31
36
|
public_class_method :new
|
@@ -79,12 +84,18 @@ module AIXM
|
|
79
84
|
# @return [AIXM::Component::Timetable, nil] operating hours
|
80
85
|
attr_reader :timetable
|
81
86
|
|
87
|
+
# @return [String, nil] operator of the airport
|
88
|
+
attr_reader :operator
|
89
|
+
|
82
90
|
# @return [String, nil] free text remarks
|
83
91
|
attr_reader :remarks
|
84
92
|
|
85
93
|
# @return [Array<AIXM::Component::Runway>] runways present at this airport
|
86
94
|
attr_reader :runways
|
87
95
|
|
96
|
+
# @return [Array<AIXM::Component::FATO>] FATOs present at this airport
|
97
|
+
attr_reader :fatos
|
98
|
+
|
88
99
|
# @return [Array<AIXM::Component::Helipad>] helipads present at this airport
|
89
100
|
attr_reader :helipads
|
90
101
|
|
@@ -94,10 +105,10 @@ module AIXM
|
|
94
105
|
# @return [Array<AIXM::Feature::Address>] postal address, url, A/A or A/G frequency etc
|
95
106
|
attr_reader :addresses
|
96
107
|
|
97
|
-
def initialize(source: nil, organisation:, id
|
108
|
+
def initialize(source: nil, organisation:, id: nil, name:, xy:)
|
98
109
|
super(source: source)
|
99
110
|
self.organisation, self.id, self.name, self.xy = organisation, id, name, xy
|
100
|
-
@runways, @helipads, @usage_limitations, @addresses = [], [], [], []
|
111
|
+
@runways, @fatos, @helipads, @usage_limitations, @addresses = [], [], [], [], []
|
101
112
|
end
|
102
113
|
|
103
114
|
# @return [String]
|
@@ -110,8 +121,11 @@ module AIXM
|
|
110
121
|
@organisation = value
|
111
122
|
end
|
112
123
|
|
124
|
+
# For airports without an +id+, you may assign the two character region
|
125
|
+
# (e.g. "LF") which will be combined with an 8 character digest of +name+.
|
113
126
|
def id=(value)
|
114
|
-
|
127
|
+
value = [value, [name].to_digest].join.upcase if value&.upcase&.match? AIXM::Document::REGION_RE
|
128
|
+
fail(ArgumentError, "invalid id") unless value&.upcase&.match? ID_RE
|
115
129
|
@id = value.upcase
|
116
130
|
end
|
117
131
|
|
@@ -134,9 +148,9 @@ module AIXM
|
|
134
148
|
def type
|
135
149
|
@type = case
|
136
150
|
when @type then @type
|
137
|
-
when runways.any? && helipads.any? then :aerodrome_and_heliport
|
151
|
+
when runways.any? && (helipads.any? || fatos.any?) then :aerodrome_and_heliport
|
138
152
|
when runways.any? then :aerodrome
|
139
|
-
when helipads.any? then :heliport
|
153
|
+
when helipads.any? || fatos.any? then :heliport
|
140
154
|
end
|
141
155
|
end
|
142
156
|
|
@@ -172,6 +186,11 @@ module AIXM
|
|
172
186
|
@timetable = value
|
173
187
|
end
|
174
188
|
|
189
|
+
def operator=(value)
|
190
|
+
fail(ArgumentError, "invalid name") unless value.nil? || value.is_a?(String)
|
191
|
+
@operator = value&.uptrans
|
192
|
+
end
|
193
|
+
|
175
194
|
def remarks=(value)
|
176
195
|
@remarks = value&.to_s
|
177
196
|
end
|
@@ -187,6 +206,17 @@ module AIXM
|
|
187
206
|
self
|
188
207
|
end
|
189
208
|
|
209
|
+
# Add a FATO to the airport.
|
210
|
+
#
|
211
|
+
# @param FATO [AIXM::Component::FATO] FATO instance
|
212
|
+
# @return [self]
|
213
|
+
def add_fato(fato)
|
214
|
+
fail(ArgumentError, "invalid FATO") unless fato.is_a? AIXM::Component::FATO
|
215
|
+
fato.send(:airport=, self)
|
216
|
+
@fatos << fato
|
217
|
+
self
|
218
|
+
end
|
219
|
+
|
190
220
|
# Add a helipad to the airport.
|
191
221
|
#
|
192
222
|
# @param helipad [AIXM::Component::Helipad] helipad instance
|
@@ -272,6 +302,7 @@ module AIXM
|
|
272
302
|
ahp.uomDistVer(z.unit.upcase.to_s)
|
273
303
|
end
|
274
304
|
ahp.valMagVar(declination) if declination
|
305
|
+
ahp.txtNameAdmin(operator) if operator
|
275
306
|
if transition_z
|
276
307
|
ahp.valTransitionAlt(transition_z.alt)
|
277
308
|
ahp.uomTransitionAlt(transition_z.unit.upcase.to_s)
|
@@ -282,6 +313,9 @@ module AIXM
|
|
282
313
|
runways.each do |runway|
|
283
314
|
builder << runway.to_xml
|
284
315
|
end
|
316
|
+
fatos.each do |fato|
|
317
|
+
builder << fato.to_xml
|
318
|
+
end
|
285
319
|
helipads.each do |helipad|
|
286
320
|
builder << helipad.to_xml
|
287
321
|
end
|