aixm 0.2.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.ruby-version +1 -1
  4. data/.yardopts +3 -0
  5. data/CHANGELOG.md +34 -14
  6. data/Guardfile +1 -0
  7. data/README.md +64 -257
  8. data/lib/aixm.rb +16 -7
  9. data/lib/aixm/component.rb +6 -0
  10. data/lib/aixm/component/frequency.rb +135 -0
  11. data/lib/aixm/component/geometry.rb +34 -23
  12. data/lib/aixm/component/geometry/arc.rb +37 -22
  13. data/lib/aixm/component/geometry/border.rb +29 -20
  14. data/lib/aixm/component/geometry/circle.rb +39 -22
  15. data/lib/aixm/component/geometry/point.rb +29 -13
  16. data/lib/aixm/component/helipad.rb +154 -0
  17. data/lib/aixm/component/layer.rb +91 -0
  18. data/lib/aixm/component/runway.rb +294 -0
  19. data/lib/aixm/component/service.rb +170 -0
  20. data/lib/aixm/component/timetable.rb +65 -0
  21. data/lib/aixm/component/vertical_limits.rb +65 -29
  22. data/lib/aixm/config.rb +87 -0
  23. data/lib/aixm/document.rb +66 -42
  24. data/lib/aixm/errors.rb +11 -0
  25. data/lib/aixm/f.rb +34 -20
  26. data/lib/aixm/feature.rb +38 -0
  27. data/lib/aixm/feature/airport.rb +473 -0
  28. data/lib/aixm/feature/airspace.rb +145 -92
  29. data/lib/aixm/feature/navigational_aid.rb +94 -0
  30. data/lib/aixm/feature/navigational_aid/designated_point.rb +50 -54
  31. data/lib/aixm/feature/navigational_aid/dme.rb +48 -40
  32. data/lib/aixm/feature/navigational_aid/marker.rb +55 -45
  33. data/lib/aixm/feature/navigational_aid/ndb.rb +54 -50
  34. data/lib/aixm/feature/navigational_aid/tacan.rb +38 -31
  35. data/lib/aixm/feature/navigational_aid/vor.rb +84 -76
  36. data/lib/aixm/feature/organisation.rb +97 -0
  37. data/lib/aixm/feature/unit.rb +152 -0
  38. data/lib/aixm/refinements.rb +132 -47
  39. data/lib/aixm/shortcuts.rb +11 -6
  40. data/lib/aixm/version.rb +1 -1
  41. data/lib/aixm/xy.rb +64 -20
  42. data/lib/aixm/z.rb +51 -22
  43. data/{lib/aixm/schemas → schemas/aixm}/4.5/AIXM-DataTypes.xsd +0 -0
  44. data/{lib/aixm/schemas → schemas/aixm}/4.5/AIXM-Features.xsd +0 -0
  45. data/{lib/aixm/schemas → schemas/aixm}/4.5/AIXM-Snapshot.xsd +0 -0
  46. data/schemas/ofmx/0/OFMX-DataTypes.xsd +5077 -0
  47. data/schemas/ofmx/0/OFMX-Features.xsd +9955 -0
  48. data/schemas/ofmx/0/OFMX-Snapshot.xsd +217 -0
  49. data/spec/factory.rb +209 -33
  50. data/spec/lib/aixm/component/frequency_spec.rb +75 -0
  51. data/spec/lib/aixm/component/geometry/arc_spec.rb +28 -22
  52. data/spec/lib/aixm/component/geometry/border_spec.rb +23 -20
  53. data/spec/lib/aixm/component/geometry/circle_spec.rb +31 -22
  54. data/spec/lib/aixm/component/geometry/point_spec.rb +11 -14
  55. data/spec/lib/aixm/component/geometry_spec.rb +150 -69
  56. data/spec/lib/aixm/component/helipad_spec.rb +136 -0
  57. data/spec/lib/aixm/component/layer_spec.rb +110 -0
  58. data/spec/lib/aixm/component/runway_spec.rb +402 -0
  59. data/spec/lib/aixm/component/service_spec.rb +61 -0
  60. data/spec/lib/aixm/component/timetable_spec.rb +49 -0
  61. data/spec/lib/aixm/component/vertical_limits_spec.rb +39 -20
  62. data/spec/lib/aixm/config_spec.rb +41 -0
  63. data/spec/lib/aixm/document_spec.rb +637 -147
  64. data/spec/lib/aixm/errors_spec.rb +14 -0
  65. data/spec/lib/aixm/f_spec.rb +17 -10
  66. data/spec/lib/aixm/feature/airport_spec.rb +546 -0
  67. data/spec/lib/aixm/feature/airspace_spec.rb +349 -226
  68. data/spec/lib/aixm/feature/navigational_aid/designated_point_spec.rb +47 -36
  69. data/spec/lib/aixm/feature/navigational_aid/dme_spec.rb +61 -36
  70. data/spec/lib/aixm/feature/navigational_aid/marker_spec.rb +61 -113
  71. data/spec/lib/aixm/feature/navigational_aid/ndb_spec.rb +65 -79
  72. data/spec/lib/aixm/feature/navigational_aid/tacan_spec.rb +57 -36
  73. data/spec/lib/aixm/feature/navigational_aid/vor_spec.rb +86 -112
  74. data/spec/lib/aixm/feature/navigational_aid_spec.rb +52 -0
  75. data/spec/lib/aixm/feature/organisation_spec.rb +77 -0
  76. data/spec/lib/aixm/feature/unit_spec.rb +227 -0
  77. data/spec/lib/aixm/feature_spec.rb +58 -0
  78. data/spec/lib/aixm/refinements_spec.rb +187 -178
  79. data/spec/lib/aixm/xy_spec.rb +45 -34
  80. data/spec/lib/aixm/z_spec.rb +19 -21
  81. data/spec/macros/organisation.rb +11 -0
  82. data/spec/macros/remarks.rb +12 -0
  83. data/spec/macros/timetable.rb +11 -0
  84. data/spec/macros/xy.rb +11 -0
  85. data/spec/macros/z_qnh.rb +11 -0
  86. data/spec/spec_helper.rb +26 -0
  87. metadata +60 -19
  88. data/lib/aixm/base.rb +0 -10
  89. data/lib/aixm/component/base.rb +0 -6
  90. data/lib/aixm/component/class_layer.rb +0 -46
  91. data/lib/aixm/component/geometry/base.rb +0 -8
  92. data/lib/aixm/component/schedule.rb +0 -43
  93. data/lib/aixm/feature/base.rb +0 -6
  94. data/lib/aixm/feature/navigational_aid/base.rb +0 -79
  95. data/spec/lib/aixm/component/class_layer_spec.rb +0 -74
  96. data/spec/lib/aixm/component/schedule_spec.rb +0 -33
  97. data/spec/lib/aixm/feature/navigational_aid/base_spec.rb +0 -41
