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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cf1e96e454dba0f43522ac3f8253c34a4f5b209498b410449521b2f9f935f624
4
- data.tar.gz: ad46225ec28030c43792f854bf1b1bfe4197217c5d45a5400a1e1f74ffa3c2ca
3
+ metadata.gz: c0f5f953610761dad1816bb0a390155538205afc41fc53d677f9d433a53de5f6
4
+ data.tar.gz: ba6b9edea4dc9ffe27239021f28fb3b2cb816bba568286f0108bf070a7108a73
5
5
  SHA512:
6
- metadata.gz: 672feb31e6a816e8d9c38a2f491833464d669c58f1ccec81ef776f449a3573eea31a263b822e1a88f70f80ea8864865f3c4127df16433f3d5d66430e6b6df93f
7
- data.tar.gz: 81b8b9e9dcd1cf088607380915adaa08cac8a43b4837fe124f47ef81dc4a2de428f5babfb6e64efe6c14961652bbf60c0242c3fd56bcc8c1974aa1bc97b9afb1
6
+ metadata.gz: b0947e0e79962e86e21f96833d47944c012fd1be4fa28a2fbf1aa3d82e2549195bafdcb32d9b3e6fd65f8f63ede53000d7218c6afaa5393549768d1ad0d6b569
7
+ data.tar.gz: 4358cb754979f06efd3c62d0288a41db984573d6de47f021c585ab056f801c71de480c1258969eeed33db287cc13137355c016f7e911c91e555a499067d9f15c
data/.gitignore CHANGED
@@ -3,3 +3,4 @@ Gemfile.lock
3
3
  pkg/*
4
4
  *.gem
5
5
  .bundle
6
+ .yardoc
@@ -1 +1 @@
1
- ruby-2.5.0
1
+ ruby-2.5.1
@@ -0,0 +1,3 @@
1
+ --no-private
2
+ lib/**/*.rb -
3
+ README.md CHANGELOG.md LICENSE.txt
@@ -1,45 +1,65 @@
1
+ ## 0.3.0
2
+
3
+ * Breaking additions:
4
+ * Global configuration with `AIXM.config`
5
+ * Breaking changes:
6
+ * Switch from "AIXM with OFM extensions" to OFMX
7
+ * `to_aixm` renamed to `to_xml` again
8
+ * Removed signature `to_xml(extension)` in favor of `AIXM.schema`
9
+ * Removed `Array#to_digest`
10
+ * Removed `Document#complete?`
11
+ * Renamed Schedule to Timetable
12
+ * Timetable and remarks moved from Airspace to to Layer (formerly known as
13
+ class layer)
14
+ * Additions
15
+ * Organization and Unit features
16
+ * Airport feature
17
+ * Refinement `Float#to_rad`
18
+ * Distance calculation with `AIXM::XY#distance`
19
+ * `Schedule#remarks`
20
+
1
21
  ## 0.2.3
2
22
 
3
- * Breaking minor changes:
23
+ * Breaking changes:
4
24
  * VOR types renamed from :vor to :conventional and :doppler_vor to :doppler
5
25
  * NBR types added
6
26
  * Marker types added
7
- * Minor changes:
27
+ * Changes:
8
28
  * "mid" attributes on all navigational aid features
9
29
 
10
30
  ## 0.2.2
11
31
 
12
- * Minor changes:
32
+ * Changes:
13
33
  * Bad error classes fixed
14
34
  * Allow navigational aids without name
15
35
 
16
36
  ## 0.2.1
17
37
 
18
- * Major changes:
38
+ * Breaking changes:
19
39
  * DVOR and VORDME confusion fixed
20
- * Schedule added to navigational aids
21
40
  * VOR can be associated with DME (-> VOR/DME) or TACAN (-> VORTAC) now
22
41
  * `to_xml` renamed to `to_aixm` everywhere
23
- * Minor changes:
24
42
  * Removed :other from all value lists
