adiwg-mdtranslator 2.6.1 → 2.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -1
- data/adiwg-mdtranslator.gemspec +1 -1
- data/lib/adiwg/mdtranslator/internal/internal_metadata_obj.rb +3 -2
- data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_attribute.rb +4 -4
- data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_fgdc.rb +1 -1
- data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_identification.rb +7 -2
- data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_keyword.rb +35 -1
- data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_lineage.rb +10 -2
- data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_methodology.rb +69 -0
- data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_process.rb +6 -10
- data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_quality.rb +3 -3
- data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_range.rb +3 -3
- data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_raster.rb +1 -1
- data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_source.rb +5 -5
- data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_spatialOrganization.rb +6 -4
- data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_taxonSystem.rb +6 -3
- data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_taxonomy.rb +6 -4
- data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_entityAttribute.rb +6 -6
- data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_resourceInfo.rb +2 -2
- data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_source.rb +101 -94
- data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_taxonomicSystem.rb +2 -2
- data/lib/adiwg/mdtranslator/version.rb +4 -1
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_browse.rb +54 -0
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_citation.rb +35 -15
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_constraint.rb +53 -0
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_description.rb +1 -1
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_fgdc.rb +39 -3
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_geologicAge.rb +1 -1
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_identification.rb +148 -89
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_keyword.rb +6 -6
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_lineage.rb +91 -0
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_method.rb +94 -0
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_methodKeywords.rb +55 -0
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_process.rb +119 -0
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_publisher.rb +1 -1
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_quality.rb +64 -0
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_security.rb +69 -0
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_series.rb +1 -1
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_source.rb +124 -0
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_spatialDomain.rb +2 -2
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_spatialOrganization.rb +177 -0
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_status.rb +1 -1
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_taxonomy.rb +70 -0
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_taxonomyClassification.rb +65 -0
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_taxonomyKeywords.rb +55 -0
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_taxonomySystem.rb +154 -0
- data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_timePeriod.rb +22 -16
- data/lib/adiwg/mdtranslator/writers/fgdc/fgdc_writer.rb +19 -1
- data/lib/adiwg/mdtranslator/writers/fgdc/readme.md +2 -2
- data/lib/adiwg/mdtranslator/writers/html/html_writer.rb +1 -1
- data/lib/adiwg/mdtranslator/writers/html/sections/html_entityAttribute.rb +2 -2
- data/lib/adiwg/mdtranslator/writers/html/sections/html_source.rb +7 -0
- data/lib/adiwg/mdtranslator/writers/mdJson/sections/mdJson_entityAttribute.rb +2 -2
- data/lib/adiwg/mdtranslator/writers/mdJson/sections/mdJson_source.rb +1 -0
- metadata +19 -4
@@ -0,0 +1,124 @@
|
|
1
|
+
# FGDC <<Class>> Source
|
2
|
+
# FGDC CSDGM writer output in XML
|
3
|
+
|
4
|
+
# History:
|
5
|
+
# Stan Smith 2017-12-18 original script
|
6
|
+
|
7
|
+
require_relative 'class_citation'
|
8
|
+
require_relative 'class_timePeriod'
|
9
|
+
|
10
|
+
module ADIWG
|
11
|
+
module Mdtranslator
|
12
|
+
module Writers
|
13
|
+
module Fgdc
|
14
|
+
|
15
|
+
class Source
|
16
|
+
|
17
|
+
def initialize(xml, hResponseObj)
|
18
|
+
@xml = xml
|
19
|
+
@hResponseObj = hResponseObj
|
20
|
+
end
|
21
|
+
|
22
|
+
def writeXML(hSource, aSourceCollection)
|
23
|
+
|
24
|
+
# skip if this source is already identified
|
25
|
+
unless hSource[:sourceId].nil?
|
26
|
+
return if aSourceCollection.include?(hSource[:sourceId])
|
27
|
+
aSourceCollection << hSource[:sourceId]
|
28
|
+
end
|
29
|
+
if hSource[:sourceId].nil?
|
30
|
+
@hResponseObj[:writerPass] = false
|
31
|
+
@hResponseObj[:writerMessages] << 'Source is missing source abbreviation (source id)'
|
32
|
+
end
|
33
|
+
|
34
|
+
@xml.tag!('srcinfo') do
|
35
|
+
|
36
|
+
# classes used
|
37
|
+
citationClass = Citation.new(@xml, @hResponseObj)
|
38
|
+
timePeriodClass = TimePeriod.new(@xml, @hResponseObj)
|
39
|
+
|
40
|
+
# source 2.5.1.1 (srccite) - source citation (required)
|
41
|
+
# <- resourceLineage.source.sourceCitation
|
42
|
+
unless hSource[:sourceCitation].empty?
|
43
|
+
@xml.tag!('srccite') do
|
44
|
+
citationClass.writeXML(hSource[:sourceCitation], [])
|
45
|
+
end
|
46
|
+
end
|
47
|
+
if hSource[:sourceCitation].empty?
|
48
|
+
@hResponseObj[:writerPass] = false
|
49
|
+
@hResponseObj[:writerMessages] << 'Source is missing citation'
|
50
|
+
end
|
51
|
+
|
52
|
+
# source 2.5.1.2 (srcscale) - source scale denominator
|
53
|
+
# <- resourceLineage.source.spatialResolution.scaleFactor
|
54
|
+
haveResolution = false
|
55
|
+
unless hSource[:spatialResolution].empty?
|
56
|
+
unless hSource[:spatialResolution].nil?
|
57
|
+
haveResolution = true
|
58
|
+
@xml.tag!('srcscale', hSource[:spatialResolution][:scaleFactor].to_s)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
if !haveResolution && @hResponseObj[:writerShowTags]
|
62
|
+
@xml.tag!('srcscale')
|
63
|
+
end
|
64
|
+
|
65
|
+
# source 2.5.1.3 (typesrc) - type of source media (required)
|
66
|
+
# <- resourceLineage.source.description
|
67
|
+
unless hSource[:description].nil?
|
68
|
+
@xml.tag!('typesrc', hSource[:description])
|
69
|
+
end
|
70
|
+
if hSource[:description].nil?
|
71
|
+
@hResponseObj[:writerPass] = false
|
72
|
+
@hResponseObj[:writerMessages] << 'Source is missing media type (description)'
|
73
|
+
end
|
74
|
+
|
75
|
+
# source 2.5.1.4 (srctime) - source time period (required)
|
76
|
+
# <- resourceLineage.source.scope.extents[0].temporalExtent[0].timePeriod
|
77
|
+
haveTime = false
|
78
|
+
unless hSource[:scope].empty?
|
79
|
+
unless hSource[:scope][:extents].empty?
|
80
|
+
unless hSource[:scope][:extents][0][:temporalExtents].empty?
|
81
|
+
unless hSource[:scope][:extents][0][:temporalExtents][0][:timePeriod].empty?
|
82
|
+
haveTime = true
|
83
|
+
hTimePeriod = hSource[:scope][:extents][0][:temporalExtents][0][:timePeriod]
|
84
|
+
@xml.tag!('srctime') do
|
85
|
+
timePeriodClass.writeXML(hTimePeriod, 'srccurr')
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
unless haveTime
|
92
|
+
@hResponseObj[:writerPass] = false
|
93
|
+
@hResponseObj[:writerMessages] << 'Source is missing time period'
|
94
|
+
end
|
95
|
+
|
96
|
+
# source 2.5.1.5 (srccitea) - source citation abbreviation (required)
|
97
|
+
# <- resourceLineage.source.sourceId
|
98
|
+
unless hSource[:sourceId].nil?
|
99
|
+
@xml.tag!('srccitea', hSource[:sourceId])
|
100
|
+
end
|
101
|
+
if hSource[:sourceId].nil?
|
102
|
+
@hResponseObj[:writerPass] = false
|
103
|
+
@hResponseObj[:writerMessages] << 'Source is missing citation abbreviation (id)'
|
104
|
+
end
|
105
|
+
|
106
|
+
# source 2.5.1.6 (srccontr) - source contribution (required)
|
107
|
+
# <- resourceLineage.source.description
|
108
|
+
unless hSource[:description].nil?
|
109
|
+
@xml.tag!('srccontr', hSource[:description])
|
110
|
+
end
|
111
|
+
if hSource[:sourceId].nil?
|
112
|
+
@hResponseObj[:writerPass] = false
|
113
|
+
@hResponseObj[:writerMessages] << 'Source is missing contribution (description)'
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
end # writeXML
|
119
|
+
end # Source
|
120
|
+
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -90,7 +90,7 @@ module ADIWG
|
|
90
90
|
end
|
91
91
|
if geoDescription.empty?
|
92
92
|
@hResponseObj[:writerPass] = false
|
93
|
-
@hResponseObj[:writerMessages] << 'Spatial Domain
|
93
|
+
@hResponseObj[:writerMessages] << 'Spatial Domain is missing geographic description'
|
94
94
|
end
|
95
95
|
|
96
96
|
# spatial domain 1.5.1 (bounding) - bounding box (required)
|
@@ -149,7 +149,7 @@ module ADIWG
|
|
149
149
|
end
|
150
150
|
if hBBox.empty?
|
151
151
|
@hResponseObj[:writerPass] = false
|
152
|
-
@hResponseObj[:writerMessages] << 'Spatial Domain
|
152
|
+
@hResponseObj[:writerMessages] << 'Spatial Domain is missing bounding box'
|
153
153
|
end
|
154
154
|
|
155
155
|
# spatial domain 1.5.2 (dsgpoly) - bounding polygon [] (required)
|
@@ -0,0 +1,177 @@
|
|
1
|
+
# FGDC <<Class>> SpatialOrganization
|
2
|
+
# FGDC CSDGM writer output in XML
|
3
|
+
|
4
|
+
# History:
|
5
|
+
# Stan Smith 2017-12-21 original script
|
6
|
+
|
7
|
+
module ADIWG
|
8
|
+
module Mdtranslator
|
9
|
+
module Writers
|
10
|
+
module Fgdc
|
11
|
+
|
12
|
+
class SpatialOrganization
|
13
|
+
|
14
|
+
def initialize(xml, hResponseObj)
|
15
|
+
@xml = xml
|
16
|
+
@hResponseObj = hResponseObj
|
17
|
+
end
|
18
|
+
|
19
|
+
def writeXML(hResourceInfo)
|
20
|
+
|
21
|
+
# spatial organization 3.1 (indspref) - Indirect Spatial Reference
|
22
|
+
# <- hResourceInfo.spatialReferenceSystems.systemIdentifier.identifier = 'indirect' (first)
|
23
|
+
haveIndirect = false
|
24
|
+
hResourceInfo[:spatialReferenceSystems].each do |hSystem|
|
25
|
+
unless hSystem[:systemIdentifier].empty?
|
26
|
+
if hSystem[:systemIdentifier][:identifier] == 'indirect'
|
27
|
+
unless hSystem[:systemIdentifier][:description].empty?
|
28
|
+
@xml.tag!('indspref', hSystem[:systemIdentifier][:description])
|
29
|
+
haveIndirect = true
|
30
|
+
break
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
if !haveIndirect && @hResponseObj[:writerShowTags]
|
36
|
+
@xml.tag!('indspref')
|
37
|
+
end
|
38
|
+
|
39
|
+
# spatial organization 3.2 (direct) - Direct Spatial Reference Method
|
40
|
+
# <- resourceInfo.spatialRepresentationTypes
|
41
|
+
# take first that match ['point' | 'vector' | 'grid']
|
42
|
+
direct = nil
|
43
|
+
hResourceInfo[:spatialRepresentationTypes].each do |type|
|
44
|
+
direct = 'Point' if type == 'point'
|
45
|
+
direct = 'Vector' if type == 'vector'
|
46
|
+
direct = 'Raster' if type == 'grid'
|
47
|
+
unless direct.nil?
|
48
|
+
@xml.tag!('direct', direct)
|
49
|
+
break
|
50
|
+
end
|
51
|
+
end
|
52
|
+
if direct.nil? && @hResponseObj[:writerShowTags]
|
53
|
+
@xml.tag!('direct')
|
54
|
+
end
|
55
|
+
|
56
|
+
# spatial organization 3.3 (ptvctinf) - point and vector object information
|
57
|
+
# <- resourceInfo.spatialRepresentations.vectorRepresentation (first)
|
58
|
+
if direct == 'Point' || direct == 'Vector'
|
59
|
+
hResourceInfo[:spatialRepresentations].each do |hSpaceRep|
|
60
|
+
unless hSpaceRep[:vectorRepresentation].empty?
|
61
|
+
hVectorRep = hSpaceRep[:vectorRepresentation]
|
62
|
+
unless hVectorRep.empty?
|
63
|
+
@xml.tag!('ptvctinf') do
|
64
|
+
if hVectorRep[:topologyLevel].nil?
|
65
|
+
|
66
|
+
# spatial organization point and vector object 3.3.1 (sdtsterm) - SDTS term []
|
67
|
+
hVectorRep[:vectorObject].each do |hVecObj|
|
68
|
+
@xml.tag!('sdtsterm') do
|
69
|
+
|
70
|
+
# spatial organization point and vector object 3.3.1.1 (sdtstype) - SDTS object type (requied)
|
71
|
+
@xml.tag!('sdtstype', hVecObj[:objectType])
|
72
|
+
|
73
|
+
# spatial organization point and vector object 3.3.1.2 (ptvctcnt) - SDTS count
|
74
|
+
unless hVecObj[:objectCount].nil?
|
75
|
+
@xml.tag!('ptvctcnt', hVecObj[:objectCount])
|
76
|
+
end
|
77
|
+
if hVecObj[:objectCount].nil?
|
78
|
+
@xml.tag!('ptvctcnt')
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
else
|
85
|
+
|
86
|
+
# point and vector object 3.3.2 (vpfterm) - VPF terms description
|
87
|
+
@xml.tag!('vpfterm') do
|
88
|
+
|
89
|
+
# VPF term 3.3.2.1 (vpflevel) - VPF topology level
|
90
|
+
@xml.tag!('vpflevel', hVectorRep[:topologyLevel])
|
91
|
+
|
92
|
+
# VPF term 3.3.2.2 (vpfinfo) - VPF point and vector object information []
|
93
|
+
hVectorRep[:vectorObject].each do |hVecObj|
|
94
|
+
@xml.tag!('vpfinfo') do
|
95
|
+
|
96
|
+
# spatial organization point and vector object 3.3.2.2.1 (vpftype) - VPF object type (requied)
|
97
|
+
@xml.tag!('vpftype', hVecObj[:objectType])
|
98
|
+
|
99
|
+
# spatial organization point and vector object 3.3.2.2.2 (ptvctcnt) - VPF object type
|
100
|
+
unless hVecObj[:objectCount].nil?
|
101
|
+
@xml.tag!('ptvctcnt', hVecObj[:objectCount])
|
102
|
+
end
|
103
|
+
if hVecObj[:objectCount].nil?
|
104
|
+
@xml.tag!('ptvctcnt')
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
end
|
114
|
+
break
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# spatial organization 3.4 (rastinfo) - point and vector object information
|
122
|
+
# <- resourceInfo.spatialRepresentations.gridRepresentation (first)
|
123
|
+
if direct == 'Raster'
|
124
|
+
hResourceInfo[:spatialRepresentations].each do |hSpaceRep|
|
125
|
+
if hSpaceRep[:gridRepresentation]
|
126
|
+
hGridRep = hSpaceRep[:gridRepresentation]
|
127
|
+
@xml.tag!('rastinfo') do
|
128
|
+
|
129
|
+
# spatial organization raster 3.4.1 (rasttype) - raster type (required)
|
130
|
+
unless hGridRep[:cellGeometry].empty?
|
131
|
+
@xml.tag!('rasttype', hGridRep[:cellGeometry])
|
132
|
+
end
|
133
|
+
if hGridRep[:cellGeometry].empty?
|
134
|
+
@hResponseObj[:writerPass] = false
|
135
|
+
@hResponseObj[:writerMessages] << 'Raster Spatial Organization is missing raster type'
|
136
|
+
end
|
137
|
+
|
138
|
+
# spatial organization raster 3.4.2 (rowcount) - row count
|
139
|
+
hGridRep[:dimension].each do |hDimension|
|
140
|
+
if hDimension[:dimensionType] == 'row'
|
141
|
+
unless hDimension[:dimensionSize].nil?
|
142
|
+
@xml.tag!('rowcount', hDimension[:dimensionSize])
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
# spatial organization raster 3.4.2 (colcount) - column count
|
148
|
+
hGridRep[:dimension].each do |hDimension|
|
149
|
+
if hDimension[:dimensionType] == 'column'
|
150
|
+
unless hDimension[:dimensionSize].nil?
|
151
|
+
@xml.tag!('colcount', hDimension[:dimensionSize])
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
# spatial organization raster 3.4.2 (vrtcount) - depth count
|
157
|
+
hGridRep[:dimension].each do |hDimension|
|
158
|
+
if hDimension[:dimensionType] == 'vertical'
|
159
|
+
unless hDimension[:dimensionSize].nil?
|
160
|
+
@xml.tag!('vrtcount', hDimension[:dimensionSize])
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
end
|
166
|
+
break
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
end # writeXML
|
172
|
+
end # SpatialOrganization
|
173
|
+
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# FGDC <<Class>> Taxonomy
|
2
|
+
# FGDC CSDGM writer output in XML
|
3
|
+
|
4
|
+
# History:
|
5
|
+
# Stan Smith 2017-12-12 original script
|
6
|
+
|
7
|
+
require_relative 'class_taxonomyKeywords'
|
8
|
+
require_relative 'class_taxonomySystem'
|
9
|
+
require_relative 'class_taxonomyClassification'
|
10
|
+
|
11
|
+
module ADIWG
|
12
|
+
module Mdtranslator
|
13
|
+
module Writers
|
14
|
+
module Fgdc
|
15
|
+
|
16
|
+
class Taxonomy
|
17
|
+
|
18
|
+
def initialize(xml, hResponseObj)
|
19
|
+
@xml = xml
|
20
|
+
@hResponseObj = hResponseObj
|
21
|
+
end
|
22
|
+
|
23
|
+
def writeXML(hTaxonomy, aKeywords)
|
24
|
+
|
25
|
+
# classes used
|
26
|
+
keywordClass = TaxonomyKeyword.new(@xml, @hResponseObj)
|
27
|
+
taxSystemClass = TaxonomySystem.new(@xml, @hResponseObj)
|
28
|
+
taxClassClass = TaxonomyClassification.new(@xml, @hResponseObj)
|
29
|
+
|
30
|
+
# taxonomy bio (keywtax) - taxonomic keywords (required)
|
31
|
+
unless aKeywords.empty?
|
32
|
+
keywordClass.writeXML(aKeywords)
|
33
|
+
end
|
34
|
+
if aKeywords.empty? && @hResponseObj[:writerShowTags]
|
35
|
+
@xml.tag!('keywtax')
|
36
|
+
end
|
37
|
+
|
38
|
+
# taxonomy bio (taxonsys) - taxonomic system
|
39
|
+
# section is not required for fgdc, but is required by mdJson
|
40
|
+
# so section will always be present
|
41
|
+
@xml.tag!('taxonsys') do
|
42
|
+
taxSystemClass.writeXML(hTaxonomy)
|
43
|
+
end
|
44
|
+
|
45
|
+
# taxonomy (taxongen) - general scope
|
46
|
+
unless hTaxonomy[:generalScope].nil?
|
47
|
+
@xml.tag!('taxongen', hTaxonomy[:generalScope])
|
48
|
+
end
|
49
|
+
if hTaxonomy[:generalScope].nil? && @hResponseObj[:writerShowTags]
|
50
|
+
@xml.tag!('taxongen')
|
51
|
+
end
|
52
|
+
|
53
|
+
# taxonomy bio (taxoncl) - taxonomic classification {required}
|
54
|
+
unless hTaxonomy[:taxonClass].empty?
|
55
|
+
@xml.tag!('taxoncl') do
|
56
|
+
taxClassClass.writeXML(hTaxonomy[:taxonClass])
|
57
|
+
end
|
58
|
+
end
|
59
|
+
if hTaxonomy[:taxonClass].empty?
|
60
|
+
@hResponseObj[:writerPass] = false
|
61
|
+
@hResponseObj[:writerMessages] << 'Taxonomy is missing taxonomic classification'
|
62
|
+
end
|
63
|
+
|
64
|
+
end # writeXML
|
65
|
+
end # Taxonomy
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# FGDC <<Class>> TaxonomyClassification
|
2
|
+
# FGDC CSDGM writer output in XML
|
3
|
+
|
4
|
+
# History:
|
5
|
+
# Stan Smith 2017-12-13 original script
|
6
|
+
|
7
|
+
require_relative 'class_taxonomyClassification'
|
8
|
+
|
9
|
+
module ADIWG
|
10
|
+
module Mdtranslator
|
11
|
+
module Writers
|
12
|
+
module Fgdc
|
13
|
+
|
14
|
+
class TaxonomyClassification
|
15
|
+
|
16
|
+
def initialize(xml, hResponseObj)
|
17
|
+
@xml = xml
|
18
|
+
@hResponseObj = hResponseObj
|
19
|
+
end
|
20
|
+
|
21
|
+
def writeXML(hClass)
|
22
|
+
|
23
|
+
# classes used
|
24
|
+
taxClassClass = TaxonomyClassification.new(@xml, @hResponseObj)
|
25
|
+
|
26
|
+
# taxonomy bio (taxonrn) - taxon rank (required)
|
27
|
+
unless hClass[:taxonRank].nil?
|
28
|
+
@xml.tag!('taxonrn', hClass[:taxonRank])
|
29
|
+
end
|
30
|
+
if hClass[:taxonRank].nil?
|
31
|
+
@hResponseObj[:writerPass] = false
|
32
|
+
@hResponseObj[:writerMessages] << 'Taxonomic Classification is missing taxon rank'
|
33
|
+
end
|
34
|
+
|
35
|
+
# taxonomy bio (taxonrv) - taxon value (required)
|
36
|
+
unless hClass[:taxonValue].nil?
|
37
|
+
@xml.tag!('taxonrv', hClass[:taxonValue])
|
38
|
+
end
|
39
|
+
if hClass[:taxonValue].nil?
|
40
|
+
@hResponseObj[:writerPass] = false
|
41
|
+
@hResponseObj[:writerMessages] << 'Taxonomic Classification is missing latin name'
|
42
|
+
end
|
43
|
+
|
44
|
+
# taxonomy bio (common) - taxon value common names []
|
45
|
+
hClass[:commonNames].each do |hName|
|
46
|
+
@xml.tag!('common', hName)
|
47
|
+
end
|
48
|
+
if hClass[:commonNames].empty? && @hResponseObj[:writerShowTags]
|
49
|
+
@xml.tag!('common')
|
50
|
+
end
|
51
|
+
|
52
|
+
# taxonomy bio (taxoncl) - taxonomic sub-classification []
|
53
|
+
hClass[:subClasses].each do |hSubClass|
|
54
|
+
@xml.tag!('taxoncl') do
|
55
|
+
taxClassClass.writeXML(hSubClass)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end # writeXML
|
60
|
+
end # TaxonomyClassification
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|