@@ -0,0 +1,61 @@
1
+ require_relative '../../../spec_helper'
2
+
3
+ describe AIXM::Component::Service do
4
+ subject do
5
+ AIXM::Factory.service
6
+ end
7
+
8
+ describe :initialize do
9
+ it "sets defaults" do
10
+ subject = AIXM::Component::Service.new(
11
+ name: "PUJAUT TOWER",
12
+ type: :approach_control_service
13
+ )
14
+ subject.frequencies.must_equal []
15
+ end
16
+ end
17
+
18
+ describe :name= do
19
+ it "fails on invalid values" do
20
+ -> { subject.name = :foobar }.must_raise ArgumentError
21
+ -> { subject.name = nil }.must_raise ArgumentError
22
+ end
23
+
24
+ it "upcases and transcodes valid values" do
25
+ subject.tap { |s| s.name = 'Nîmes-Alès' }.name.must_equal 'NIMES-ALES'
26
+ end
27
+ end
28
+
29
+ describe :type= do
30
+ it "fails on invalid values" do
31
+ -> { subject.type = :foobar }.must_raise ArgumentError
32
+ -> { subject.type = nil }.must_raise ArgumentError
33
+ end
34
+
35
+ it "looks up valid values" do
36
+ subject.tap { |s| s.type = :area_control_service }.type.must_equal :area_control_service
37
+ subject.tap { |s| s.type = :ATIS }.type.must_equal :automated_terminal_information_service
38
+ end
39
+ end
40
+
41
+ describe :timetable= do
42
+ macro :timetable
43
+ end
44
+
45
+ describe :remarks= do
46
+ macro :remarks
47
+ end
48
+
49
+ describe :add_frequency do
50
+ it "fails on invalid arguments" do
51
+ -> { subject.add_frequency nil }.must_raise ArgumentError
52
+ end
53
+
54
+ it "adds frequency to the array" do
55
+ count = subject.frequencies.count
56
+ subject.add_frequency(AIXM::Factory.frequency)
57
+ subject.frequencies.count.must_equal count + 1
58
+ end
59
+ end
60
+
61
+ end
@@ -0,0 +1,49 @@
1
+ require_relative '../../../spec_helper'
2
+
3
+ describe AIXM::Component::Timetable do
4
+ subject do
5
+ AIXM::Factory.timetable
6
+ end
7
+
8
+ describe :code= do
9
+ it "fails on invalid values" do
10
+ [nil, :foobar, 123].wont_be_written_to subject, :code
11
+ end
12
+
13
+ it "looks up valid values" do
14
+ subject.tap { |s| s.code = :notam }.code.must_equal :notam
15
+ subject.tap { |s| s.code = :H24 }.code.must_equal :continuous
16
+ end
17
+ end
18
+
19
+ describe :remarks= do
20
+ macro :remarks
21
+ end
22
+
23
+ describe :to_xml do
24
+ it "builds correct complete AIXM" do
25
+ AIXM.aixm!
26
+ subject.to_xml.must_equal <<~END
27
+ <Timetable>
28
+ <codeWorkHr>HJ</codeWorkHr>
29
+ <txtRmkWorkHr>timetable remarks</txtRmkWorkHr>
30
+ </Timetable>
31
+ END
32
+ end
33
+
34
+ it "builds correct minimal AIXM" do
35
+ AIXM.aixm!
36
+ subject.remarks = nil
37
+ subject.to_xml.must_equal <<~END
38
+ <Timetable>
39
+ <codeWorkHr>HJ</codeWorkHr>
40
+ </Timetable>
41
+ END
42
+ end
43
+
44
+ it "builds with arbitrary tag" do
45
+ subject.to_xml.must_match(/<Timetable>/)
46
+ subject.to_xml(as: :FooBar).must_match(/<FooBar>/)
47
+ end
48
+ end
49
+ end
@@ -1,33 +1,50 @@
1
1
  require_relative '../../../spec_helper'
2
2
 
3
3
  describe AIXM::Component::VerticalLimits do
4
- describe :initialize do
5
- it "won't accept invalid arguments" do
6
- z = AIXM.z(1000, :qnh)
7
- -> { AIXM.vertical_limits(upper_z: 0, lower_z: z, max_z: z, min_z: z) }.must_raise ArgumentError
8
- -> { AIXM.vertical_limits(upper_z: z, lower_z: 0, max_z: z, min_z: z) }.must_raise ArgumentError
9
- -> { AIXM.vertical_limits(upper_z: z, lower_z: z, max_z: 0, min_z: z) }.must_raise ArgumentError
10
- -> { AIXM.vertical_limits(upper_z: z, lower_z: z, max_z: z, min_z: 0) }.must_raise ArgumentError
4
+ subject do
5
+ AIXM::Factory.vertical_limits
6
+ end
7
+
8
+ describe :upper_z= do
9
+ it "fails on invalid values" do
10
+ [nil, :foobar, 123].wont_be_written_to subject, :upper_z
11
11
  end
12
12
  end
13
13
 
14
- describe :to_digest do
15
- it "must return digest of payload" do
16
- subject = AIXM.vertical_limits(
17
- upper_z: AIXM.z(2000, :qnh),
18
- lower_z: AIXM::GROUND
19
- )
20
- subject.to_digest.must_equal 867600845
14
+ describe :lower_z= do
15
+ it "fails on invalid values" do
16
+ [nil, :foobar, 123].wont_be_written_to subject, :lower_z
17
+ end
18
+ end
19
+
20
+ describe :max_z= do
21
+ it "fails on invalid values" do
22
+ [:foobar, 123].wont_be_written_to subject, :max_z
23
+ end
24
+
25
+ it "accepts nil value" do
26
+ [nil].must_be_written_to subject, :max_z
27
+ end
28
+ end
29
+
30
+ describe :min_z= do
31
+ it "fails on invalid values" do
32
+ [:foobar, 123].wont_be_written_to subject, :min_z
33
+ end
34
+
35
+ it "accepts nil value" do
36
+ [nil].must_be_written_to subject, :max_z
21
37
  end
22
38
  end
23
39
 
24
40
  describe :to_aixm do
25
- it "must build correct XML with only upper_z and lower_z" do
41
+ it "builds correct AIXM with only upper_z and lower_z" do
26
42
  subject = AIXM.vertical_limits(
27
43
  upper_z: AIXM.z(2000, :qnh),
28
44
  lower_z: AIXM::GROUND
29
45
  )
30
- subject.to_aixm.must_equal <<~END
46
+ AIXM.aixm!
47
+ subject.to_xml.must_equal <<~END
31
48
  <codeDistVerUpper>ALT</codeDistVerUpper>
32
49
  <valDistVerUpper>2000</valDistVerUpper>
33
50
  <uomDistVerUpper>FT</uomDistVerUpper>
@@ -37,13 +54,14 @@ describe AIXM::Component::VerticalLimits do
37
54
  END
38
55
  end
39
56
 
40
- it "must build correct XML with additional max_z" do
57
+ it "builds correct AIXM with additional max_z" do
41
58
  subject = AIXM.vertical_limits(
42
59
  upper_z: AIXM.z(65, :qne),
43
60
  lower_z: AIXM.z(1000, :qfe),
44
61
  max_z: AIXM.z(6000, :qnh)
45
62
  )
46
- subject.to_aixm.must_equal <<~END
63
+ AIXM.aixm!
64
+ subject.to_xml.must_equal <<~END
47
65
  <codeDistVerUpper>STD</codeDistVerUpper>
48
66
  <valDistVerUpper>65</valDistVerUpper>
49
67
  <uomDistVerUpper>FL</uomDistVerUpper>
@@ -56,13 +74,14 @@ describe AIXM::Component::VerticalLimits do
56
74
  END
57
75
  end
58
76
 
59
- it "must build correct XML with additional min_z" do
77
+ it "builds correct AIXM with additional min_z" do
60
78
  subject = AIXM.vertical_limits(
61
79
  upper_z: AIXM.z(65, :qne),
62
80
  lower_z: AIXM.z(45, :qne),
63
81
  min_z: AIXM.z(3000, :qnh)
64
82
  )
65
- subject.to_aixm.must_equal <<~END
83
+ AIXM.aixm!
84
+ subject.to_xml.must_equal <<~END
66
85
  <codeDistVerUpper>STD</codeDistVerUpper>
67
86
  <valDistVerUpper>65</valDistVerUpper>
68
87
  <uomDistVerUpper>FL</uomDistVerUpper>
@@ -0,0 +1,41 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe AIXM do
4
+ describe :initialize_config do
5
+ it "must use AIXM" do
6
+ AIXM.send :initialize_config
7
+ AIXM.schema.must_equal :aixm
8
+ end
9
+ end
10
+
11
+ describe :config do
12
+ it "must set and get arbitrary config options" do
13
+ AIXM.config.foo = :bar
14
+ AIXM.config.foo.must_equal :bar
15
+ end
16
+ end
17
+
18
+ describe :schema do
19
+ it "must return schema identifier" do
20
+ AIXM.aixm!
21
+ AIXM.schema.must_equal :aixm
22
+ end
23
+
24
+ it "must return schema details" do
25
+ AIXM.aixm!
26
+ AIXM.schema(:root).must_equal 'AIXM-Snapshot'
27
+ end
28
+ end
29
+
30
+ describe "<schema>! and <schema>?" do
31
+ it "must set and query schemas" do
32
+ AIXM.aixm!
33
+ AIXM.must_be :aixm?
34
+ AIXM.wont_be :ofmx?
35
+ AIXM.ofmx!
36
+ AIXM.wont_be :aixm?
37
+ AIXM.must_be :ofmx?
38
+ end
39
+ end
40
+
41
+ end
@@ -1,50 +1,77 @@
1
1
  require_relative '../../spec_helper'
2
2
 
3
3
  describe AIXM::Document do
4
+ subject do
5
+ AIXM.document
6
+ end
7
+
4
8
  describe :initialize do
5
- it "won't accept invalid arguments" do
6
- -> { AIXM.document(created_at: 0) }.must_raise ArgumentError
7
- -> { AIXM.document(created_at: 'foobar') }.must_raise ArgumentError
8
- -> { AIXM.document(effective_at: 0) }.must_raise ArgumentError
9
- -> { AIXM.document(effective_at: 'foobar') }.must_raise ArgumentError
9
+ it "sets defaults" do
10
+ subject.features.must_equal []
10
11
  end