43
+ * Changes:
44
+ * Schedule added to navigational aids
25
45
 
26
46
  ## 0.2.0
27
47
 
48
+ * Breaking changes:
49
+ * Symbols such as :qnh, :ofm or :mhz are downcased now
28
50
  * Additions:
29
51
  * Frequency
30
- * Navigational aids
52
+ * Navigational aids features
31
53
  * `AIXM::Z#qfe?` and friends
32
- * Breaking major changes:
33
- * Symbols such as :qnh, :ofm or :mhz are downcased now
34
54
 
35
55
  ## 0.1.4
36
56
 
37
- * Breaking minor changes:
57
+ * Breaking changes:
38
58
  * `AIXM.z(alt: 123, code: :QNE)` is now `AIXM.z(123, :QNE)`
39
59
 
40
60
  ## 0.1.3
41
61
 
42
- * Breaking major changes:
62
+ * Breaking changes:
43
63
  * Re-organization of classes in features and components
44
64
  * Additions:
45
65
  * Shortcut initializers e.g. `AIXM.airspace(...)`
@@ -48,7 +68,7 @@
48
68
 
49
69
  * Breaking additions:
50
70
  * Class layers
51
- * Breaking minor changes:
71
+ * Breaking changes:
52
72
  * Use `document.features << (feature)` instead of `document << (feature)`
53
73
 
54
74
  ## 0.1.1
@@ -58,7 +78,7 @@
58
78
  * Refinement `Float#to_km` and `String#uptrans`
59
79
  * Shortcut constants `AIXM::UNLIMITED` and `AIXM::H24`
60
80
  * `Airspace#short_name`
61
- * Minor changes:
81
+ * Changes:
62
82
  * `Document#created_at` and `#effective_at` accept Time, Date, String or *nil*
63
83
  * Separate `AIXM::Document#valid?` from `#complete?`
64
84
  * Write coordinates in DD if extension `:OFM` is set
@@ -70,7 +90,7 @@
70
90
  * XY Coordinate
71
91
  * Z Altitude
72
92
  * AIXM-Snapshot 4.5 Document
73
- * Airspace
93
+ * Airspace feature
74
94
  * Vertical Limits
75
95
  * Geometry
76
96
  * Point
data/Guardfile CHANGED
@@ -4,4 +4,5 @@ guard :minitest do
4
4
  watch(%r{^spec/(.+)_spec\.rb})
5
5
  watch(%r{^lib/(.+)\.rb}) { |m| "spec/lib/#{m[1]}_spec.rb" }
6
6
  watch(%r{^spec/(spec_helper|factory)\.rb}) { 'spec' }
7
+ watch(%r{^spec/macros/(.+).rb}) { 'spec' }
7
8
  end
data/README.md CHANGED
@@ -6,9 +6,9 @@
6
6
 
7
7
  # AIXM
8
8
 
