aixm 0.2.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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