12
+ end
11
13
 
12
- it "must accept strings" do
13
- string = '2018-01-01 12:00:00 +0100'
14
- AIXM.document(created_at: string).created_at.must_equal Time.parse(string)
15
- AIXM.document(effective_at: string).effective_at.must_equal Time.parse(string)
14
+ describe :namespace= do
15
+ it "fails on invalid values" do
16
+ ['foobar', :foobar].wont_be_written_to subject, :namespace
17
+ end
18
+
19
+ it "sets random UUID for nil value" do
20
+ subject.tap { |s| s.namespace = nil }.namespace.must_match AIXM::Document::NAMESPACE_PATTERN
16
21
  end
17
22
 
18
- it "must accept dates" do
19
- date = Date.parse('2018-01-01')
20
- AIXM.document(created_at: date).created_at.must_equal date.to_time
21
- AIXM.document(effective_at: date).effective_at.must_equal date.to_time
23
+ it "accepts UUID value" do
24
+ [SecureRandom.uuid].must_be_written_to subject, :namespace
22
25
  end
26
+ end
23
27
 
24
- it "must accept times" do
25
- time = Time.parse('2018-01-01 12:00:00 +0100')
26
- AIXM.document(created_at: time).created_at.must_equal time
27
- AIXM.document(effective_at: time).effective_at.must_equal time
28
+ describe :created_at= do
29
+ it "fails on invalid values" do
30
+ [:foobar, 123].wont_be_written_to subject, :created_at
31
+ end
32
+
33
+ it "parses dates and times" do
34
+ string = '2018-01-01 12:00:00 +0100'
35
+ subject.tap { |s| s.created_at = string }.created_at.must_equal Time.parse(string)
28
36
  end
29
37
 
30
- it "must accept nils" do
31
- AIXM.document(created_at: nil).created_at.must_be :nil?
32
- AIXM.document(effective_at: nil).effective_at.must_be :nil?
38
+ it "falls back to effective_at first" do
39
+ subject.effective_at = Time.now
40
+ subject.created_at = nil
41
+ subject.created_at.must_equal subject.effective_at
42
+ end
43
+
44
+ it "falls back to now second" do
45
+ subject.created_at = nil
46
+ subject.created_at.must_be_close_to Time.now
33
47
  end
34
48
  end
35
49
 
36
- context "incomplete" do
37
- subject do
38
- AIXM.document
50
+ describe :effective_at= do
51
+ it "fails on invalid values" do
52
+ [:foobar, 123].wont_be_written_to subject, :effective_at
39
53
  end
40
54
 
41
- it "must fail validation" do
42
- subject.wont_be :complete?
55
+ it "parses dates and times" do
56
+ string = '2018-01-01 12:00:00 +0100'
57
+ subject.tap { |s| s.effective_at = string }.effective_at.must_equal Time.parse(string)
58
+ end
59
+
60
+ it "falls back to created_at first" do
61
+ subject.effective_at = Time.now
62
+ subject.effective_at = nil
63
+ subject.effective_at.must_equal subject.created_at
64
+ end
65
+
66
+ it "falls back to now second" do
67
+ subject.effective_at = nil
68
+ subject.effective_at.must_be_close_to Time.now
43
69
  end
44
70
  end
45
71
 
46
- context "complete" do
72
+ context "AIXM" do
47
73
  subject do
74
+ AIXM.aixm!
48
75
  AIXM::Factory.document
49
76
  end
50
77
 
@@ -52,19 +79,229 @@ describe AIXM::Document do
52
79
  subject.errors.must_equal []
53
80
  end
54
81
 
55
- it "must pass validation" do
56
- subject.must_be :complete?
57
- end
58
-
59
- it "must build correct XML without extensions" do
60
- subject.to_aixm.must_equal <<~"END"
82
+ it "builds correct AIXM" do
83
+ subject.to_xml.must_equal <<~"END"
61
84
  <?xml version="1.0" encoding="UTF-8"?>
