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
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