aixm 0.3.7 → 1.0.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +72 -6
- data/README.md +191 -53
- data/exe/ckmid +11 -0
- data/exe/mkmid +11 -0
- data/lib/aixm/association.rb +367 -0
- data/lib/aixm/classes.rb +44 -0
- data/lib/aixm/component/fato.rb +44 -52
- data/lib/aixm/component/frequency.rb +13 -14
- data/lib/aixm/component/geometry/arc.rb +2 -2
- data/lib/aixm/component/geometry/border.rb +14 -5
- data/lib/aixm/component/geometry/circle.rb +8 -2
- data/lib/aixm/component/geometry/point.rb +10 -3
- data/lib/aixm/component/geometry/rhumb_line.rb +54 -0
- data/lib/aixm/component/geometry.rb +38 -38
- data/lib/aixm/component/helipad.rb +29 -37
- data/lib/aixm/component/layer.rb +28 -19
- data/lib/aixm/component/lighting.rb +11 -12
- data/lib/aixm/component/runway.rb +46 -53
- data/lib/aixm/{feature → component}/service.rb +36 -35
- data/lib/aixm/component/surface.rb +3 -3
- data/lib/aixm/component/timetable.rb +5 -3
- data/lib/aixm/component/{vertical_limits.rb → vertical_limit.rb} +12 -6
- data/lib/aixm/config.rb +6 -3
- data/lib/aixm/document.rb +31 -49
- data/lib/aixm/executables.rb +85 -0
- data/lib/aixm/f.rb +28 -0
- data/lib/aixm/feature/address.rb +20 -15
- data/lib/aixm/feature/airport.rb +113 -129
- data/lib/aixm/feature/airspace.rb +54 -23
- data/lib/aixm/feature/navigational_aid/designated_point.rb +12 -14
- data/lib/aixm/feature/navigational_aid/dme.rb +10 -11
- data/lib/aixm/feature/navigational_aid/marker.rb +6 -2
- data/lib/aixm/feature/navigational_aid/ndb.rb +6 -2
- data/lib/aixm/feature/navigational_aid/tacan.rb +6 -2
- data/lib/aixm/feature/navigational_aid/vor.rb +22 -14
- data/lib/aixm/feature/navigational_aid.rb +7 -9
- data/lib/aixm/feature/obstacle.rb +22 -20
- data/lib/aixm/feature/obstacle_group.rb +30 -30
- data/lib/aixm/feature/organisation.rb +20 -4
- data/lib/aixm/feature/unit.rb +35 -45
- data/lib/aixm/feature.rb +13 -3
- data/lib/aixm/memoize.rb +89 -0
- data/lib/aixm/object.rb +9 -0
- data/lib/aixm/payload_hash.rb +114 -0
- data/lib/aixm/refinements.rb +34 -50
- data/lib/aixm/shortcuts.rb +6 -43
- data/lib/aixm/version.rb +1 -1
- data/lib/aixm/xy.rb +9 -1
- data/lib/aixm.rb +18 -7
- data/schemas/ofmx/{0 → 0.1}/OFMX-CSV-Obstacle.json +0 -0
- data/schemas/ofmx/{0 → 0.1}/OFMX-CSV.json +0 -0
- data/schemas/ofmx/{0 → 0.1}/OFMX-DataTypes.xsd +52 -2
- data/schemas/ofmx/{0 → 0.1}/OFMX-Features.xsd +225 -14
- data/schemas/ofmx/{0 → 0.1}/OFMX-Snapshot.xsd +0 -5
- data.tar.gz.sig +0 -0
- metadata +116 -164
- metadata.gz.sig +0 -0
- data/.gitignore +0 -6
- data/.ruby-version +0 -1
- data/.travis.yml +0 -8
- data/.yardopts +0 -3
- data/Guardfile +0 -8
- data/aixm.gemspec +0 -35
- data/gems.rb +0 -3
- data/lib/aixm/component.rb +0 -6
- data/rakefile.rb +0 -22
- data/spec/factory.rb +0 -559
- data/spec/lib/aixm/a_spec.rb +0 -203
- data/spec/lib/aixm/component/fato_spec.rb +0 -260
- data/spec/lib/aixm/component/frequency_spec.rb +0 -75
- data/spec/lib/aixm/component/geometry/arc_spec.rb +0 -75
- data/spec/lib/aixm/component/geometry/border_spec.rb +0 -33
- data/spec/lib/aixm/component/geometry/circle_spec.rb +0 -70
- data/spec/lib/aixm/component/geometry/point_spec.rb +0 -39
- data/spec/lib/aixm/component/geometry_spec.rb +0 -321
- data/spec/lib/aixm/component/helipad_spec.rb +0 -187
- data/spec/lib/aixm/component/layer_spec.rb +0 -137
- data/spec/lib/aixm/component/lighting_spec.rb +0 -88
- data/spec/lib/aixm/component/runway_spec.rb +0 -472
- data/spec/lib/aixm/component/surface_spec.rb +0 -124
- data/spec/lib/aixm/component/timetable_spec.rb +0 -49
- data/spec/lib/aixm/component/vertical_limits_spec.rb +0 -97
- data/spec/lib/aixm/config_spec.rb +0 -41
- data/spec/lib/aixm/d_spec.rb +0 -150
- data/spec/lib/aixm/document_spec.rb +0 -1875
- data/spec/lib/aixm/errors_spec.rb +0 -14
- data/spec/lib/aixm/f_spec.rb +0 -85
- data/spec/lib/aixm/feature/address_spec.rb +0 -55
- data/spec/lib/aixm/feature/airport_spec.rb +0 -770
- data/spec/lib/aixm/feature/airspace_spec.rb +0 -390
- data/spec/lib/aixm/feature/navigational_aid/designated_point_spec.rb +0 -98
- data/spec/lib/aixm/feature/navigational_aid/dme_spec.rb +0 -92
- data/spec/lib/aixm/feature/navigational_aid/marker_spec.rb +0 -79
- data/spec/lib/aixm/feature/navigational_aid/ndb_spec.rb +0 -89
- data/spec/lib/aixm/feature/navigational_aid/tacan_spec.rb +0 -88
- data/spec/lib/aixm/feature/navigational_aid/vor_spec.rb +0 -245
- data/spec/lib/aixm/feature/navigational_aid_spec.rb +0 -52
- data/spec/lib/aixm/feature/obstacle_group_spec.rb +0 -326
- data/spec/lib/aixm/feature/obstacle_spec.rb +0 -279
- data/spec/lib/aixm/feature/organisation_spec.rb +0 -77
- data/spec/lib/aixm/feature/service_spec.rb +0 -59
- data/spec/lib/aixm/feature/unit_spec.rb +0 -230
- data/spec/lib/aixm/feature_spec.rb +0 -38
- data/spec/lib/aixm/p_spec.rb +0 -189
- data/spec/lib/aixm/refinements_spec.rb +0 -381
- data/spec/lib/aixm/version_spec.rb +0 -7
- data/spec/lib/aixm/w_spec.rb +0 -150
- data/spec/lib/aixm/xy_spec.rb +0 -180
- data/spec/lib/aixm/z_spec.rb +0 -94
- data/spec/macros/marking.rb +0 -12
- data/spec/macros/organisation.rb +0 -11
- data/spec/macros/remarks.rb +0 -12
- data/spec/macros/timetable.rb +0 -11
- data/spec/macros/xy.rb +0 -11
- data/spec/macros/z_qnh.rb +0 -11
- data/spec/sounds/failure.mp3 +0 -0
- data/spec/sounds/success.mp3 +0 -0
- data/spec/spec_helper.rb +0 -55
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2f4efdae60e160732c8f30262673f01b49d6dd53d5c5e9bc2d8c395cf696ccae
|
|
4
|
+
data.tar.gz: 7b129a858e6c6d0eb7545d4a32910243e7a8ecd00a8895698f4ae69fcaed33f2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 98115e7b0f93f82e976235045afdff88b3b6a99b256620de733b4b4741ffa7fb769e6bb92aae86657d6ae57b5744aef5df82a634b22adb5ae81b9db18a7c1531
|
|
7
|
+
data.tar.gz: fd3bf40b77d4cfef51465b4e1806382465a4eee86abd8c74c3639763a627653a7832696395bab9673dd6433458bef8474871b7dcd121533891df3c911a429baf
|
checksums.yaml.gz.sig
ADDED
|
Binary file
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,65 @@
|
|
|
1
|
+
## 1.0.0
|
|
2
|
+
|
|
3
|
+
#### Breaking Changes
|
|
4
|
+
* Move `Ase->txtLocalType` up into `AseUid` for OFMX
|
|
5
|
+
|
|
6
|
+
#### Additions
|
|
7
|
+
* Add `AIXM::Component::Geometry::RhumbLine`
|
|
8
|
+
|
|
9
|
+
## 0.3.11
|
|
10
|
+
|
|
11
|
+
#### Breaking Changes
|
|
12
|
+
* Renamed default git branch to `main`
|
|
13
|
+
* Require Ruby 3.0
|
|
14
|
+
* `Address#address` requires and returns `AIXM::F` for type `:radio_frequency`
|
|
15
|
+
|
|
16
|
+
#### Changes
|
|
17
|
+
* Fix `Obstacle#source` for OFMX
|
|
18
|
+
|
|
19
|
+
#### Additions
|
|
20
|
+
* Add `f#voice?` and `AIXM.config.voice_channel_separation` to check whether a
|
|
21
|
+
frequency belongs to the voice communication airband and use it to validate
|
|
22
|
+
`AIXM::Frequency`
|
|
23
|
+
|
|
24
|
+
## 0.3.10
|
|
25
|
+
|
|
26
|
+
#### Additions
|
|
27
|
+
* Proper `has_many` and `has_one` associations
|
|
28
|
+
* `AIXM::Association:Array#find_by|find|duplicate` on `has_many` associations
|
|
29
|
+
* `AIXM.config.mid` now defines whether `mid` attributes are inserted or not
|
|
30
|
+
provided the selected schema is OFMX
|
|
31
|
+
* `AIXM::Memoize` module
|
|
32
|
+
* `AIXM::PayloadHash` class
|
|
33
|
+
* `mkmid` executable to insert `mid` attributes into valid OFMX file
|
|
34
|
+
* `ckmid` executable to check `mid` attributes in an OFMX file
|
|
35
|
+
* `AIXM::Component::Geometry#point?|circle?|polygon?`
|
|
36
|
+
* `AIXM::Component::Layer#services`
|
|
37
|
+
|
|
38
|
+
#### Breaking Changes
|
|
39
|
+
* Require Ruby 2.7
|
|
40
|
+
* Moved `region` attribute from `Document` back to features again
|
|
41
|
+
* Use `Document#add_feature` instead of `Document@features#<<`
|
|
42
|
+
* Use `Document@features#find` instead of `Document#select_features`
|
|
43
|
+
* Use `Airspace#add_layer` instead of `Airspace@layers#<<`
|
|
44
|
+
* Use `Geometry#add_segment` instead of `Geometry#<<`
|
|
45
|
+
* Renamed `VerticalLimits` to `VerticalLimit`
|
|
46
|
+
* Moved `AIXM::Feature::Service` to `AIXM::Component::Service`
|
|
47
|
+
* Refinements `String#insert_payload_hash` and `Array#to_uuid` removed again
|
|
48
|
+
* Refinement `String#payload_hash` removed in favor of `AIXM::PayloadHash` class
|
|
49
|
+
* Refinements `Array#find|duplicates` removed
|
|
50
|
+
|
|
51
|
+
#### Changes
|
|
52
|
+
* Renamed `AIXM.config.mid_region` to `AIXM.config.region`
|
|
53
|
+
|
|
54
|
+
## 0.3.8
|
|
55
|
+
|
|
56
|
+
#### Additions
|
|
57
|
+
* `AIXM.config.mid_region` to insert `mid` attributes
|
|
58
|
+
* Refinement `String#insert_payload_hash`
|
|
59
|
+
|
|
60
|
+
#### Changes
|
|
61
|
+
* Fix calculation of magnetic bearing
|
|
62
|
+
|
|
1
63
|
## 0.3.7
|
|
2
64
|
|
|
3
65
|
#### Additions
|
|
@@ -37,14 +99,17 @@
|
|
|
37
99
|
* `Runway#preparation`, `Runway#condition` and `Runway#vfr_pattern`
|
|
38
100
|
* `Service#guessed_unit_type`
|
|
39
101
|
* Surface for `Runway|Helipad#surface`
|
|
40
|
-
* Extracted `AIXM::MIN`, `AIXM::SEC` and `AIXM::DMS_RE` to scan for coordinates
|
|
41
|
-
|
|
102
|
+
* Extracted `AIXM::MIN`, `AIXM::SEC` and `AIXM::DMS_RE` to scan for coordinates
|
|
103
|
+
in texts
|
|
104
|
+
* Refinements `Array#to_uuid` and `String#payload_hash`
|
|
42
105
|
|
|
43
106
|
#### Breaking Changes
|
|
44
107
|
* Require Ruby 2.6
|
|
45
|
-
* Renamed `AIXM::H` to `AIXM::A` (angle) and add simple arithmetics to make it
|
|
108
|
+
* Renamed `AIXM::H` to `AIXM::A` (angle) and add simple arithmetics to make it
|
|
109
|
+
more versatile
|
|
46
110
|
* `Runway|Helipad#composition` moved to `Runway|Helipad#surface`
|
|
47
|
-
* DMS notation `{-}{DD}DMMSS{.SS}[NESW]` now requires compulsory cardinal
|
|
111
|
+
* DMS notation `{-}{DD}DMMSS{.SS}[NESW]` now requires compulsory cardinal
|
|
112
|
+
direction (N, E, S or W) at the end
|
|
48
113
|
|
|
49
114
|
#### Changes
|
|
50
115
|
* Service is a feature now
|
|
@@ -56,7 +121,8 @@
|
|
|
56
121
|
|
|
57
122
|
#### Changes
|
|
58
123
|
* Updated OFMX schema URI
|
|
59
|
-
* Added `eql?` and `hash` to `AIXM::XY|Z|D|H|F` to allow for instances of these
|
|
124
|
+
* Added `eql?` and `hash` to `AIXM::XY|Z|D|H|F` to allow for instances of these
|
|
125
|
+
classes to be used as Hash keys.
|
|
60
126
|
|
|
61
127
|
## 0.3.2
|
|
62
128
|
|
|
@@ -81,7 +147,7 @@
|
|
|
81
147
|
#### Breaking Changes
|
|
82
148
|
* Renamed `Airport#code` to `Airport#id`
|
|
83
149
|
* Renamed `Airspace#short_name` to `Airspace#local_type`
|
|
84
|
-
* Moved `region` attribute from features to Document
|
|
150
|
+
* Moved `region` attribute from features to `Document`
|
|
85
151
|
|
|
86
152
|
#### Changes
|
|
87
153
|
* Be more permissive on `Airport#id` in order to accomodate generated codes
|
data/README.md
CHANGED
|
@@ -1,38 +1,66 @@
|
|
|
1
1
|
[](https://rubygems.org/gems/aixm)
|
|
2
|
-
[](https://github.com/svoop/aixm/actions?workflow=Test)
|
|
3
3
|
[](https://codeclimate.com/github/svoop/aixm/)
|
|
4
4
|
[](https://donorbox.org/bitcetera)
|
|
5
5
|
|
|
6
6
|
# AIXM
|
|
7
7
|
|
|
8
|
-
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://
|
|
8
|
+
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://gitlab.com/openflightmaps/ofmx/wikis) for Ruby.
|
|
9
9
|
|
|
10
10
|
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.
|
|
11
11
|
|
|
12
12
|
* [Homepage](https://github.com/svoop/aixm)
|
|
13
|
-
* [API](
|
|
13
|
+
* [API](https://www.rubydoc.info/gems/aixm)
|
|
14
14
|
* Author: [Sven Schwyn - Bitcetera](http://www.bitcetera.com)
|
|
15
15
|
|
|
16
16
|
## Install
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
### Security
|
|
19
|
+
|
|
20
|
+
This gem is [cryptographically signed](https://guides.rubygems.org/security/#using-gems) in order to assure it hasn't been tampered with. Unless already done, please add the author's public key as a trusted certificate now:
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
gem cert --add <(curl -Ls https://raw.github.com/svoop/aixm/main/certs/svoop.pem)
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Bundler
|
|
27
|
+
|
|
28
|
+
Add the following to the <tt>Gemfile</tt> or <tt>gems.rb</tt> of your [Bundler](https://bundler.io) powered Ruby project:
|
|
19
29
|
|
|
20
30
|
```ruby
|
|
21
31
|
gem aixm
|
|
22
32
|
```
|
|
23
33
|
|
|
34
|
+
And then install the bundle:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
bundle install --trust-policy MediumSecurity
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Standalone
|
|
41
|
+
|
|
42
|
+
If you're only going to use [the executables](#executables), make sure to have the [latest version of Ruby](https://www.ruby-lang.org/en/documentation/installation/) and then install this gem:
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
gem install aixm --trust-policy MediumSecurity
|
|
46
|
+
```
|
|
47
|
+
|
|
24
48
|
## Usage
|
|
25
49
|
|
|
26
50
|
Here's how to build a document object, populate it with a simple feature and then render it as AIXM:
|
|
27
51
|
|
|
28
52
|
```ruby
|
|
29
|
-
document = AIXM.document
|
|
30
|
-
|
|
31
|
-
id: "ABIXI",
|
|
32
|
-
xy: AIXM.xy(lat: %q(46°31'54.3"N), long: %q(002°19'55.2"W)),
|
|
33
|
-
type: :icao
|
|
53
|
+
document = AIXM.document(
|
|
54
|
+
region: 'LF'
|
|
34
55
|
)
|
|
35
|
-
document.
|
|
56
|
+
document.add_feature(
|
|
57
|
+
AIXM.designated_point(
|
|
58
|
+
id: "ABIXI",
|
|
59
|
+
xy: AIXM.xy(lat: %q(46°31'54.3"N), long: %q(002°19'55.2"W)),
|
|
60
|
+
type: :icao
|
|
61
|
+
)
|
|
62
|
+
)
|
|
63
|
+
AIXM.ofmx!
|
|
36
64
|
document.to_xml
|
|
37
65
|
```
|
|
38
66
|
|
|
@@ -47,11 +75,12 @@ See `AIXM::CLASSES` for the complete list of shorthand names.
|
|
|
47
75
|
|
|
48
76
|
## Configuration
|
|
49
77
|
|
|
50
|
-
|
|
78
|
+
### AIXM.config.schema
|
|
79
|
+
|
|
80
|
+
The schema is either `:aixm` (default) or `:ofmx`:
|
|
51
81
|
|
|
52
82
|
```ruby
|
|
53
|
-
AIXM.config.schema
|
|
54
|
-
AIXM.config.ignored_errors # ignore XML schema errors which match this regex
|
|
83
|
+
AIXM.config.schema = :ofmx # =>:ofmx
|
|
55
84
|
```
|
|
56
85
|
|
|
57
86
|
There are shortcuts to set and get the schema:
|
|
@@ -65,65 +94,174 @@ AIXM.schema # => :ofmx
|
|
|
65
94
|
AIXM.schema(:version) # => 0
|
|
66
95
|
```
|
|
67
96
|
|
|
68
|
-
|
|
97
|
+
### AIXM.config.region
|
|
69
98
|
|
|
70
|
-
`
|
|
99
|
+
The `:ofmx` schema requires the [region to be set on all core features](https://gitlab.com/openflightmaps/ofmx/wikis/Features#core-features). You can do so on individual features, however, you might want to configure a default region to simplify your life:
|
|
100
|
+
|
|
101
|
+
```ruby
|
|
102
|
+
AIXM.ofmx!
|
|
103
|
+
AIXM.config.region = 'LF'
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
:warning: This setting has no effect when using the `:aixm` schema.
|
|
107
|
+
|
|
108
|
+
### AIXM.voice_channel_separation
|
|
109
|
+
|
|
110
|
+
Define which voice channel separation should be used to validate voice communication frequencies.
|
|
111
|
+
|
|
112
|
+
```ruby
|
|
113
|
+
AIXM.voice_channel_separation = :any # both 25 and 8.33 kHz (default)
|
|
114
|
+
AIXM.voice_channel_separation = 25 # 25 kHz only
|
|
115
|
+
AIXM.voice_channel_separation = 833 # 8.33 kHz only
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### AIXM.config.mid
|
|
119
|
+
|
|
120
|
+
In order to insert [OFMX-compliant `mid` attributes](https://gitlab.com/openflightmaps/ofmx/wikis/Features#mid) into all `*Uid` elements, you have set the mid configuration option to `true`.
|
|
121
|
+
|
|
122
|
+
```ruby
|
|
123
|
+
AIXM.ofmx!
|
|
124
|
+
AIXM.config.mid = false # don't insert mid attributes (default)
|
|
125
|
+
AIXM.config.mid = true # insert mid attributes
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
:warning: This setting has no effect when using the `:aixm` schema.
|
|
129
|
+
|
|
130
|
+
### AIXM.config.ignored_errors
|
|
131
|
+
|
|
132
|
+
In case you want to ignore certain XML schema validation errors, set this configuration option to a regular expression which matches the error messages to ignore. By default, no errors are ignored.
|
|
133
|
+
|
|
134
|
+
```ruby
|
|
135
|
+
AIXM.config.ignored_errors = /invalid date/i
|
|
136
|
+
```
|
|
71
137
|
|
|
72
|
-
##
|
|
138
|
+
## Models
|
|
73
139
|
|
|
74
140
|
### Fundamentals
|
|
75
|
-
* [Document](
|
|
76
|
-
* [XY (longitude and latitude)](
|
|
77
|
-
* [Z (height, elevation or altitude)](
|
|
78
|
-
* [D (distance or length)](
|
|
79
|
-
* [F (frequency)](
|
|
80
|
-
* [A (angle)](
|
|
141
|
+
* [Document](https://www.rubydoc.info/gems/aixm/AIXM/Document.html)
|
|
142
|
+
* [XY (longitude and latitude)](https://www.rubydoc.info/gems/aixm/AIXM/XY.html)
|
|
143
|
+
* [Z (height, elevation or altitude)](https://www.rubydoc.info/gems/aixm/AIXM/Z.html)
|
|
144
|
+
* [D (distance or length)](https://www.rubydoc.info/gems/aixm/AIXM/D.html)
|
|
145
|
+
* [F (frequency)](https://www.rubydoc.info/gems/aixm/AIXM/F.html)
|
|
146
|
+
* [A (angle)](https://www.rubydoc.info/gems/aixm/AIXM/A.html)
|
|
81
147
|
|
|
82
148
|
### Features
|
|
83
|
-
* [Address](
|
|
84
|
-
* [Organisation](
|
|
85
|
-
* [Unit](
|
|
86
|
-
* [Service](
|
|
87
|
-
* [Airport](
|
|
88
|
-
* [Airspace](
|
|
89
|
-
* [Navigational aid](
|
|
90
|
-
* [Designated point](
|
|
91
|
-
* [DME](
|
|
92
|
-
* [Marker](
|
|
93
|
-
* [NDB](
|
|
94
|
-
* [TACAN](
|
|
95
|
-
* [VOR](
|
|
96
|
-
* [Obstacle and obstacle group](
|
|
149
|
+
* [Address](https://www.rubydoc.info/gems/aixm/AIXM/Feature/Address.html)
|
|
150
|
+
* [Organisation](https://www.rubydoc.info/gems/aixm/AIXM/Feature/Organisation.html)
|
|
151
|
+
* [Unit](https://www.rubydoc.info/gems/aixm/AIXM/Feature/Unit.html)
|
|
152
|
+
* [Service](https://www.rubydoc.info/gems/aixm/AIXM/Component/Service.html)
|
|
153
|
+
* [Airport](https://www.rubydoc.info/gems/aixm/AIXM/Feature/Airport.html)
|
|
154
|
+
* [Airspace](https://www.rubydoc.info/gems/aixm/AIXM/Feature/Airspace.html)
|
|
155
|
+
* [Navigational aid](https://www.rubydoc.info/gems/aixm/AIXM/NavigationalAid.html)
|
|
156
|
+
* [Designated point](https://www.rubydoc.info/gems/aixm/AIXM/Feature/DesignatedPoint.html)
|
|
157
|
+
* [DME](https://www.rubydoc.info/gems/aixm/AIXM/Feature/DME.html)
|
|
158
|
+
* [Marker](https://www.rubydoc.info/gems/aixm/AIXM/Feature/Marker.html)
|
|
159
|
+
* [NDB](https://www.rubydoc.info/gems/aixm/AIXM/Feature/NDB.html)
|
|
160
|
+
* [TACAN](https://www.rubydoc.info/gems/aixm/AIXM/Feature/TACAN.html)
|
|
161
|
+
* [VOR](https://www.rubydoc.info/gems/aixm/AIXM/Feature/VOR.html)
|
|
162
|
+
* [Obstacle and obstacle group](https://www.rubydoc.info/gems/aixm/AIXM/Feature/Obstacle.html)
|
|
97
163
|
|
|
98
164
|
### Components
|
|
99
|
-
* [Frequency](
|
|
100
|
-
* [Geometry](
|
|
101
|
-
* [Point](
|
|
102
|
-
* [Arc](
|
|
103
|
-
* [Border](
|
|
104
|
-
* [Circle](
|
|
105
|
-
* [Runway](
|
|
106
|
-
* [Helipad](
|
|
107
|
-
* [FATO](
|
|
108
|
-
* [Surface](
|
|
109
|
-
* [Layer](
|
|
110
|
-
* [Vertical
|
|
111
|
-
* [Timetable](
|
|
165
|
+
* [Frequency](https://www.rubydoc.info/gems/aixm/AIXM/Component/Frequency.html)
|
|
166
|
+
* [Geometry](https://www.rubydoc.info/gems/aixm/AIXM/Component/Geometry.html)
|
|
167
|
+
* [Point](https://www.rubydoc.info/gems/aixm/AIXM/Component/Point.html)
|
|
168
|
+
* [Arc](https://www.rubydoc.info/gems/aixm/AIXM/Component/Arc.html)
|
|
169
|
+
* [Border](https://www.rubydoc.info/gems/aixm/AIXM/Component/Border.html)
|
|
170
|
+
* [Circle](https://www.rubydoc.info/gems/aixm/AIXM/Component/Circle.html)
|
|
171
|
+
* [Runway](https://www.rubydoc.info/gems/aixm/AIXM/Component/Runway.html)
|
|
172
|
+
* [Helipad](https://www.rubydoc.info/gems/aixm/AIXM/Component/Helipad.html)
|
|
173
|
+
* [FATO](https://www.rubydoc.info/gems/aixm/AIXM/Component/FATO.html)
|
|
174
|
+
* [Surface](https://www.rubydoc.info/gems/aixm/AIXM/Component/Surface.html)
|
|
175
|
+
* [Layer](https://www.rubydoc.info/gems/aixm/AIXM/Component/Layer.html)
|
|
176
|
+
* [Vertical limit](https://www.rubydoc.info/gems/aixm/AIXM/Component/VerticalLimit.html)
|
|
177
|
+
* [Timetable](https://www.rubydoc.info/gems/aixm/AIXM/Component/Timetable.html)
|
|
178
|
+
|
|
179
|
+
## Associations
|
|
180
|
+
|
|
181
|
+
The different models are interwoven with [`has_many` and `has_one` associations](https://www.rubydoc.info/gems/aixm/AIXM/Association).
|
|
182
|
+
|
|
183
|
+
Please note that `has_many` associations are instances `AIXM::Association::Array` which mostly behave like normal arrays. However, you must not add or remove elements on the array directly but use the corresponding method on the associating model instead:
|
|
184
|
+
|
|
185
|
+
```ruby
|
|
186
|
+
document.features << airport # => NoMethodError
|
|
187
|
+
document.add_feature airport # okay
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### find_by and find
|
|
191
|
+
|
|
192
|
+
Use `find_by` on `has_many` to filter associations by class and optional attribute values:
|
|
193
|
+
|
|
194
|
+
```ruby
|
|
195
|
+
document.features.find_by(:airport) # => [#<AIXM::Feature::Airport>, #<AIXM::Feature::Airport>]
|
|
196
|
+
document.features.find_by(:airport, id: 'LFNT') # => [#<AIXM::Feature::Airport>]
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
To search a `has_many` association for equal objects, use `find`:
|
|
200
|
+
|
|
201
|
+
```ruby
|
|
202
|
+
document.features.find(airport) # => [#<AIXM::Feature::Airport>]
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
This may seem redundant at first, but keep in mind that two instances of +AIXM::CLASSES+ which implement `#to_uid` are considered equal if they are instances of the same class and both their UIDs as calculated by `#to_uid` are equal. Attributes which are not part of the `#to_uid` calculation are irrelevant!
|
|
206
|
+
|
|
207
|
+
### duplicates
|
|
208
|
+
|
|
209
|
+
Equally on `has_many` associations, use `duplicates` to find identical or equal associations:
|
|
210
|
+
|
|
211
|
+
```ruby
|
|
212
|
+
document.features.duplicates # => [#<AIXM::Feature::Unit>, #<AIXM::Component::Service>, ...]
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Payload Hash
|
|
216
|
+
|
|
217
|
+
OFMX defines a [payload hash function](https://gitlab.com/openflightmaps/ofmx/wikis/Functions) used to facilitate association and modification tracking. It is used internally, but you can also use it in your own code:
|
|
218
|
+
|
|
219
|
+
```ruby
|
|
220
|
+
# Payload hash of XML fragment string
|
|
221
|
+
xml = '<xml><a></a></xml>'
|
|
222
|
+
AIXM::PayloadHash.new(xml).to_uuid
|
|
223
|
+
|
|
224
|
+
# Payload hash of Nokogiri XML fragment
|
|
225
|
+
document = File.open("file.xml") { Nokogiri::XML(_1) }
|
|
226
|
+
AIXM::PayloadHash.new(document).to_uuid
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## Validation
|
|
230
|
+
|
|
231
|
+
`AIXM::Document#valid?` validates the resulting AIXM or OFMX against its XML schema. If any, you find the errors in `AIXM::Document#errors`.
|
|
112
232
|
|
|
113
233
|
## Refinements
|
|
114
234
|
|
|
115
|
-
By `using AIXM::Refinements` you get a few handy [extensions to Ruby core classes](
|
|
235
|
+
By `using AIXM::Refinements` you get a few handy [extensions to Ruby core classes](https://www.rubydoc.info/gems/aixm/AIXM/Refinements.html).
|
|
236
|
+
|
|
237
|
+
## Executables
|
|
238
|
+
|
|
239
|
+
### mkmid
|
|
240
|
+
|
|
241
|
+
The `mkmid` executable reads an OFMX file, adds [OFMX-compliant `mid` values](https://gitlab.com/openflightmaps/ofmx/wikis/Features#mid) into all `*Uid` elements and validates the result against the schema.
|
|
242
|
+
|
|
243
|
+
```
|
|
244
|
+
mkmid --help
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### ckmid
|
|
248
|
+
|
|
249
|
+
The `chmid` executable reads an OFMX file, validates it against the schema and checks all `mid` attributes for [OFMX-compliance](https://gitlab.com/openflightmaps/ofmx/wikis/Features#mid).
|
|
250
|
+
|
|
251
|
+
```
|
|
252
|
+
ckmid --help
|
|
253
|
+
```
|
|
116
254
|
|
|
117
255
|
## References
|
|
118
256
|
|
|
119
257
|
### AIXM
|
|
120
258
|
* [AIXM](http://aixm.aero)
|
|
121
|
-
* [AICM 4.5 documentation](https://openflightmaps.
|
|
259
|
+
* [AICM 4.5 documentation](https://openflightmaps.gitlab.io/ofmx/aixm/4.5/manual/aicm/)
|
|
122
260
|
* [AIXM 4.5 specification](http://aixm.aero/document/aixm-45-specification)
|
|
123
261
|
|
|
124
262
|
### OFMX
|
|
125
|
-
* [OFMX](https://
|
|
126
|
-
* [OFMX documentation](https://
|
|
263
|
+
* [OFMX](https://gitlab.com/openflightmaps/ofmx)
|
|
264
|
+
* [OFMX documentation](https://gitlab.com/openflightmaps/ofmx/wikis)
|
|
127
265
|
* [open flightmaps](https://openflightmaps.org)
|
|
128
266
|
|
|
129
267
|
## Tests
|
data/exe/ckmid
ADDED