62
- <AIXM-Snapshot xmlns:xsi="http://www.aixm.aero/schema/4.5/AIXM-Snapshot.xsd" version="4.5" origin="AIXM #{AIXM::VERSION} Ruby gem" created="2018-01-18T12:00:00+01:00" effective="2018-01-18T12:00:00+01:00">
85
+ <AIXM-Snapshot xmlns:xsi="http://www.aixm.aero/schema/4.5/AIXM-Snapshot.xsd" version="4.5" origin="rubygem aixm-0.3.0" created="2018-01-01T12:00:00+01:00" effective="2018-01-01T12:00:00+01:00">
86
+ <!-- Organisation: FRANCE -->
87
+ <Org>
88
+ <OrgUid>
89
+ <txtName>FRANCE</txtName>
90
+ </OrgUid>
91
+ <codeId>LF</codeId>
92
+ <codeType>S</codeType>
93
+ <txtRmk>Oversea departments not included</txtRmk>
94
+ </Org>
95
+ <!-- Unit: PUJAUT TWR -->
96
+ <Uni>
97
+ <UniUid>
98
+ <txtName>PUJAUT TWR</txtName>
99
+ </UniUid>
100
+ <OrgUid>
101
+ <txtName>FRANCE</txtName>
102
+ </OrgUid>
103
+ <AhpUid>
104
+ <codeId>LFNT</codeId>
105
+ </AhpUid>
106
+ <codeType>TWR</codeType>
107
+ <codeClass>ICAO</codeClass>
108
+ <txtRmk>A/A FR only</txtRmk>
109
+ </Uni>
110
+ <Ser>
111
+ <SerUid>
112
+ <UniUid>
113
+ <txtName>PUJAUT TWR</txtName>
114
+ </UniUid>
115
+ <codeType>APP</codeType>
116
+ <noSeq>1</noSeq>
117
+ </SerUid>
118
+ <Stt>
119
+ <codeWorkHr>H24</codeWorkHr>
120
+ </Stt>
121
+ <txtRmk>service remarks</txtRmk>
122
+ </Ser>
123
+ <Fqy>
124
+ <FqyUid>
125
+ <SerUid>
126
+ <UniUid>
127
+ <txtName>PUJAUT TWR</txtName>
128
+ </UniUid>
129
+ <codeType>APP</codeType>
130
+ <noSeq>1</noSeq>
131
+ </SerUid>
132
+ <valFreqTrans>123.35</valFreqTrans>
133
+ </FqyUid>
134
+ <valFreqRec>124.1</valFreqRec>
135
+ <uomFreq>MHZ</uomFreq>
136
+ <Ftt>
137
+ <codeWorkHr>H24</codeWorkHr>
138
+ </Ftt>
139
+ <txtRmk>frequency remarks</txtRmk>
140
+ <Cdl>
141
+ <txtCallSign>PUJAUT CONTROL</txtCallSign>
142
+ <codeLang>EN</codeLang>
143
+ </Cdl>
144
+ <Cdl>
145
+ <txtCallSign>PUJAUT CONTROLE</txtCallSign>
146
+ <codeLang>FR</codeLang>
147
+ </Cdl>
148
+ </Fqy>
149
+ <!-- Airport: LFNT AVIGNON-PUJAUT -->
150
+ <Ahp>
151
+ <AhpUid>
152
+ <codeId>LFNT</codeId>
153
+ </AhpUid>
154
+ <OrgUid>
155
+ <txtName>FRANCE</txtName>
156
+ </OrgUid>
157
+ <txtName>AVIGNON-PUJAUT</txtName>
158
+ <codeIcao>LFNT</codeIcao>
159
+ <codeType>AH</codeType>
160
+ <geoLat>435946.00N</geoLat>
161
+ <geoLong>0044516.00E</geoLong>
162
+ <codeDatum>WGE</codeDatum>
163
+ <valElev>146</valElev>
164
+ <uomDistVer>FT</uomDistVer>
165
+ <valMagVar>1.08</valMagVar>
166
+ <valTransitionAlt>10000</valTransitionAlt>
167
+ <uomTransitionAlt>FT</uomTransitionAlt>
168
+ <txtRmk>Restricted access</txtRmk>
169
+ </Ahp>
170
+ <Rwy>
171
+ <RwyUid>
172
+ <AhpUid>
173
+ <codeId>LFNT</codeId>
174
+ </AhpUid>
175
+ <txtDesig>16L/34R</txtDesig>
176
+ </RwyUid>
177
+ <valLen>650</valLen>
178
+ <valWid>80</valWid>
179
+ <uomDimRwy>M</uomDimRwy>
180
+ <codeComposition>GRADE</codeComposition>
181
+ <codeSts>CLSD</codeSts>
182
+ <txtRmk>Markings eroded</txtRmk>
183
+ </Rwy>
184
+ <Rdn>
185
+ <RdnUid>
186
+ <RwyUid>
187
+ <AhpUid>
188
+ <codeId>LFNT</codeId>
189
+ </AhpUid>
190
+ <txtDesig>16L/34R</txtDesig>
191
+ </RwyUid>
192
+ <txtDesig>16L</txtDesig>
193
+ </RdnUid>
194
+ <geoLat>440007.63N</geoLat>
195
+ <geoLong>0044507.81E</geoLong>
196
+ <valTrueBrg>165</valTrueBrg>
197
+ <valMagBrg>166</valMagBrg>
198
+ <valElevTdz>147</valElevTdz>
199
+ <uomElevTdz>FT</uomElevTdz>
200
+ <txtRmk>forth remarks</txtRmk>
201
+ </Rdn>
202
+ <Rdd>
203
+ <RddUid>
204
+ <RdnUid>
205
+ <RwyUid>
206
+ <AhpUid>
207
+ <codeId>LFNT</codeId>
208
+ </AhpUid>
209
+ <txtDesig>16L/34R</txtDesig>
210
+ </RwyUid>
211
+ <txtDesig>16L</txtDesig>
212
+ </RdnUid>
213
+ <codeType>DPLM</codeType>
214
+ <codeDayPeriod>A</codeDayPeriod>
215
+ </RddUid>
216
+ <valDist>131</valDist>
217
+ <uomDist>M</uomDist>
218
+ <txtRmk>forth remarks</txtRmk>
219
+ </Rdd>
220
+ <Rdn>
221
+ <RdnUid>
222
+ <RwyUid>
223
+ <AhpUid>
224
+ <codeId>LFNT</codeId>
225
+ </AhpUid>
226
+ <txtDesig>16L/34R</txtDesig>
227
+ </RwyUid>
228
+ <txtDesig>34R</txtDesig>
229
+ </RdnUid>
230
+ <geoLat>435925.31N</geoLat>
231
+ <geoLong>0044523.24E</geoLong>
232
+ <valTrueBrg>345</valTrueBrg>
233
+ <valMagBrg>346</valMagBrg>
234
+ <txtRmk>back remarks</txtRmk>
235
+ </Rdn>
236
+ <Rdd>
237
+ <RddUid>
238
+ <RdnUid>
239
+ <RwyUid>
240
+ <AhpUid>
241
+ <codeId>LFNT</codeId>
242
+ </AhpUid>
243
+ <txtDesig>16L/34R</txtDesig>
244
+ </RwyUid>
245
+ <txtDesig>34R</txtDesig>
246
+ </RdnUid>
247
+ <codeType>DPLM</codeType>
248
+ <codeDayPeriod>A</codeDayPeriod>
249
+ </RddUid>
250
+ <valDist>209</valDist>
251
+ <uomDist>M</uomDist>
252
+ <txtRmk>back remarks</txtRmk>
253
+ </Rdd>
254
+ <Tla>
255
+ <TlaUid>
256
+ <AhpUid>
257
+ <codeId>LFNT</codeId>
258
+ </AhpUid>
259
+ <txtDesig>H1</txtDesig>
260
+ </TlaUid>
261
+ <geoLat>435956.94N</geoLat>
262
+ <geoLong>0044505.56E</geoLong>
263
+ <codeDatum>WGE</codeDatum>
264
+ <valElev>141</valElev>
265
+ <uomDistVer>FT</uomDistVer>
266
+ <valLen>20</valLen>
267
+ <valWid>20</valWid>
268
+ <uomDim>M</uomDim>
269
+ <codeComposition>GRASS</codeComposition>
270
+ <codeSts>OTHER</codeSts>
271
+ <txtRmk>Authorizaton by AD operator required</txtRmk>
272
+ </Tla>
273
+ <Ahu>
274
+ <AhuUid>
275
+ <AhpUid>
276
+ <codeId>LFNT</codeId>
277
+ </AhpUid>
278
+ </AhuUid>
279
+ <UsageLimitation>
280
+ <codeUsageLimitation>PERMIT</codeUsageLimitation>
281
+ </UsageLimitation>
282
+ <UsageLimitation>
283
+ <codeUsageLimitation>RESERV</codeUsageLimitation>
284
+ <UsageCondition>
285
+ <AircraftClass>
286
+ <codeType>E</codeType>
287
+ </AircraftClass>
288
+ </UsageCondition>
289
+ <UsageCondition>
290
+ <FlightClass>
291
+ <codeOrigin>INTL</codeOrigin>
292
+ </FlightClass>
293
+ </UsageCondition>
294
+ <Timetable>
295
+ <codeWorkHr>H24</codeWorkHr>
296
+ </Timetable>
297
+ <txtRmk>reservation remarks</txtRmk>
298
+ </UsageLimitation>
299
+ </Ahu>
63
300
  <!-- Airspace: [D] POLYGON AIRSPACE -->
64
301
  <Ase>
65
- <AseUid mid="367297292">
302
+ <AseUid>
66
303
  <codeType>D</codeType>
67
- <codeId>367297292</codeId>
304
+ <codeId>PA</codeId>
68
305
  </AseUid>
69
306
  <txtLocalType>POLYGON</txtLocalType>
70
307
  <txtName>POLYGON AIRSPACE</txtName>
@@ -84,13 +321,13 @@ describe AIXM::Document do
84
321
  <Att>
85
322
  <codeWorkHr>H24</codeWorkHr>
86
323
  </Att>
87
- <txtRmk>polygon airspace</txtRmk>
324
+ <txtRmk>airspace layer</txtRmk>
88
325
  </Ase>
89
326
  <Abd>
90
327
  <AbdUid>
91
- <AseUid mid="367297292">
328
+ <AseUid>
92
329
  <codeType>D</codeType>
93
- <codeId>367297292</codeId>
330
+ <codeId>PA</codeId>
94
331
  </AseUid>
95
332
  </AbdUid>
96
333
  <Avx>
@@ -102,6 +339,9 @@ describe AIXM::Document do
102
339
  <geoLongArc>0073348.00E</geoLongArc>
103
340
  </Avx>
104
341
  <Avx>
342
+ <GbrUid>
343
+ <txtName>FRANCE_GERMANY</txtName>
344
+ </GbrUid>
105
345
  <codeType>FNT</codeType>
106
346
  <geoLat>475637.00N</geoLat>
107
347
  <geoLong>0073545.00E</geoLong>
@@ -116,9 +356,9 @@ describe AIXM::Document do
116
356
  </Abd>
117
357
  <!-- Airspace: [D] CIRCLE AIRSPACE -->
118
358
  <Ase>
119
- <AseUid mid="332058082">
359
+ <AseUid>
120
360
  <codeType>D</codeType>
121
- <codeId>332058082</codeId>
361
+ <codeId>CA</codeId>
122
362
  </AseUid>
123
363
  <txtLocalType>CIRCLE</txtLocalType>
124
364
  <txtName>CIRCLE AIRSPACE</txtName>
@@ -138,13 +378,13 @@ describe AIXM::Document do
138
378
  <Att>
139
379
  <codeWorkHr>H24</codeWorkHr>
140
380
  </Att>
141
- <txtRmk>circle airspace</txtRmk>
381
+ <txtRmk>airspace layer</txtRmk>
142
382
  </Ase>
143
383
  <Abd>
144
384
  <AbdUid>
145
- <AseUid mid="332058082">
385
+ <AseUid>
146
386
  <codeType>D</codeType>
147
- <codeId>332058082</codeId>
387
+ <codeId>CA</codeId>
148
388
  </AseUid>
149
389
  </AbdUid>
150
390
  <Avx>
@@ -158,30 +398,26 @@ describe AIXM::Document do
158
398
  </Abd>
159
399
  <!-- NavigationalAid: [DesignatedPoint:ICAO] DESIGNATED POINT NAVAID -->
160
400
  <Dpn>
161
- <DpnUid mid="5317882">
401
+ <DpnUid>
162
402
  <codeId>DDD</codeId>
163
403
  <geoLat>475133.00N</geoLat>
164
404
  <geoLong>0073336.00E</geoLong>
165
405
  </DpnUid>
166
- <OrgUid/>
167
- <txtName>DESIGNATED POINT NAVAID</txtName>
168
406
  <codeDatum>WGE</codeDatum>