9
- Partial implementation of the [Aeronautical Information Exchange Model (AIXM 4.5)](http://aixm.aero) for Ruby.
9
+ Partial implementation of the [Aeronautical Information Exchange Model (AIXM 4.5)](http://aixm.aero) and it's dialect [Open FlightMaps eXchange format (OFMX 0)](https://github.com/openflightmaps/ofmx) for Ruby.
10
10
 
11
- For now, only the parts needed to automize the AIP import of [Open Flightmaps](https://openflightmaps.org) are part of this gem. Most notably, the gem is only a builder of AIXM 4.5 snapshot files and does not parse them.
11
+ For now, only the parts needed to automize the AIP import of [Open Flightmaps](https://openflightmaps.org) are part of this gem. Most notably, the gem is only a builder for snapshot files and does not parse them.
12
12
 
13
13
  * [Homepage](https://github.com/svoop/aixm)
14
14
  * [API](http://www.rubydoc.info/gems/aixm)
@@ -24,293 +24,100 @@ gem aixm
24
24
 
25
25
  ## Usage
26
26
 
27
- You can initialize all elements either traditionally or by use of shorter AIXM class methods:
27
+ Here's how to build a document object, populate it with a simple feature and then render it as AIXM:
28
28
 
29
29
  ```ruby
30
- AIXM.airspace(...)
31
- AIXM.airspace(...)
32
- ```
33
-
34
- ### Fundamentals
35
-
36
- All fundamentals are subclasses of `AIXM::Base`.
37
-
38
- ### Document
39
-
40
- The document is the root container of the AIXM snapshot file to be generated. It's essentially a collection of features:
41
-
42
- ```ruby
43
- document = AIXM.document(created_at: Time.now, effective_at: Time.now)
44
- document.features << AIXM.airspace(...)
45
- ```
46
-
47
- To give you an overview of the AIXM building blocks, the remainder of this guide will use pseudo code to describe the initializer arguments, writer methods etc:
48
-
49
- ```ruby
50
- document = AIXM.document(
51
- created_at: Time or Date or String
52
- effective_at: Time or Date or String
53
- )
54
- document.features << AIXM::Feature
55
- ```
56
-
57
- See [the API documentation](http://www.rubydoc.info/gems/aixm) for details and [spec/factory.rb](https://github.com/svoop/aixm/blob/master/spec/factory.rb) for examples.
58
-
59
- #### Coordinate
60
-
61
- All of the below are equivalent:
62
-
63
- ```ruby
64
- AIXM.xy(lat: %q(11°22'33.44"), long: %q(-111°22'33.44"))
65
- AIXM.xy(lat: '112233.44N', long: '1112233.44W')
66
- AIXM.xy(lat: 11.375955555555556, long: -111.37595555555555)
67
- ```
68
-
69
- #### Altitude and Heights
70
-
71
- Altitudes and heights exist in three different forms:
72
-
73
- ```ruby
74
- AIXM.z(1000, :qfe) # height: 1000ft above ground
75
- AIXM.z(2000, :qnh) # altitude: of 2000ft above mean sea level
76
- AIXM.z(45, :qne) # altitude: flight level 45
77
- ```
78
-
79
- #### Frequency
80
-
81
- ```ruby
82
- AIXM.f(123.35, :mhz)
83
- ```
84
-
85
- ### Features
86
-
87
- All features are subclasses of `AIXM::Feature::Base`.
88
-
89
- #### Airspace
90
-
91
- ```ruby
92
- airspace = AIXM.airspace(
93
- name: String
94
- short_name: String or nil
95
- type: String or Symbol
96
- )
97
- airspace.schedule = AIXM.schedule
98
- airspace.geometry << AIXM.point or AIXM.arc or AIXM.border or AIXM.circle
99
- airspace.class_layers << AIXM.class_layer
100
- airspace.remarks = String
101
- ```
102
-
103
- #### Navigational Aids
104
-
105
- ##### Designated Point
106
-
107
- ```ruby
108
- designated_point = AIXM.designated_point(
109
- id: String
110
- name: String or nil
111
- xy: AIXM.xy
112
- z: AIXM.z or nil
113
- type: :icao or :adhp, or :coordinates
114
- )
115
- designated_point.schedule = AIXM.schedule
116
- designated_point.remarks = String
117
- ```
118
-
119
- ##### DME
120
-
121
- ```ruby
122
- dme = AIXM.dme(
123
- id: String
124
- name: String
125
- xy: AIXM.xy
126
- z: AIXM.z or nil
127
- channel: String
128
- )
129
- dme.schedule = AIXM.schedule
130
- dme.remarks = String
131
- ```
132
-
133
- ##### NDB
134
-
135
- ```ruby
136
- ndb = AIXM.ndb(
137
- id: String
138
- name: String
139
- xy: AIXM.xy
140
- z: AIXM.z or nil
141
- type: :en_route, :locator or :marine
142
- f: AIXM.f
143
- )
144
- ndb.schedule = AIXM.schedule
145
- ndb.remarks = String
146
- ```
147
-
148
- ##### Marker
149
-
150
- WARNING: Marker are not fully implemented because they usually have to be
151
- associated with ILS which are not yet implemented.
152
-
153
- ```ruby
154
- marker = AIXM.marker(
155
- id: String
156
- name: String
157
- xy: AIXM.xy
158
- z: AIXM.z or nil
159
- type: :outer, :middle, :inner or :backcourse
160
- )
161
- marker.schedule = AIXM.schedule
162
- marker.remarks = String
163
- ```
164
-
165
- ##### TACAN
166
-
167
- ```ruby
168
- tacan = AIXM.tacan(
169
- id: String
170
- name: String
171
- xy: AIXM.xy
172
- z: AIXM.z or nil
173
- channel: String
174
- )
175
- tacan.schedule = AIXM.schedule
176
- tacan.remarks = String
177
- ```
178
-
179
- ##### VOR
180
-
181
- ```ruby
182
- vor = AIXM.vor(
183
- id: String
184
- name: String
185
- xy: AIXM.xy
186
- z: AIXM.z or nil
187
- type: :conventional or :doppler
188
- f: AIXM.f
189
- north: :geographic or :grid or :magnetic
190
- )
191
- vor.schedule = AIXM.schedule
192
- vor.remarks = String
193
- vor.associate_dme(channel: String) # turns the VOR into a VOR/DME
194
- vor.associate_tacan(channel: String) # turns the VOR into a VORTAC
195
- ```
196
-
197
- ### Components
198
-
199
- All components are subclasses of `AIXM::Component::Base`.
200
-
201
- #### Schedule
202
-
203
- ```ruby
204
- schedule = AIXM.schedule(
205
- code: String or Symbol
30
+ document = AIXM.document
31
+ document.features << AIXM.designated_point(
32
+ id: "ABIXI",
33
+ xy: AIXM.xy(lat: %q(46°31'54.3"N), long: %q(002°19'55.2"W)),
34
+ type: :icao
206
35
  )
36
+ document.aixm! # not really necessary since AIXM is the default schema
37
+ document.to_xml
207
38
  ```
208
39
 
209
- #### Class Layer
40
+ You can initialize all elements either traditionally or by use of shorter AIXM class methods. The following two statements are identical:
210
41
 
211
42
  ```ruby
212
- class_layer = AIXM.class_layer(
213
- class: String or nil
214
- vertical_limits: AIXM.vertical_limits
215
- )
43
+ AIXM::Feature::NavigationalAid::DesignatedPoint.new(...)
44
+ AIXM.designated_point(...)
216
45
  ```
217
46
 
218
- #### Vertical Limits
47
+ ## Configuration
219
48
 
220
- ```ruby
221
- vertical_limits = AIXM.vertical_limits(
222
- max_z: AIXM.z or nil
223
- upper_z: AIXM.z
224
- lower_z: AIXM.z
225
- min_z: AIXM.z or nil
226
- )
227
- ```
228
-
229
- #### Point, Arc, Border and Circle
49
+ The following configuration options are available for setting and getting:
230
50
 
231
51
  ```ruby
232
- point = AIXM.point(
233
- xy: AIXM.xy
234
- )
235
- arc = AIXM.arc(
236
- xy: AIXM.xy
237
- center_xy: AIXM.xy
238
- cloclwise: true or false
239
- )
240
- border = AIXM.border(
241
- xy: AIXM.xy
242
- name: String
243
- )
244
- circle = AIXM.circle(
245
- center_xy: AIXM.xy
246
- radius: Numeric
247
- )
52
+ AIXM.config.schema # either :aixm (default) or :ofmx
53
+ AIXM.config.region # fallback region
54
+ AIXM.config.ignored_errors # ignore XML schema errors which match this regex
248
55
  ```
249
56
 
250
- #### Geometry
57
+ There are shortcuts to set and get the schema:
251
58
 
252
59
  ```ruby
253
- geometry = AIXM.geometry
254
- geometry << AIXM.point or AIXM.arc or AIXM.border or AIXM.circle
60
+ AIXM.schema # => :aixm
61
+ AIXM.aixm? # => true
62
+ AIXM.ofmx! # => :ofmx
63
+ AIXM.ofmx? # => true
64
+ AIXM.schema # => :ofmx
65
+ AIXM.schema(:version) # => 0
255
66
  ```
256
67
 
257
- For a geometry to be complete, it must be comprised of either:
258
-
259
- * exactly one circle
260
- * at least three points, arcs or borders (the last of which a point with identical coordinates as the first)
261
-
262
68
  ## Validation
263
69
 
264
- Use `AIXM::Document#complete?` to check whether all mandatory information is present. Airspaces, geometries etc have `complete?` methods as well.
265
-
266
- Use `AIXM::Document#valid?` to validate the resulting AIXM against the XSD schema. If any, you find the errors in `AIXM::Document#errors`. Since the data model is not fully implemented, some associations cannot be assigned and have to be left empty. The resulting validation errors are silently ignored:
267
-
268
- * OrgUid - organizations may be empty tags
70
+ `AIXM::Document#valid?` validates the resulting AIXM or OFMX against its XML schema. If any, you find the errors in `AIXM::Document#errors`.
269
71
 
270
- ## Rendering
72
+ ## Model
271
73
 
272
- ```ruby
273
- document.to_aixm # render AIXM 4.5 compliant XML
274
- document.to_aixm(:ofm) # render AIXM 4.5 + OFM extensions XML
275
- ```
74
+ ### Fundamentals
75
+ * [Document](http://www.rubydoc.info/gems/aixm/AIXM/Document.html)
76
+ * [XY (longitude and latitude)](http://www.rubydoc.info/gems/aixm/AIXM/XY.html)
77
+ * [Z (height, elevation or altitude)](http://www.rubydoc.info/gems/aixm/AIXM/Z.html)
78
+ * [F (frequency)](http://www.rubydoc.info/gems/aixm/AIXM/F.html)
276
79
 
277
- ## Constants
80
+ ### Features
81
+ * [Organisation](http://www.rubydoc.info/gems/aixm/AIXM/Feature/Organisation.html)
82
+ * [Unit](http://www.rubydoc.info/gems/aixm/AIXM/Feature/Unit.html)
83
+ * [Airport](http://www.rubydoc.info/gems/aixm/AIXM/Feature/Airport.html)
84
+ * [Airspace](http://www.rubydoc.info/gems/aixm/AIXM/Feature/Airspace.html)
85
+ * [Navigational aid](http://www.rubydoc.info/gems/aixm/AIXM/NavigationalAid.html)
86
+ * [Designated point](http://www.rubydoc.info/gems/aixm/AIXM/Feature/DesignatedPoint.html)
87
+ * [DME](http://www.rubydoc.info/gems/aixm/AIXM/Feature/DME.html)
88
+ * [Marker](http://www.rubydoc.info/gems/aixm/AIXM/Feature/Marker.html)
89
+ * [NDB](http://www.rubydoc.info/gems/aixm/AIXM/Feature/NDB.html)
90
+ * [TACAN](http://www.rubydoc.info/gems/aixm/AIXM/Feature/TACAN.html)
91
+ * [VOR](http://www.rubydoc.info/gems/aixm/AIXM/Feature/VOR.html)
278
92
 
279
- * `AIXM::GROUND` - height: 0ft above ground
280
- * `AIXM::UNLIMITED` - altitude: FL 999
281
- * `AIXM::H24` - continuous schedule
93
+ ### Components
94
+ * [Service](http://www.rubydoc.info/gems/aixm/AIXM/Component/Service.html)
95
+ * [Frequency](http://www.rubydoc.info/gems/aixm/AIXM/Component/Frequency.html)
96
+ * [Geometry](http://www.rubydoc.info/gems/aixm/AIXM/Component/Geometry.html)
97
+ * [Point](http://www.rubydoc.info/gems/aixm/AIXM/Component/Point.html)
98
+ * [Arc](http://www.rubydoc.info/gems/aixm/AIXM/Component/Arc.html)
99
+ * [Border](http://www.rubydoc.info/gems/aixm/AIXM/Component/Border.html)
100
+ * [Circle](http://www.rubydoc.info/gems/aixm/AIXM/Component/Circle.html)
101
+ * [Runway](http://www.rubydoc.info/gems/aixm/AIXM/Component/Runway.html)
102
+ * [Helipad](http://www.rubydoc.info/gems/aixm/AIXM/Component/Helipad.html)
103
+ * [Layer](http://www.rubydoc.info/gems/aixm/AIXM/Component/Layer.html)
104
+ * [Vertical limits](http://www.rubydoc.info/gems/aixm/AIXM/Component/VerticalLimits.html)
105
+ * [Timetable](http://www.rubydoc.info/gems/aixm/AIXM/Component/Timetable.html)
282
106
 
283
107
  ## Refinements
284
108
 
285
- By `using AIXM::Refinements` you get the following general purpose methods:
286
-
287
- * `Hash#lookup(key, default)`<br>Similar to `fetch` but falls back to values
288
- * `String#indent(number)`<br>Indent every line of a string with *number* spaces
289
- * `String#uptrans`<br>upcase and transliterate to match the reduced character set for names
290
- * `String#to_dd`<br>Convert DMS angle to DD or `nil` if the format is not recognized
291
- * `Float#to_dms(padding)`<br>Convert DD angle to DMS with the degrees zero padded to *padding* length
292
- * `Float#trim`<br>Convert whole numbers to Integer and leave all other untouched
293
- * `Float#to_km(from: unit)`<br>Convert a distance from *unit* (:km, :m, :nm or :ft) to km
294
-
295
- See the [source code](https://github.com/svoop/aixm/blob/master/lib/aixm/refinements.rb) for more explicit descriptions and examples.
296
-
297
- ## Extensions
298
-
299
- ### OFM
300
-
301
- This extension adds proprietary tags and attributes (most of which are prefixed with `xt_`) aiming to improve importing the resulting AIXM into the OFM originative suite:
302
-
303
- * `<AIXM-Snapshot version="4.5 + OFM extensions of version 0.1" (...) />`<br>root node with extended version string
304
- * `<Ase xt_classLayersAvail="(true|false)">`<br>true when multiple class layers and therefore an Adg-node is present
305
- * `<xt_selAvail>(true|false)</xt_selAvail>`<br>enables conditional airspaces feature
306
- * `<AseUid newEntity="(true|false)">`<br>tell the importer whether adding a new or updating an existing entity
109
+ By `using AIXM::Refinements` you get a few handy [extensions to Ruby core classes](http://www.rubydoc.info/gems/aixm/AIXM/Refinements.html).
307
110
 
308
111
  ## References
309
112
 
113
+ ### AIXM
310
114
  * [AIXM](http://aixm.aero)
311
- * [AIXM on Wikipedia](https://en.wikipedia.org/wiki/AIXM)
115
+ * [AICM 4.5 Documentation](https://openflightmaps.github.io/ofmx/aixm/4.5/manual/aicm/)
312
116
  * [AIXM 4.5 Specification](http://aixm.aero/document/aixm-45-specification)
313
- * [AICM 4.5 Entity-Relationship](https://www.ead.eurocontrol.int/SystemHelp/mergedProjects/SDO/aixm/)
117
+
118
+ ### OFMX
119
+ * [OFMX](https://github.com/openflightmaps/ofmx)
120
+ * [OFMX Documentation](https://github.com/openflightmaps/ofmx/wiki)
314
121
  * [Open Flightmaps](https://openflightmaps.org)
315
122
 
316
123
  ## Tests