aixm 0.3.0 → 0.3.1
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
- data/.ruby-version +1 -1
- data/CHANGELOG.md +96 -72
- data/README.md +0 -1
- data/lib/aixm/component/geometry.rb +8 -2
- data/lib/aixm/component/layer.rb +83 -2
- data/lib/aixm/document.rb +11 -2
- data/lib/aixm/errors.rb +14 -2
- data/lib/aixm/feature.rb +2 -14
- data/lib/aixm/feature/airport.rb +19 -18
- data/lib/aixm/feature/airspace.rb +19 -21
- data/lib/aixm/feature/navigational_aid.rb +2 -2
- data/lib/aixm/feature/navigational_aid/designated_point.rb +1 -2
- data/lib/aixm/feature/navigational_aid/dme.rb +25 -4
- data/lib/aixm/feature/navigational_aid/marker.rb +1 -2
- data/lib/aixm/feature/navigational_aid/ndb.rb +1 -2
- data/lib/aixm/feature/navigational_aid/tacan.rb +5 -2
- data/lib/aixm/feature/navigational_aid/vor.rb +3 -4
- data/lib/aixm/feature/organisation.rb +3 -4
- data/lib/aixm/feature/unit.rb +3 -4
- data/lib/aixm/version.rb +1 -1
- data/schemas/ofmx/0/OFMX-CSV-Obstacle.json +209 -0
- data/schemas/ofmx/0/OFMX-CSV.json +12 -0
- data/schemas/ofmx/0/OFMX-DataTypes.xsd +64 -5
- data/schemas/ofmx/0/OFMX-Features.xsd +73 -23
- data/schemas/ofmx/0/OFMX-Snapshot.xsd +7 -2
- data/spec/factory.rb +8 -18
- data/spec/lib/aixm/component/geometry_spec.rb +27 -4
- data/spec/lib/aixm/component/helipad_spec.rb +2 -2
- data/spec/lib/aixm/component/layer_spec.rb +27 -0
- data/spec/lib/aixm/component/runway_spec.rb +13 -13
- data/spec/lib/aixm/document_spec.rb +56 -42
- data/spec/lib/aixm/feature/airport_spec.rb +15 -15
- data/spec/lib/aixm/feature/airspace_spec.rb +38 -30
- data/spec/lib/aixm/feature/navigational_aid/designated_point_spec.rb +2 -2
- data/spec/lib/aixm/feature/navigational_aid/dme_spec.rb +24 -7
- data/spec/lib/aixm/feature/navigational_aid/marker_spec.rb +4 -4
- data/spec/lib/aixm/feature/navigational_aid/ndb_spec.rb +4 -4
- data/spec/lib/aixm/feature/navigational_aid/tacan_spec.rb +24 -7
- data/spec/lib/aixm/feature/navigational_aid/vor_spec.rb +14 -14
- data/spec/lib/aixm/feature/organisation_spec.rb +2 -2
- data/spec/lib/aixm/feature/unit_spec.rb +11 -11
- data/spec/lib/aixm/feature_spec.rb +0 -20
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: da3e3c10902d2c8b47bea41e1056a5447890e1ebeb9d7fb651115cc894f10067
|
4
|
+
data.tar.gz: dc2edb38a94804aa7c2c89d2cfcad6872a909598e77ac266fafebf2c39f7deb0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70a1af692e7141c60c49b3c2426be8037f030acc7808a3ec12029bc8df5bc62681396eb3b8e42add5aff92c10d010156a4cc920f8febf0b70a576a1fb5bd7ac2
|
7
|
+
data.tar.gz: c5dc5a92ebef4b7dea61928c794dd2d38c64c9d6a83fc305cb6b6105dff3adb7cb34b4c5eccb95501a14dbb89317c311924c5928a84fa333c165112cda63f820
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby-2.5.
|
1
|
+
ruby-2.5.3
|
data/CHANGELOG.md
CHANGED
@@ -1,101 +1,125 @@
|
|
1
|
+
## 0.3.1
|
2
|
+
|
3
|
+
#### Additions
|
4
|
+
* `AIXM::Error` base error which reveals the `subject`
|
5
|
+
* Consider single point geometries to be closed
|
6
|
+
* Calculate `DME#ghost_f` from `DME#channel`
|
7
|
+
* `Layer#location_indicator` and `Layer#activity`
|
8
|
+
|
9
|
+
#### Breaking Changes
|
10
|
+
* Renamed `Airport#code` to `Airport#id`
|
11
|
+
* Renamed `Airspace#short_name` to `Airspace#local_type`
|
12
|
+
* Moved `region` attribute from features to Document
|
13
|
+
|
14
|
+
#### Changes
|
15
|
+
* Be more permissive on `Airport#id` in order to accomodate generated codes
|
16
|
+
built by concatting the `region` and `Airport#gps`.
|
17
|
+
|
1
18
|
## 0.3.0
|
2
19
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
+
#### Breaking Additions
|
21
|
+
* Global configuration with `AIXM.config`
|
22
|
+
|
23
|
+
#### Breaking Changes
|
24
|
+
* Switch from "AIXM with OFM extensions" to OFMX
|
25
|
+
* `to_aixm` renamed to `to_xml` again
|
26
|
+
* Removed signature `to_xml(extension)` in favor of `AIXM.schema`
|
27
|
+
* Removed `Array#to_digest`
|
28
|
+
* Removed `Document#complete?`
|
29
|
+
* Renamed Schedule to Timetable
|
30
|
+
* Timetable and remarks moved from Airspace to to Layer (formerly known as class layer)
|
31
|
+
|
32
|
+
#### Additions
|
33
|
+
* Organization and Unit features
|
34
|
+
* Airport feature
|
35
|
+
* Refinement `Float#to_rad`
|
36
|
+
* Distance calculation with `AIXM::XY#distance`
|
37
|
+
* `Schedule#remarks`
|
20
38
|
|
21
39
|
## 0.2.3
|
22
40
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
41
|
+
#### Breaking Changes
|
42
|
+
* VOR types renamed from `:vor` to `:conventional` and `:doppler_vor` to `:doppler`
|
43
|
+
* NBR types added
|
44
|
+
* Marker types added
|
45
|
+
|
46
|
+
#### Changes
|
47
|
+
* `mid` attributes on all navigational aid features
|
29
48
|
|
30
49
|
## 0.2.2
|
31
50
|
|
32
|
-
|
33
|
-
|
34
|
-
|
51
|
+
#### Changes
|
52
|
+
* Bad error classes fixed
|
53
|
+
* Allow navigational aids without name
|
35
54
|
|
36
55
|
## 0.2.1
|
37
56
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
57
|
+
#### Breaking Changes
|
58
|
+
* DVOR and VORDME confusion fixed
|
59
|
+
* VOR can be associated with DME (-> VOR/DME) or TACAN (-> VORTAC) now
|
60
|
+
* `to_xml` renamed to `to_aixm` everywhere
|
61
|
+
* Removed `:other` from all value lists
|
62
|
+
|
63
|
+
#### Changes
|
64
|
+
* Schedule added to navigational aids
|
45
65
|
|
46
66
|
## 0.2.0
|
47
67
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
68
|
+
#### Breaking Changes
|
69
|
+
* Symbols such as `:qnh`, `:ofm` or `:mhz` are downcased now
|
70
|
+
|
71
|
+
#### Additions
|
72
|
+
* Frequency
|
73
|
+
* Navigational aids features
|
74
|
+
* `AIXM::Z#qfe?` and friends
|
54
75
|
|
55
76
|
## 0.1.4
|
56
77
|
|
57
|
-
|
58
|
-
|
78
|
+
#### Breaking Changes
|
79
|
+
* `AIXM.z(alt: 123, code: :QNE)` is now `AIXM.z(123, :QNE)`
|
59
80
|
|
60
81
|
## 0.1.3
|
61
82
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
83
|
+
#### Breaking Changes
|
84
|
+
* Re-organization of classes in features and components
|
85
|
+
|
86
|
+
#### Additions
|
87
|
+
* Shortcut initializers e.g. `AIXM.airspace(...)`
|
66
88
|
|
67
89
|
## 0.1.2
|
68
90
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
91
|
+
#### Breaking Additions
|
92
|
+
* Class layers
|
93
|
+
|
94
|
+
#### Breaking Changes
|
95
|
+
* Use `document.features << (feature)` instead of `document << (feature)`
|
73
96
|
|
74
97
|
## 0.1.1
|
75
98
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
99
|
+
#### Additions
|
100
|
+
* Schedule (all but `TIMSH`)
|
101
|
+
* Refinement `Float#to_km` and `String#uptrans`
|
102
|
+
* Shortcut constants `AIXM::UNLIMITED` and `AIXM::H24`
|
103
|
+
* `Airspace#short_name`
|
104
|
+
|
105
|
+
#### Changes
|
106
|
+
* `Document#created_at` and `#effective_at` accept Time, Date, String or *nil*
|
107
|
+
* Separate `AIXM::Document#valid?` from `#complete?`
|
108
|
+
* Write coordinates in DD if extension `:OFM` is set
|
109
|
+
* `Array#to_digest` returns Integer which fits in signed 32bit
|
86
110
|
|
87
111
|
## 0.1.0
|
88
112
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
113
|
+
#### Initial Implementation
|
114
|
+
* XY Coordinate
|
115
|
+
* Z Altitude
|
116
|
+
* AIXM-Snapshot 4.5 Document
|
117
|
+
* Airspace feature
|
118
|
+
* Vertical Limits
|
119
|
+
* Geometry
|
120
|
+
* Point
|
121
|
+
* Arc
|
122
|
+
* Border
|
123
|
+
* Circle
|
124
|
+
* Shortcut constant `AIXM::GROUND`
|
125
|
+
* Refinements
|
data/README.md
CHANGED
@@ -50,7 +50,6 @@ The following configuration options are available for setting and getting:
|
|
50
50
|
|
51
51
|
```ruby
|
52
52
|
AIXM.config.schema # either :aixm (default) or :ofmx
|
53
|
-
AIXM.config.region # fallback region
|
54
53
|
AIXM.config.ignored_errors # ignore XML schema errors which match this regex
|
55
54
|
```
|
56
55
|
|
@@ -8,6 +8,7 @@ module AIXM
|
|
8
8
|
# has to be a point with the same coordinates as the first).
|
9
9
|
#
|
10
10
|
# For a geometry to be valid, it must be comprised of either:
|
11
|
+
# * exactly one point
|
11
12
|
# * exactly one circle
|
12
13
|
# * at least three points, arcs or borders (the last of which a point with
|
13
14
|
# identical coordinates as the first)
|
@@ -53,17 +54,22 @@ module AIXM
|
|
53
54
|
|
54
55
|
# @return [Boolean] whether the geometry is closed
|
55
56
|
def closed?
|
56
|
-
circle? || polygon?
|
57
|
+
point? || circle? || polygon?
|
57
58
|
end
|
58
59
|
|
59
60
|
# @return [String] AIXM or OFMX markup
|
60
61
|
def to_xml
|
61
|
-
fail(GeometryError
|
62
|
+
fail(GeometryError.new("geometry is not closed", self)) unless closed?
|
62
63
|
@result_array.map { |h| h.to_xml }.join
|
63
64
|
end
|
64
65
|
|
65
66
|
private
|
66
67
|
|
68
|
+
def point?
|
69
|
+
@result_array.size == 1 &&
|
70
|
+
@result_array.first.is_a?(AIXM::Component::Geometry::Point)
|
71
|
+
end
|
72
|
+
|
67
73
|
def circle?
|
68
74
|
@result_array.size == 1 &&
|
69
75
|
@result_array.first.is_a?(AIXM::Component::Geometry::Circle)
|
data/lib/aixm/component/layer.rb
CHANGED
@@ -9,8 +9,10 @@ module AIXM
|
|
9
9
|
# ===Cheat Sheet in Pseudo Code:
|
10
10
|
# layer = AIXM.layer(
|
11
11
|
# class: String or nil
|
12
|
+
# location_indicator: String or nil
|
12
13
|
# vertical_limits: AIXM.vertical_limits
|
13
14
|
# )
|
15
|
+
# layer.activity = String or nil
|
14
16
|
# layer.timetable = AIXM.timetable or nil
|
15
17
|
# layer.selective = true or false (default)
|
16
18
|
# layer.remarks = String or nil
|
@@ -19,18 +21,86 @@ module AIXM
|
|
19
21
|
class Layer
|
20
22
|
CLASSES = (:A..:G).freeze
|
21
23
|
|
24
|
+
ACTIVITIES = {
|
25
|
+
ACCIDENT: :accident_investigation,
|
26
|
+
ACROBAT: :acrobatics,
|
27
|
+
AIRGUN: :aerial_gunnery,
|
28
|
+
AIRSHOW: :air_show,
|
29
|
+
ANTIHAIL: :anti_hail_rocket,
|
30
|
+
ARTILERY: :artillary_firing,
|
31
|
+
ASCENT: :probe,
|
32
|
+
ATS: :air_traffic_services,
|
33
|
+
BALLOON: :balloon,
|
34
|
+
BIRD: :bird_hazard,
|
35
|
+
'BIRD-MGR': :bird_migration,
|
36
|
+
BLAST: :blasting_operation,
|
37
|
+
DROP: :dropping,
|
38
|
+
DUSTING: :crop_dusting,
|
39
|
+
EQUIPMENT: :special_equipment_required,
|
40
|
+
'EQUIPMENT-833': :radio_8_33_required,
|
41
|
+
'EQUIPMENT-RNAV': :rnav_equipment_required,
|
42
|
+
'EQUIPMENT-RSVM': :rsvm_equipment_required,
|
43
|
+
EXERCISE: :combat_exercise,
|
44
|
+
FAUNA: :sensitive_fauna,
|
45
|
+
FIRE: :fire_suppression,
|
46
|
+
FIREWORK: :fireworks,
|
47
|
+
GAZ: :gaz_field,
|
48
|
+
GLIDER: :gliding,
|
49
|
+
HANGGLIDER: :hanggliding,
|
50
|
+
'HI-LIGHT': :high_intensity_light,
|
51
|
+
'HI-RADIO': :high_intensity_radio,
|
52
|
+
'IND-CHEM': :chemical_plant,
|
53
|
+
'IND-NUCLEAR': :nuclear_activity,
|
54
|
+
'IND-OIL': :oil_refinery,
|
55
|
+
JETCLIMB: :jet_climb,
|
56
|
+
LASER: :laser_light,
|
57
|
+
MILOPS: :military_operation,
|
58
|
+
MISSILES: :guided_missiles,
|
59
|
+
NATURE: :natural_reserve,
|
60
|
+
NAVAL: :ship_exercise,
|
61
|
+
'NO-NOISE': :noise_abatement,
|
62
|
+
OIL: :oil_field,
|
63
|
+
PARACHUTE: :parachuting,
|
64
|
+
PARAGLIDER: :paragliding,
|
65
|
+
POPULATION: :highly_populated,
|
66
|
+
PROCEDURE: :special_procedure,
|
67
|
+
REFUEL: :refuelling,
|
68
|
+
SHOOT: :shooting_from_ground,
|
69
|
+
SPACEFLT: :space_flight,
|
70
|
+
SPORT: :sport,
|
71
|
+
TECHNICAL: :technical_activity,
|
72
|
+
'TFC-AD': :aerodrome_traffic,
|
73
|
+
'TFC-HELI': :helicopter_traffic,
|
74
|
+
TOWING: :winch_activity,
|
75
|
+
TRG: :training,
|
76
|
+
UAV: :drone,
|
77
|
+
ULM: :ultra_light_flight,
|
78
|
+
VIP: :vip,
|
79
|
+
'VIP-PRES': :president,
|
80
|
+
'VIP-VICE': :vice_president,
|
81
|
+
WATERBLAST: :underwater_explosion,
|
82
|
+
WORK: :aerial_work,
|
83
|
+
OTHER: :other
|
84
|
+
}.freeze
|
85
|
+
|
86
|
+
# @return [String, nil] four letter location identifier as published in the ICAO DOC 7910
|
87
|
+
attr_reader :location_indicator
|
88
|
+
|
22
89
|
# @return [AIXM::Component::VerticalLimits] vertical limits of this layer
|
23
90
|
attr_reader :vertical_limits
|
24
91
|
|
92
|
+
# @return [String, nil] primary activity (e.g. "GLIDER")
|
93
|
+
attr_reader :activity
|
94
|
+
|
25
95
|
# @return [AIXM::Component::Timetable, nil] activation hours
|
26
96
|
attr_reader :timetable
|
27
97
|
|
28
98
|
# @return [String, nil] free text remarks
|
29
99
|
attr_reader :remarks
|
30
100
|
|
31
|
-
def initialize(class: nil, vertical_limits:)
|
101
|
+
def initialize(class: nil, location_indicator: nil, vertical_limits:)
|
32
102
|
self.class = binding.local_variable_get(:class)
|
33
|
-
self.vertical_limits = vertical_limits
|
103
|
+
self.location_indicator, self.vertical_limits = location_indicator, vertical_limits
|
34
104
|
self.selective = false
|
35
105
|
end
|
36
106
|
|
@@ -50,11 +120,20 @@ module AIXM
|
|
50
120
|
fail(ArgumentError, "invalid class") unless @klass.nil? || CLASSES.include?(@klass)
|
51
121
|
end
|
52
122
|
|
123
|
+
def location_indicator=(value)
|
124
|
+
fail(ArgumentError, "invalid location indicator") unless value.nil? || (value.is_a?(String) && value.length == 4)
|
125
|
+
@location_indicator = value&.uptrans
|
126
|
+
end
|
127
|
+
|
53
128
|
def vertical_limits=(value)
|
54
129
|
fail(ArgumentError, "invalid vertical limits") unless value.is_a? AIXM::Component::VerticalLimits
|
55
130
|
@vertical_limits = value
|
56
131
|
end
|
57
132
|
|
133
|
+
def activity=(value)
|
134
|
+
@activity = value.nil? ? nil : ACTIVITIES.lookup(value.to_s.to_sym, nil) || fail(ArgumentError, "invalid activity")
|
135
|
+
end
|
136
|
+
|
58
137
|
def timetable=(value)
|
59
138
|
fail(ArgumentError, "invalid timetable") unless value.nil? || value.is_a?(AIXM::Component::Timetable)
|
60
139
|
@timetable = value
|
@@ -79,6 +158,8 @@ module AIXM
|
|
79
158
|
def to_xml
|
80
159
|
builder = Builder::XmlMarkup.new(indent: 2)
|
81
160
|
builder.codeClass(self.class.to_s) if self.class
|
161
|
+
builder.codeLocInd(location_indicator) if location_indicator
|
162
|
+
builder.codeActivity(ACTIVITIES.key(activity).to_s) if activity
|
82
163
|
builder << vertical_limits.to_xml
|
83
164
|
builder << timetable.to_xml(as: :Att) if timetable
|
84
165
|
builder.codeSelAvbl(selective? ? 'Y' : 'N') if AIXM.ofmx?
|
data/lib/aixm/document.rb
CHANGED
@@ -17,6 +17,9 @@ module AIXM
|
|
17
17
|
class Document
|
18
18
|
NAMESPACE_PATTERN = /\A[a-f\d]{8}-[a-f\d]{4}-[a-f\d]{4}-[a-f\d]{4}-[a-f\d]{12}\z/.freeze
|
19
19
|
|
20
|
+
# @return [String] OFMX region all features in this document belong to
|
21
|
+
attr_reader :region
|
22
|
+
|
20
23
|
# @return [String] UUID to namespace the data contained in this document
|
21
24
|
attr_reader :namespace
|
22
25
|
|
@@ -29,8 +32,8 @@ module AIXM
|
|
29
32
|
# @return [Array<AIXM::Feature>] airspaces, airports and other features
|
30
33
|
attr_accessor :features
|
31
34
|
|
32
|
-
def initialize(namespace: nil, created_at: nil, effective_at: nil)
|
33
|
-
self.namespace, self.created_at, self.effective_at = namespace, created_at, effective_at
|
35
|
+
def initialize(region: nil, namespace: nil, created_at: nil, effective_at: nil)
|
36
|
+
self.region, self.namespace, self.created_at, self.effective_at = region, namespace, created_at, effective_at
|
34
37
|
@features = []
|
35
38
|
end
|
36
39
|
|
@@ -39,6 +42,11 @@ module AIXM
|
|
39
42
|
%Q(#<#{self.class} created_at=#{created_at.inspect}>)
|
40
43
|
end
|
41
44
|
|
45
|
+
def region=(value)
|
46
|
+
fail(ArgumentError, "invalid region") unless value.nil? || value.is_a?(String)
|
47
|
+
@region = value&.upcase
|
48
|
+
end
|
49
|
+
|
42
50
|
def namespace=(value)
|
43
51
|
fail(ArgumentError, "invalid namespace") unless value.nil? || value.match?(NAMESPACE_PATTERN)
|
44
52
|
@namespace = value || SecureRandom.uuid
|
@@ -76,6 +84,7 @@ module AIXM
|
|
76
84
|
'xmlns:xsi': AIXM.schema(:namespace),
|
77
85
|
version: AIXM.schema(:version),
|
78
86
|
origin: "rubygem aixm-#{AIXM::VERSION}",
|
87
|
+
region: (region if AIXM.ofmx?),
|
79
88
|
namespace: (namespace if AIXM.ofmx?),
|
80
89
|
created: @created_at.xmlschema,
|
81
90
|
effective: @effective_at.xmlschema
|
data/lib/aixm/errors.rb
CHANGED
@@ -1,11 +1,23 @@
|
|
1
1
|
module AIXM
|
2
2
|
|
3
|
+
# Extension of StandardError which contains the subject of the error.
|
4
|
+
#
|
5
|
+
# @abstract
|
6
|
+
class Error < StandardError
|
7
|
+
attr_reader :subject
|
8
|
+
|
9
|
+
def initialize(message, subject=nil)
|
10
|
+
@subject = subject
|
11
|
+
super message
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
3
15
|
# @see AIXM::Component::Geometry
|
4
16
|
# @see AIXM::Feature::Airspace#to_xml
|
5
|
-
class GeometryError <
|
17
|
+
class GeometryError < Error; end
|
6
18
|
|
7
19
|
# @see AIXM::Component::Layer
|
8
20
|
# @see AIXM::Feature::Airspace#to_xml
|
9
|
-
class LayerError <
|
21
|
+
class LayerError < Error; end
|
10
22
|
|
11
23
|
end
|