169
407
  <codeType>ICAO</codeType>
170
- <valElev>500</valElev>
171
- <uomDistVer>FT</uomDistVer>
172
- <Dtt>
173
- <codeWorkHr>H24</codeWorkHr>
174
- </Dtt>
408
+ <txtName>DESIGNATED POINT NAVAID</txtName>
175
409
  <txtRmk>designated point navaid</txtRmk>
176
410
  </Dpn>
177
411
  <!-- NavigationalAid: [DME] DME NAVAID -->
178
412
  <Dme>
179
- <DmeUid mid="537506748">
413
+ <DmeUid>
180
414
  <codeId>MMM</codeId>
181
415
  <geoLat>475133.00N</geoLat>
182
416
  <geoLong>0073336.00E</geoLong>
183
417
  </DmeUid>
184
- <OrgUid/>
418
+ <OrgUid>
419
+ <txtName>FRANCE</txtName>
420
+ </OrgUid>
185
421
  <txtName>DME NAVAID</txtName>
186
422
  <codeChannel>95X</codeChannel>
187
423
  <codeDatum>WGE</codeDatum>
@@ -194,12 +430,14 @@ describe AIXM::Document do
194
430
  </Dme>
195
431
  <!-- NavigationalAid: [Marker:O] MARKER NAVAID -->
196
432
  <Mkr>
197
- <MkrUid mid="300437209">
433
+ <MkrUid>
198
434
  <codeId>---</codeId>
199
435
  <geoLat>475133.00N</geoLat>
200
436
  <geoLong>0073336.00E</geoLong>
201
437
  </MkrUid>
202
- <OrgUid/>
438
+ <OrgUid>
439
+ <txtName>FRANCE</txtName>
440
+ </OrgUid>
203
441
  <codePsnIls>O</codePsnIls>
204
442
  <valFreq>75</valFreq>
205
443
  <uomFreq>MHZ</uomFreq>
@@ -214,12 +452,14 @@ describe AIXM::Document do
214
452
  </Mkr>
215
453
  <!-- NavigationalAid: [NDB:B] NDB NAVAID -->
216
454
  <Ndb>
217
- <NdbUid mid="782114926">
455
+ <NdbUid>
218
456
  <codeId>NNN</codeId>
219
457
  <geoLat>475133.00N</geoLat>
220
458
  <geoLong>0073336.00E</geoLong>
221
459
  </NdbUid>
222
- <OrgUid/>
460
+ <OrgUid>
461
+ <txtName>FRANCE</txtName>
462
+ </OrgUid>
223
463
  <txtName>NDB NAVAID</txtName>
224
464
  <valFreq>555</valFreq>
225
465
  <uomFreq>KHZ</uomFreq>
@@ -234,12 +474,14 @@ describe AIXM::Document do
234
474
  </Ndb>
235
475
  <!-- NavigationalAid: [TACAN] TACAN NAVAID -->
236
476
  <Tcn>
237
- <TcnUid mid="648449590">
477
+ <TcnUid>
238
478
  <codeId>TTT</codeId>
239
479
  <geoLat>475133.00N</geoLat>
240
480
  <geoLong>0073336.00E</geoLong>
241
481
  </TcnUid>
242
- <OrgUid/>
482
+ <OrgUid>
483
+ <txtName>FRANCE</txtName>
484
+ </OrgUid>
243
485
  <txtName>TACAN NAVAID</txtName>
244
486
  <codeChannel>29X</codeChannel>
245
487
  <codeDatum>WGE</codeDatum>
@@ -252,12 +494,14 @@ describe AIXM::Document do
252
494
  </Tcn>
253
495
  <!-- NavigationalAid: [VOR:VOR] VOR NAVAID -->
254
496
  <Vor>
255
- <VorUid mid="904391566">
497
+ <VorUid>
256
498
  <codeId>VVV</codeId>
257
499
  <geoLat>475133.00N</geoLat>
258
500
  <geoLong>0073336.00E</geoLong>
259
501
  </VorUid>
260
- <OrgUid/>
502
+ <OrgUid>
503
+ <txtName>FRANCE</txtName>
504
+ </OrgUid>
261
505
  <txtName>VOR NAVAID</txtName>
262
506
  <codeType>VOR</codeType>
263
507
  <valFreq>111</valFreq>
@@ -273,12 +517,14 @@ describe AIXM::Document do
273
517
  </Vor>
274
518
  <!-- NavigationalAid: [VOR:VOR] VOR/DME NAVAID -->
275
519
  <Vor>
276
- <VorUid mid="428844269">
520
+ <VorUid>
277
521
  <codeId>VDD</codeId>
278
522
  <geoLat>475133.00N</geoLat>
279
523
  <geoLong>0073336.00E</geoLong>
280
524
  </VorUid>
281
- <OrgUid/>
525
+ <OrgUid>
526
+ <txtName>FRANCE</txtName>
527
+ </OrgUid>
282
528
  <txtName>VOR/DME NAVAID</txtName>
283
529
  <codeType>VOR</codeType>
284
530
  <valFreq>111</valFreq>
@@ -294,13 +540,15 @@ describe AIXM::Document do
294
540
  </Vor>
295
541
  <!-- NavigationalAid: [DME] VOR/DME NAVAID -->
296
542
  <Dme>
297
- <DmeUid mid="284278140">
543
+ <DmeUid>
298
544
  <codeId>VDD</codeId>
299
545
  <geoLat>475133.00N</geoLat>
300
546
  <geoLong>0073336.00E</geoLong>
301
547
  </DmeUid>
302
- <OrgUid/>
303
- <VorUid mid="428844269">
548
+ <OrgUid>
549
+ <txtName>FRANCE</txtName>
550
+ </OrgUid>
551
+ <VorUid>
304
552
  <codeId>VDD</codeId>
305
553
  <geoLat>475133.00N</geoLat>
306
554
  <geoLong>0073336.00E</geoLong>
@@ -317,12 +565,14 @@ describe AIXM::Document do
317
565
  </Dme>
318
566
  <!-- NavigationalAid: [VOR:VOR] VORTAC NAVAID -->
319
567
  <Vor>
320
- <VorUid mid="305713874">
568
+ <VorUid>
321
569
  <codeId>VTT</codeId>
322
570
  <geoLat>475133.00N</geoLat>
323
571
  <geoLong>0073336.00E</geoLong>
324
572
  </VorUid>
325
- <OrgUid/>
573
+ <OrgUid>
574
+ <txtName>FRANCE</txtName>
575
+ </OrgUid>
326
576
  <txtName>VORTAC NAVAID</txtName>
327
577
  <codeType>VOR</codeType>
328
578
  <valFreq>111</valFreq>
@@ -338,13 +588,15 @@ describe AIXM::Document do
338
588
  </Vor>
339
589
  <!-- NavigationalAid: [TACAN] VORTAC NAVAID -->
340
590
  <Tcn>
341
- <TcnUid mid="595472802">
591
+ <TcnUid>
342
592
  <codeId>VTT</codeId>
343
593
  <geoLat>475133.00N</geoLat>
344
594
  <geoLong>0073336.00E</geoLong>
345
595
  </TcnUid>
346
- <OrgUid/>
347
- <VorUid mid="305713874">
596
+ <OrgUid>
597
+ <txtName>FRANCE</txtName>
598
+ </OrgUid>
599
+ <VorUid>
348
600
  <codeId>VTT</codeId>
349
601
  <geoLat>475133.00N</geoLat>
350
602
  <geoLong>0073336.00E</geoLong>
@@ -362,16 +614,242 @@ describe AIXM::Document do
362
614
  </AIXM-Snapshot>
363
615
  END
364
616
  end
617
+ end
365
618
 
366
- it "must build correct XML with OFM extensions" do
367
- subject.to_aixm(:ofm).must_equal <<~"END"
619
+ context "OFMX" do
620
+ subject do
621
+ AIXM.ofmx!
622
+ AIXM::Factory.document
623
+ end
624
+
625
+ it "won't have errors" do
626
+ subject.errors.must_equal []
627
+ end
628
+
629
+ it "builds correct OFMX" do
630
+ subject.to_xml.must_equal <<~"END"
368
631
  <?xml version="1.0" encoding="UTF-8"?>
369
- <AIXM-Snapshot xmlns:xsi="http://www.aixm.aero/schema/4.5/AIXM-Snapshot.xsd" version="4.5 + OFM extensions of version 0.1" origin="AIXM #{AIXM::VERSION} Ruby gem" created="2018-01-18T12:00:00+01:00" effective="2018-01-18T12:00:00+01:00">
632
+ <OFMX-Snapshot xmlns:xsi="http://openflightmaps.org/schema/0/OFMX-Snapshot.xsd" version="0" origin="rubygem aixm-0.3.0" namespace="00000000-0000-0000-0000-000000000000" created="2018-01-01T12:00:00+01:00" effective="2018-01-01T12:00:00+01:00">
633
+ <!-- Organisation: FRANCE -->
634
+ <Org source="LF|GEN|0.0 FACTORY|0|0">
635
+ <OrgUid region="LF">
636
+ <txtName>FRANCE</txtName>
637
+ </OrgUid>
638
+ <codeId>LF</codeId>
639
+ <codeType>S</codeType>
640
+ <txtRmk>Oversea departments not included</txtRmk>
641
+ </Org>
642
+ <!-- Unit: PUJAUT TWR -->
643
+ <Uni source="LF|GEN|0.0 FACTORY|0|0">
644
+ <UniUid region="LF">
645
+ <txtName>PUJAUT TWR</txtName>
646
+ </UniUid>
647
+ <OrgUid region="LF">
648
+ <txtName>FRANCE</txtName>
649
+ </OrgUid>
650
+ <AhpUid region="LF">
651
+ <codeId>LFNT</codeId>
652
+ </AhpUid>
653
+ <codeType>TWR</codeType>
654
+ <codeClass>ICAO</codeClass>
655
+ <txtRmk>A/A FR only</txtRmk>
656
+ </Uni>
657
+ <Ser>
658
+ <SerUid>
659
+ <UniUid region="LF">
660
+ <txtName>PUJAUT TWR</txtName>
661
+ </UniUid>
662
+ <codeType>APP</codeType>
663
+ <noSeq>1</noSeq>
664
+ </SerUid>
665
+ <Stt>
666
+ <codeWorkHr>H24</codeWorkHr>
667
+ </Stt>
668
+ <txtRmk>service remarks</txtRmk>
669
+ </Ser>
670
+ <Fqy>
671
+ <FqyUid>
672
+ <SerUid>
673
+ <UniUid region="LF">
674
+ <txtName>PUJAUT TWR</txtName>
675
+ </UniUid>
676
+ <codeType>APP</codeType>
677
+ <noSeq>1</noSeq>
678
+ </SerUid>
679
+ <valFreqTrans>123.35</valFreqTrans>
680
+ </FqyUid>
681
+ <valFreqRec>124.1</valFreqRec>
682
+ <uomFreq>MHZ</uomFreq>
683
+ <Ftt>
684
+ <codeWorkHr>H24</codeWorkHr>
685
+ </Ftt>
686
+ <txtRmk>frequency remarks</txtRmk>
687
+ <Cdl>
688
+ <txtCallSign>PUJAUT CONTROL</txtCallSign>
689
+ <codeLang>EN</codeLang>
690
+ </Cdl>
691
+ <Cdl>
692
+ <txtCallSign>PUJAUT CONTROLE</txtCallSign>
693
+ <codeLang>FR</codeLang>
694
+ </Cdl>
695
+ </Fqy>
696
+ <!-- Airport: LFNT AVIGNON-PUJAUT -->
697
+ <Ahp source="LF|GEN|0.0 FACTORY|0|0">
698
+ <AhpUid region="LF">
699
+ <codeId>LFNT</codeId>
700
+ </AhpUid>
701
+ <OrgUid region="LF">
702
+ <txtName>FRANCE</txtName>
703
+ </OrgUid>
704
+ <txtName>AVIGNON-PUJAUT</txtName>
705
+ <codeIcao>LFNT</codeIcao>
706
+ <codeGps>LFPUJAUT</codeGps>
707
+ <codeType>AH</codeType>
708
+ <geoLat>43.99611111N</geoLat>
709
+ <geoLong>004.75444444E</geoLong>
710
+ <codeDatum>WGE</codeDatum>
711
+ <valElev>146</valElev>
712
+ <uomDistVer>FT</uomDistVer>
713
+ <valMagVar>1.08</valMagVar>
714
+ <valTransitionAlt>10000</valTransitionAlt>
715
+ <uomTransitionAlt>FT</uomTransitionAlt>
716
+ <txtRmk>Restricted access</txtRmk>
717
+ </Ahp>
718
+ <Rwy>
719
+ <RwyUid>
720
+ <AhpUid region="LF">
721
+ <codeId>LFNT</codeId>
722
+ </AhpUid>
723
+ <txtDesig>16L/34R</txtDesig>
724
+ </RwyUid>
725
+ <valLen>650</valLen>
726
+ <valWid>80</valWid>
727
+ <uomDimRwy>M</uomDimRwy>
728
+ <codeComposition>GRADE</codeComposition>
729
+ <codeSts>CLSD</codeSts>
730
+ <txtRmk>Markings eroded</txtRmk>
731
+ </Rwy>
732
+ <Rdn>
733
+ <RdnUid>
734
+ <RwyUid>
735
+ <AhpUid region="LF">
736
+ <codeId>LFNT</codeId>
737
+ </AhpUid>
738
+ <txtDesig>16L/34R</txtDesig>
739
+ </RwyUid>
740
+ <txtDesig>16L</txtDesig>
741
+ </RdnUid>
742
+ <geoLat>44.00211944N</geoLat>
743
+ <geoLong>004.75216944E</geoLong>
744
+ <valTrueBrg>165</valTrueBrg>
745
+ <valMagBrg>166</valMagBrg>
746
+ <valElevTdz>147</valElevTdz>
747
+ <uomElevTdz>FT</uomElevTdz>
748
+ <txtRmk>forth remarks</txtRmk>
749
+ </Rdn>
750
+ <Rdd>
751
+ <RddUid>
752
+ <RdnUid>
753
+ <RwyUid>
754
+ <AhpUid region="LF">
755
+ <codeId>LFNT</codeId>
756
+ </AhpUid>
757
+ <txtDesig>16L/34R</txtDesig>
758
+ </RwyUid>
759
+ <txtDesig>16L</txtDesig>
760
+ </RdnUid>
761
+ <codeType>DPLM</codeType>
762
+ <codeDayPeriod>A</codeDayPeriod>
763
+ </RddUid>
764
+ <valDist>131</valDist>
765
+ <uomDist>M</uomDist>
766
+ <txtRmk>forth remarks</txtRmk>
767
+ </Rdd>
768
+ <Rdn>
769
+ <RdnUid>
770
+ <RwyUid>
771
+ <AhpUid region="LF">
772
+ <codeId>LFNT</codeId>
773
+ </AhpUid>
774
+ <txtDesig>16L/34R</txtDesig>
775
+ </RwyUid>
776
+ <txtDesig>34R</txtDesig>
777
+ </RdnUid>
778
+ <geoLat>43.99036389N</geoLat>
779
+ <geoLong>004.75645556E</geoLong>
780
+ <valTrueBrg>345</valTrueBrg>
781
+ <valMagBrg>346</valMagBrg>
782
+ <txtRmk>back remarks</txtRmk>
783
+ </Rdn>
784
+ <Rdd>
785
+ <RddUid>
786
+ <RdnUid>
787
+ <RwyUid>
788
+ <AhpUid region="LF">
789
+ <codeId>LFNT</codeId>
790
+ </AhpUid>
791
+ <txtDesig>16L/34R</txtDesig>
792
+ </RwyUid>
793
+ <txtDesig>34R</txtDesig>
794
+ </RdnUid>
795
+ <codeType>DPLM</codeType>
796
+ <codeDayPeriod>A</codeDayPeriod>
797
+ </RddUid>
798
+ <valDist>209</valDist>
799
+ <uomDist>M</uomDist>
800
+ <txtRmk>back remarks</txtRmk>
801
+ </Rdd>
802
+ <Tla>
803
+ <TlaUid>
804
+ <AhpUid region="LF">
805
+ <codeId>LFNT</codeId>
806
+ </AhpUid>
807
+ <txtDesig>H1</txtDesig>
808
+ </TlaUid>
809
+ <geoLat>43.99915000N</geoLat>
810
+ <geoLong>004.75154444E</geoLong>
811
+ <codeDatum>WGE</codeDatum>
812
+ <valElev>141</valElev>
813
+ <uomDistVer>FT</uomDistVer>
814
+ <valLen>20</valLen>
815
+ <valWid>20</valWid>
816
+ <uomDim>M</uomDim>
817
+ <codeComposition>GRASS</codeComposition>
818
+ <codeSts>OTHER</codeSts>
819
+ <txtRmk>Authorizaton by AD operator required</txtRmk>
820
+ </Tla>
821
+ <Ahu>
822
+ <AhuUid>
823
+ <AhpUid region="LF">
824
+ <codeId>LFNT</codeId>
825
+ </AhpUid>
826
+ </AhuUid>
827
+ <UsageLimitation>
828
+ <codeUsageLimitation>PERMIT</codeUsageLimitation>
829
+ </UsageLimitation>
830
+ <UsageLimitation>
831
+ <codeUsageLimitation>RESERV</codeUsageLimitation>
832
+ <UsageCondition>
833
+ <AircraftClass>
834
+ <codeType>E</codeType>
835
+ </AircraftClass>
836
+ </UsageCondition>
837
+ <UsageCondition>
838
+ <FlightClass>
839
+ <codeOrigin>INTL</codeOrigin>
840
+ </FlightClass>
841
+ </UsageCondition>
842
+ <Timetable>
843
+ <codeWorkHr>H24</codeWorkHr>
844
+ </Timetable>
845
+ <txtRmk>reservation remarks</txtRmk>
846
+ </UsageLimitation>
847
+ </Ahu>
370
848
  <!-- Airspace: [D] POLYGON AIRSPACE -->
371
- <Ase xt_classLayersAvail="false">
372
- <AseUid mid="367297292" newEntity="true">
849
+ <Ase source="LF|GEN|0.0 FACTORY|0|0">
850
+ <AseUid region="LF">
373
851
  <codeType>D</codeType>
374
- <codeId>367297292</codeId>
852
+ <codeId>PA</codeId>
375
853
  </AseUid>
376
854
  <txtLocalType>POLYGON</txtLocalType>
377
855
  <txtName>POLYGON AIRSPACE</txtName>
@@ -391,45 +869,45 @@ describe AIXM::Document do
391
869
  <Att>
392
870
  <codeWorkHr>H24</codeWorkHr>
393
871
  </Att>
394
- <txtRmk>polygon airspace</txtRmk>
395
- <xt_selAvail>false</xt_selAvail>
872
+ <codeSelAvbl>Y</codeSelAvbl>
873
+ <txtRmk>airspace layer</txtRmk>
396
874
  </Ase>
397
875
  <Abd>
398
876
  <AbdUid>
399
- <AseUid mid="367297292" newEntity="true">
877
+ <AseUid region="LF">
400
878
  <codeType>D</codeType>
401
- <codeId>367297292</codeId>
879
+ <codeId>PA</codeId>
402
880
  </AseUid>
403
881
  </AbdUid>
404
882
  <Avx>
405
883
  <codeType>CWA</codeType>
406
884
  <geoLat>47.85916667N</geoLat>
407
- <geoLong>7.56000000E</geoLong>
885
+ <geoLong>007.56000000E</geoLong>
408
886
  <codeDatum>WGE</codeDatum>
409
887
  <geoLatArc>47.90416667N</geoLatArc>
410
- <geoLongArc>7.56333333E</geoLongArc>
888
+ <geoLongArc>007.56333333E</geoLongArc>
411
889
  </Avx>
412
890
  <Avx>
413
- <codeType>FNT</codeType>
414
- <geoLat>47.94361111N</geoLat>
415
- <geoLong>7.59583333E</geoLong>
416
- <codeDatum>WGE</codeDatum>
417
891
  <GbrUid>
418
892
  <txtName>FRANCE_GERMANY</txtName>
419
893
  </GbrUid>
894
+ <codeType>FNT</codeType>
895
+ <geoLat>47.94361111N</geoLat>
896
+ <geoLong>007.59583333E</geoLong>
897
+ <codeDatum>WGE</codeDatum>
420
898
  </Avx>
421
899
  <Avx>
422
900
  <codeType>GRC</codeType>
423
901
  <geoLat>47.85916667N</geoLat>
424
- <geoLong>7.56000000E</geoLong>
902
+ <geoLong>007.56000000E</geoLong>
425
903
  <codeDatum>WGE</codeDatum>
426
904
  </Avx>
427
905
  </Abd>
428
906
  <!-- Airspace: [D] CIRCLE AIRSPACE -->
429
- <Ase xt_classLayersAvail="false">
430
- <AseUid mid="332058082" newEntity="true">
907
+ <Ase source="LF|GEN|0.0 FACTORY|0|0">
908
+ <AseUid region="LF">
431
909
  <codeType>D</codeType>
432
- <codeId>332058082</codeId>
910
+ <codeId>CA</codeId>
433
911
  </AseUid>
434
912
  <txtLocalType>CIRCLE</txtLocalType>
435
913
  <txtName>CIRCLE AIRSPACE</txtName>
@@ -449,51 +927,47 @@ describe AIXM::Document do
449
927
  <Att>
450
928
  <codeWorkHr>H24</codeWorkHr>
451
929
  </Att>
452
- <txtRmk>circle airspace</txtRmk>
453
- <xt_selAvail>false</xt_selAvail>
930
+ <codeSelAvbl>Y</codeSelAvbl>
931
+ <txtRmk>airspace layer</txtRmk>
454
932
  </Ase>
455
933
  <Abd>
456
934
  <AbdUid>
457
- <AseUid mid="332058082" newEntity="true">
935
+ <AseUid region="LF">
458
936
  <codeType>D</codeType>
459
- <codeId>332058082</codeId>
937
+ <codeId>CA</codeId>
460
938
  </AseUid>
461
939
  </AbdUid>
462
940
  <Avx>
463
941
  <codeType>CWA</codeType>
464
- <geoLat>47.67326549N</geoLat>
465
- <geoLong>4.88333333E</geoLong>
942
+ <geoLat>47.67326537N</geoLat>
943
+ <geoLong>004.88333333E</geoLong>
466
944
  <codeDatum>WGE</codeDatum>
467
945
  <geoLatArc>47.58333333N</geoLatArc>
468
- <geoLongArc>4.88333333E</geoLongArc>
946
+ <geoLongArc>004.88333333E</geoLongArc>
469
947
  </Avx>
470
948
  </Abd>
471
949
  <!-- NavigationalAid: [DesignatedPoint:ICAO] DESIGNATED POINT NAVAID -->
472
- <Dpn>
473
- <DpnUid mid="5317882" newEntity="true">
950
+ <Dpn source="LF|GEN|0.0 FACTORY|0|0">
951
+ <DpnUid region="LF">
474
952
  <codeId>DDD</codeId>
475
953
  <geoLat>47.85916667N</geoLat>
476
- <geoLong>7.56000000E</geoLong>
954
+ <geoLong>007.56000000E</geoLong>
477
955
  </DpnUid>
478
- <OrgUid/>
479
- <txtName>DESIGNATED POINT NAVAID</txtName>
480
956
  <codeDatum>WGE</codeDatum>
481
957
  <codeType>ICAO</codeType>
482
- <valElev>500</valElev>
483
- <uomDistVer>FT</uomDistVer>
484
- <Dtt>
485
- <codeWorkHr>H24</codeWorkHr>
486
- </Dtt>
958
+ <txtName>DESIGNATED POINT NAVAID</txtName>
487
959
  <txtRmk>designated point navaid</txtRmk>
488
960
  </Dpn>
489
961
  <!-- NavigationalAid: [DME] DME NAVAID -->
490
- <Dme>
491
- <DmeUid mid="537506748" newEntity="true">
962
+ <Dme source="LF|GEN|0.0 FACTORY|0|0">
963
+ <DmeUid region="LF">
492
964
  <codeId>MMM</codeId>
493
965
  <geoLat>47.85916667N</geoLat>
494
- <geoLong>7.56000000E</geoLong>
966
+ <geoLong>007.56000000E</geoLong>
495
967
  </DmeUid>
496
- <OrgUid/>
968
+ <OrgUid region="LF">
969
+ <txtName>FRANCE</txtName>
970
+ </OrgUid>
497
971
  <txtName>DME NAVAID</txtName>
498
972
  <codeChannel>95X</codeChannel>
499
973
  <codeDatum>WGE</codeDatum>
@@ -505,13 +979,15 @@ describe AIXM::Document do
505
979
  <txtRmk>dme navaid</txtRmk>
506
980
  </Dme>
507
981
  <!-- NavigationalAid: [Marker:O] MARKER NAVAID -->
508
- <Mkr>
509
- <MkrUid mid="300437209" newEntity="true">
982
+ <Mkr source="LF|GEN|0.0 FACTORY|0|0">
983
+ <MkrUid region="LF">
510
984
  <codeId>---</codeId>
511
985
  <geoLat>47.85916667N</geoLat>
512
- <geoLong>7.56000000E</geoLong>
986
+ <geoLong>007.56000000E</geoLong>
513
987
  </MkrUid>
514
- <OrgUid/>
988
+ <OrgUid region="LF">
989
+ <txtName>FRANCE</txtName>
990
+ </OrgUid>
515
991
  <codePsnIls>O</codePsnIls>
516
992
  <valFreq>75</valFreq>
517
993
  <uomFreq>MHZ</uomFreq>
@@ -525,13 +1001,15 @@ describe AIXM::Document do
525
1001
  <txtRmk>marker navaid</txtRmk>
526
1002
  </Mkr>
527
1003
  <!-- NavigationalAid: [NDB:B] NDB NAVAID -->
528
- <Ndb>
529
- <NdbUid mid="782114926" newEntity="true">
1004
+ <Ndb source="LF|GEN|0.0 FACTORY|0|0">
1005
+ <NdbUid region="LF">
530
1006
  <codeId>NNN</codeId>
531
1007
  <geoLat>47.85916667N</geoLat>
532
- <geoLong>7.56000000E</geoLong>
1008
+ <geoLong>007.56000000E</geoLong>
533
1009
  </NdbUid>
534
- <OrgUid/>
1010
+ <OrgUid region="LF">
1011
+ <txtName>FRANCE</txtName>
1012
+ </OrgUid>
535
1013
  <txtName>NDB NAVAID</txtName>
536
1014
  <valFreq>555</valFreq>
537
1015
  <uomFreq>KHZ</uomFreq>
@@ -545,13 +1023,15 @@ describe AIXM::Document do
545
1023
  <txtRmk>ndb navaid</txtRmk>
546
1024
  </Ndb>
547
1025
  <!-- NavigationalAid: [TACAN] TACAN NAVAID -->
548
- <Tcn>
549
- <TcnUid mid="648449590" newEntity="true">
1026
+ <Tcn source="LF|GEN|0.0 FACTORY|0|0">
1027
+ <TcnUid region="LF">
550
1028
  <codeId>TTT</codeId>
551
1029
  <geoLat>47.85916667N</geoLat>
552
- <geoLong>7.56000000E</geoLong>
1030
+ <geoLong>007.56000000E</geoLong>
553
1031
  </TcnUid>
554
- <OrgUid/>
1032
+ <OrgUid region="LF">
1033
+ <txtName>FRANCE</txtName>
1034
+ </OrgUid>
555
1035
  <txtName>TACAN NAVAID</txtName>
556
1036
  <codeChannel>29X</codeChannel>
557
1037
  <codeDatum>WGE</codeDatum>
@@ -563,13 +1043,15 @@ describe AIXM::Document do
563
1043
  <txtRmk>tacan navaid</txtRmk>
564
1044
  </Tcn>
565
1045
  <!-- NavigationalAid: [VOR:VOR] VOR NAVAID -->
566
- <Vor>
567
- <VorUid mid="904391566" newEntity="true">
1046
+ <Vor source="LF|GEN|0.0 FACTORY|0|0">
1047
+ <VorUid region="LF">
568
1048
  <codeId>VVV</codeId>
569
1049
  <geoLat>47.85916667N</geoLat>
570
- <geoLong>7.56000000E</geoLong>
1050
+ <geoLong>007.56000000E</geoLong>
571
1051
  </VorUid>
572
- <OrgUid/>
1052
+ <OrgUid region="LF">
1053
+ <txtName>FRANCE</txtName>
1054
+ </OrgUid>
573
1055
  <txtName>VOR NAVAID</txtName>
574
1056
  <codeType>VOR</codeType>
575
1057
  <valFreq>111</valFreq>
@@ -584,13 +1066,15 @@ describe AIXM::Document do
584
1066
  <txtRmk>vor navaid</txtRmk>
585
1067
  </Vor>
586
1068
  <!-- NavigationalAid: [VOR:VOR] VOR/DME NAVAID -->
587
- <Vor>
588
- <VorUid mid="428844269" newEntity="true">
1069
+ <Vor source="LF|GEN|0.0 FACTORY|0|0">
1070
+ <VorUid region="LF">
589
1071
  <codeId>VDD</codeId>
590
1072
  <geoLat>47.85916667N</geoLat>
591
- <geoLong>7.56000000E</geoLong>
1073
+ <geoLong>007.56000000E</geoLong>
592
1074
  </VorUid>
593
- <OrgUid/>
1075
+ <OrgUid region="LF">
1076
+ <txtName>FRANCE</txtName>
1077
+ </OrgUid>
594
1078
  <txtName>VOR/DME NAVAID</txtName>
595
1079
  <codeType>VOR</codeType>
596
1080
  <valFreq>111</valFreq>
@@ -606,16 +1090,18 @@ describe AIXM::Document do
606
1090
  </Vor>
607
1091
  <!-- NavigationalAid: [DME] VOR/DME NAVAID -->
608
1092
  <Dme>
609
- <DmeUid mid="284278140" newEntity="true">
1093
+ <DmeUid region="LF">
610
1094
  <codeId>VDD</codeId>
611
1095
  <geoLat>47.85916667N</geoLat>
612
- <geoLong>7.56000000E</geoLong>
1096
+ <geoLong>007.56000000E</geoLong>
613
1097
  </DmeUid>
614
- <OrgUid/>
615
- <VorUid mid="428844269" newEntity="true">
1098
+ <OrgUid region="LF">
1099
+ <txtName>FRANCE</txtName>
1100
+ </OrgUid>
1101
+ <VorUid region="LF">
616
1102
  <codeId>VDD</codeId>
617
1103
  <geoLat>47.85916667N</geoLat>
618
- <geoLong>7.56000000E</geoLong>
1104
+ <geoLong>007.56000000E</geoLong>
619
1105
  </VorUid>
620
1106
  <txtName>VOR/DME NAVAID</txtName>
621
1107
  <codeChannel>95X</codeChannel>
@@ -628,13 +1114,15 @@ describe AIXM::Document do
628
1114
  <txtRmk>vor/dme navaid</txtRmk>
629
1115
  </Dme>
630
1116
  <!-- NavigationalAid: [VOR:VOR] VORTAC NAVAID -->
631
- <Vor>
632
- <VorUid mid="305713874" newEntity="true">
1117
+ <Vor source="LF|GEN|0.0 FACTORY|0|0">
1118
+ <VorUid region="LF">
633
1119
  <codeId>VTT</codeId>
634
1120
  <geoLat>47.85916667N</geoLat>
635
- <geoLong>7.56000000E</geoLong>
1121
+ <geoLong>007.56000000E</geoLong>
636
1122
  </VorUid>
637
- <OrgUid/>
1123
+ <OrgUid region="LF">
1124
+ <txtName>FRANCE</txtName>
1125
+ </OrgUid>
638
1126
  <txtName>VORTAC NAVAID</txtName>
639
1127
  <codeType>VOR</codeType>
640
1128
  <valFreq>111</valFreq>
@@ -650,16 +1138,18 @@ describe AIXM::Document do
650
1138
  </Vor>
651
1139
  <!-- NavigationalAid: [TACAN] VORTAC NAVAID -->
652
1140
  <Tcn>
653
- <TcnUid mid="595472802" newEntity="true">
1141
+ <TcnUid region="LF">
654
1142
  <codeId>VTT</codeId>
655
1143
  <geoLat>47.85916667N</geoLat>
656
- <geoLong>7.56000000E</geoLong>
1144
+ <geoLong>007.56000000E</geoLong>
657
1145
  </TcnUid>
658
- <OrgUid/>
659
- <VorUid mid="305713874" newEntity="true">
1146
+ <OrgUid region="LF">
1147
+ <txtName>FRANCE</txtName>
1148
+ </OrgUid>
1149
+ <VorUid region="LF">
660
1150
  <codeId>VTT</codeId>
661
1151
  <geoLat>47.85916667N</geoLat>
662
- <geoLong>7.56000000E</geoLong>
1152
+ <geoLong>007.56000000E</geoLong>
663
1153
  </VorUid>
664
1154
  <txtName>VORTAC NAVAID</txtName>
665
1155
  <codeChannel>29X</codeChannel>
@@ -671,7 +1161,7 @@ describe AIXM::Document do
671
1161
  </Ttt>
672
1162
  <txtRmk>vortac navaid</txtRmk>
673
1163
  </Tcn>
674
- </AIXM-Snapshot>
1164
+ </OFMX-Snapshot>
675
1165
  END
676
1166
  end
677
1167
  end