adiwg-mdtranslator 2.4.0 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +51 -1
  3. data/lib/adiwg/mdtranslator/internal/internal_metadata_obj.rb +33 -2
  4. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_attribute.rb +68 -35
  5. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_codeSet.rb +66 -0
  6. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_entity.rb +7 -1
  7. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_entityOverview.rb +10 -1
  8. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_enumerated.rb +38 -19
  9. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_range.rb +68 -19
  10. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_transferInfo.rb +3 -0
  11. data/lib/adiwg/mdtranslator/readers/mdJson/mdJson_reader.rb +4 -2
  12. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_domain.rb +87 -79
  13. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_entity.rb +150 -115
  14. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_entityAttribute.rb +184 -113
  15. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_valueRange.rb +56 -0
  16. data/lib/adiwg/mdtranslator/version.rb +7 -1
  17. data/lib/adiwg/mdtranslator/writers/html/sections/html_body.rb +3 -3
  18. data/lib/adiwg/mdtranslator/writers/html/sections/html_dataDictionary.rb +6 -6
  19. data/lib/adiwg/mdtranslator/writers/html/sections/html_domain.rb +74 -38
  20. data/lib/adiwg/mdtranslator/writers/html/sections/html_ellipsoidParameters.rb +68 -0
  21. data/lib/adiwg/mdtranslator/writers/html/sections/html_entity.rb +130 -76
  22. data/lib/adiwg/mdtranslator/writers/html/sections/html_entityAttribute.rb +78 -0
  23. data/lib/adiwg/mdtranslator/writers/html/sections/html_identifier.rb +1 -1
  24. data/lib/adiwg/mdtranslator/writers/html/sections/html_obliqueLinePoint.rb +37 -0
  25. data/lib/adiwg/mdtranslator/writers/html/sections/html_projectionParameters.rb +229 -0
  26. data/lib/adiwg/mdtranslator/writers/html/sections/html_referenceSystemParameters.rb +65 -0
  27. data/lib/adiwg/mdtranslator/writers/html/sections/html_spatialReference.rb +19 -1
  28. data/lib/adiwg/mdtranslator/writers/html/sections/html_verticalDatumParameters.rb +69 -0
  29. data/lib/adiwg/mdtranslator/writers/iso19110/classes/class_address.rb +103 -103
  30. data/lib/adiwg/mdtranslator/writers/iso19110/classes/class_citation.rb +185 -0
  31. data/lib/adiwg/mdtranslator/writers/iso19110/classes/class_date.rb +60 -0
  32. data/lib/adiwg/mdtranslator/writers/iso19110/classes/class_definitionReference.rb +45 -0
  33. data/lib/adiwg/mdtranslator/writers/iso19110/classes/class_domain.rb +107 -0
  34. data/lib/adiwg/mdtranslator/writers/iso19110/classes/class_fcFeatureCatalogue.rb +187 -187
  35. data/lib/adiwg/mdtranslator/writers/iso19110/classes/class_featureAttribute.rb +123 -117
  36. data/lib/adiwg/mdtranslator/writers/iso19110/classes/class_featureType.rb +155 -141
  37. data/lib/adiwg/mdtranslator/writers/iso19110/classes/class_gcoDateTime.rb +48 -0
  38. data/lib/adiwg/mdtranslator/writers/iso19110/classes/class_listedValue.rb +54 -55
  39. data/lib/adiwg/mdtranslator/writers/iso19110/classes/class_mdIdentifier.rb +56 -0
  40. data/lib/adiwg/mdtranslator/writers/iso19110/classes/class_series.rb +63 -0
  41. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_attributeGroup.rb +51 -50
  42. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_citation.rb +181 -180
  43. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_crs.rb +96 -0
  44. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_ellipsoidParameters.rb +62 -0
  45. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_keyword.rb +54 -54
  46. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_miMetadata.rb +301 -298
  47. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_obliqueLinePoint.rb +53 -0
  48. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_projectionParameters.rb +229 -0
  49. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_referenceSystem.rb +49 -32
  50. data/lib/adiwg/mdtranslator/writers/mdJson/sections/mdJson_domain.rb +5 -2
  51. data/lib/adiwg/mdtranslator/writers/mdJson/sections/mdJson_entity.rb +7 -1
  52. data/lib/adiwg/mdtranslator/writers/mdJson/sections/mdJson_entityAttribute.rb +18 -2
  53. data/lib/adiwg/mdtranslator/writers/mdJson/sections/mdJson_valueRange.rb +28 -0
  54. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_budget.rb +33 -13
  55. metadata +22 -4
  56. data/lib/adiwg/mdtranslator/readers/mdJson/version.rb +0 -16
@@ -0,0 +1,96 @@
1
+ # ISO <<Class>> MD_CRS
2
+ # writer
3
+ # 19115-2 output for ISO 19115-2 XML
4
+
5
+ # History:
6
+ # Stan Smith 2017-10-26 original script
7
+
8
+ require_relative 'class_rsIdentifier'
9
+ require_relative 'class_ellipsoidParameters'
10
+ require_relative 'class_projectionParameters'
11
+
12
+ module ADIWG
13
+ module Mdtranslator
14
+ module Writers
15
+ module Iso19115_2
16
+
17
+ class MD_CRS
18
+
19
+ def initialize(xml, hResponseObj)
20
+ @xml = xml
21
+ @hResponseObj = hResponseObj
22
+ end
23
+
24
+ def writeXML(hParamSet)
25
+
26
+ # classes used
27
+ idClass = RS_Identifier.new(@xml, @hResponseObj)
28
+ ellipsoidClass = MD_EllipsoidParameters.new(@xml, @hResponseObj)
29
+ projectionClass = MD_ProjectionParameters.new(@xml, @hResponseObj)
30
+
31
+ # projection identifier {rsIdentifier}
32
+ unless hParamSet[:projection].empty?
33
+ hIdentifier = hParamSet[:projection][:projectionIdentifier]
34
+ unless hIdentifier.empty?
35
+ @xml.tag!('gmd:projection') do
36
+ idClass.writeXML(hIdentifier)
37
+ end
38
+ end
39
+ end
40
+ if hParamSet[:projection].empty? && @hResponseObj[:writerShowTags]
41
+ @xml.tag!('gmd:projection')
42
+ end
43
+
44
+ # ellipsoid identifier {rsIdentifier}
45
+ unless hParamSet[:ellipsoid].empty?
46
+ hIdentifier = hParamSet[:ellipsoid][:ellipsoidIdentifier]
47
+ unless hIdentifier.empty?
48
+ @xml.tag!('gmd:ellipsoid') do
49
+ idClass.writeXML(hIdentifier)
50
+ end
51
+ end
52
+ end
53
+ if hParamSet[:ellipsoid] && @hResponseObj[:writerShowTags]
54
+ @xml.tag!('gmd:ellipsoid')
55
+ end
56
+
57
+ # vertical datum identifier {rsIdentifier}
58
+ unless hParamSet[:verticalDatum].empty?
59
+ hIdentifier = hParamSet[:verticalDatum][:datumIdentifier]
60
+ unless hIdentifier.empty?
61
+ @xml.tag!('gmd:datum') do
62
+ idClass.writeXML(hIdentifier)
63
+ end
64
+ end
65
+ end
66
+ if hParamSet[:verticalDatum].empty? && @hResponseObj[:writerShowTags]
67
+ @xml.tag!('gmd:datum')
68
+ end
69
+
70
+ # ellipsoid parameters
71
+ unless hParamSet[:ellipsoid].empty?
72
+ @xml.tag!('gmd:ellipsoidParameters') do
73
+ ellipsoidClass.writeXML(hParamSet[:ellipsoid])
74
+ end
75
+ end
76
+ if hParamSet[:ellipsoid].empty? && @hResponseObj[:writerShowTags]
77
+ @xml.tag!('gmd:ellipsoidParameters')
78
+ end
79
+
80
+ # projection parameters
81
+ unless hParamSet[:projection].empty?
82
+ @xml.tag!('gmd:projectionParameters') do
83
+ projectionClass.writeXML(hParamSet[:projection])
84
+ end
85
+ end
86
+ if hParamSet[:projection].empty? && @hResponseObj[:writerShowTags]
87
+ @xml.tag!('gmd:projectionParameters')
88
+ end
89
+
90
+ end # writeXML
91
+ end # MD_CRS class
92
+
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,62 @@
1
+ # ISO <<Class>> MD_EllipsoidParameters
2
+ # writer
3
+ # 19115-2 output for ISO 19115-2 XML
4
+
5
+ # History:
6
+ # Stan Smith 2017-10-26 original script
7
+
8
+ module ADIWG
9
+ module Mdtranslator
10
+ module Writers
11
+ module Iso19115_2
12
+
13
+ class MD_EllipsoidParameters
14
+
15
+ def initialize(xml, hResponseObj)
16
+ @xml = xml
17
+ @hResponseObj = hResponseObj
18
+ end
19
+
20
+ def writeXML(hEllipsoid)
21
+
22
+ @xml.tag!('gmd:MD_EllipsoidParameters') do
23
+
24
+ # ellipsoid parameters - semi major axis {real}
25
+ r = hEllipsoid[:semiMajorAxis]
26
+ unless r.nil?
27
+ @xml.tag!('gmd:semiMajorAxis') do
28
+ @xml.tag!('gco:real', r.to_s)
29
+ end
30
+ end
31
+ if r.nil? && @hResponseObj[:writerShowTags]
32
+ @xml.tag!('gmd:semiMajorAxis')
33
+ end
34
+
35
+ # ellipsoid parameters - axis units
36
+ s = hEllipsoid[:axisUnits]
37
+ unless s.nil?
38
+ @xml.tag!('gmd:axisUnits', s)
39
+ end
40
+ if s.nil? && @hResponseObj[:writerShowTags]
41
+ @xml.tag!('gmd:axisUnits')
42
+ end
43
+
44
+ # ellipsoid parameters - denominator of flattening ratio {real}
45
+ r = hEllipsoid[:denominatorOfFlatteningRatio]
46
+ unless r.nil?
47
+ @xml.tag!('gmd:denominatorOfFlatteningRatio') do
48
+ @xml.tag!('gco:real', r.to_s)
49
+ end
50
+ end
51
+ if r.nil? && @hResponseObj[:writerShowTags]
52
+ @xml.tag!('gmd:denominatorOfFlatteningRatio')
53
+ end
54
+
55
+ end # gmd:MD_EllipsoidParameters
56
+ end # writeXML
57
+ end # MD_ProjectionParameters class
58
+
59
+ end
60
+ end
61
+ end
62
+ end
@@ -16,68 +16,68 @@ require_relative 'class_codelist'
16
16
  require_relative 'class_citation'
17
17
 
18
18
  module ADIWG
19
- module Mdtranslator
20
- module Writers
21
- module Iso19115_2
19
+ module Mdtranslator
20
+ module Writers
21
+ module Iso19115_2
22
22
 
23
- class MD_Keywords
23
+ class MD_Keywords
24
24
 
25
- def initialize(xml, hResponseObj)
26
- @xml = xml
27
- @hResponseObj = hResponseObj
28
- end
25
+ def initialize(xml, hResponseObj)
26
+ @xml = xml
27
+ @hResponseObj = hResponseObj
28
+ end
29
29
 
30
- def writeXML(hKeyword)
30
+ def writeXML(hKeyword)
31
31
 
32
- # classes used
33
- codelistClass = MD_Codelist.new(@xml, @hResponseObj)
34
- citationClass = CI_Citation.new(@xml, @hResponseObj)
32
+ # classes used
33
+ codelistClass = MD_Codelist.new(@xml, @hResponseObj)
34
+ citationClass = CI_Citation.new(@xml, @hResponseObj)
35
35
 
36
- @xml.tag!('gmd:MD_Keywords') do
36
+ @xml.tag!('gmd:MD_Keywords') do
37
37
 
38
- # keyword - keyword (required)
39
- aKeyObjects = hKeyword[:keywords]
40
- unless aKeyObjects.empty?
41
- aKeyObjects.each do |hKeyObj|
42
- keyword = hKeyObj[:keyword]
43
- unless keyword.nil?
44
- @xml.tag!('gmd:keyword') do
45
- @xml.tag!('gco:CharacterString', keyword)
46
- end
47
- end
48
- end
49
- end
50
- if aKeyObjects.empty?
51
- @xml.tag!('gmd:keyword', {'gco:nilReason' => 'missing'})
52
- end
38
+ # keyword - keyword (required)
39
+ aKeyObjects = hKeyword[:keywords]
40
+ unless aKeyObjects.empty?
41
+ aKeyObjects.each do |hKeyObj|
42
+ keyword = hKeyObj[:keyword]
43
+ unless keyword.nil?
44
+ @xml.tag!('gmd:keyword') do
45
+ @xml.tag!('gco:CharacterString', keyword)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ if aKeyObjects.empty?
51
+ @xml.tag!('gmd:keyword', {'gco:nilReason' => 'missing'})
52
+ end
53
53
 
54
- # keyword - type {MD_KeywordTypeCode}
55
- s = hKeyword[:keywordType]
56
- unless s.nil?
57
- @xml.tag!('gmd:type') do
58
- codelistClass.writeXML('gmd', 'iso_keywordType',s)
59
- end
60
- end
61
- if s.nil? && @hResponseObj[:writerShowTags]
62
- @xml.tag!('gmd:type')
63
- end
54
+ # keyword - type {MD_KeywordTypeCode}
55
+ s = hKeyword[:keywordType]
56
+ unless s.nil?
57
+ @xml.tag!('gmd:type') do
58
+ codelistClass.writeXML('gmd', 'iso_keywordType', s)
59
+ end
60
+ end
61
+ if s.nil? && @hResponseObj[:writerShowTags]
62
+ @xml.tag!('gmd:type')
63
+ end
64
64
 
65
- # keyword - thesaurus {MD_KeywordTypeCode}
66
- hCitation = hKeyword[:thesaurus]
67
- unless hCitation.empty?
68
- @xml.tag!('gmd:thesaurusName') do
69
- citationClass.writeXML(hCitation)
70
- end
71
- end
72
- if hCitation.empty? && @hResponseObj[:writerShowTags]
73
- @xml.tag!('gmd:thesaurusName')
74
- end
65
+ # keyword - thesaurus {MD_KeywordTypeCode}
66
+ hCitation = hKeyword[:thesaurus]
67
+ unless hCitation.empty?
68
+ @xml.tag!('gmd:thesaurusName') do
69
+ citationClass.writeXML(hCitation)
70
+ end
71
+ end
72
+ if hCitation.empty? && @hResponseObj[:writerShowTags]
73
+ @xml.tag!('gmd:thesaurusName')
74
+ end
75
75
 
76
- end # gmd:MD_Keywords tag
77
- end # writeXML
78
- end # MD_Keywords class
76
+ end # gmd:MD_Keywords tag
77
+ end # writeXML
78
+ end # MD_Keywords class
79
79
 
80
- end
81
- end
82
- end
80
+ end
81
+ end
82
+ end
83
83
  end
@@ -51,302 +51,305 @@ require_relative 'class_maintenance'
51
51
  require_relative 'class_gcoDateTime'
52
52
 
53
53
  module ADIWG
54
- module Mdtranslator
55
- module Writers
56
- module Iso19115_2
57
-
58
- class MI_Metadata
59
-
60
- def initialize(xml, hResponseObj)
61
- @xml = xml
62
- @hResponseObj = hResponseObj
63
- end
64
-
65
- def writeXML(intObj)
66
-
67
- # classes used
68
- intMetadataClass = InternalMetadata.new
69
- codelistClass = MD_Codelist.new(@xml, @hResponseObj)
70
- partyClass = CI_ResponsibleParty.new(@xml, @hResponseObj)
71
- hierarchyClass = Hierarchy.new(@xml, @hResponseObj)
72
- localeClass = PT_Locale.new(@xml, @hResponseObj)
73
- representationClass = SpatialRepresentation.new(@xml, @hResponseObj)
74
- systemClass = MD_ReferenceSystem.new(@xml, @hResponseObj)
75
- extensionClass = MD_MetadataExtensionInformation.new(@xml, @hResponseObj)
76
- dataIdClass = MD_DataIdentification.new(@xml, @hResponseObj)
77
- coverageClass = CoverageDescription.new(@xml, @hResponseObj)
78
- distClass = MD_Distribution.new(@xml, @hResponseObj)
79
- dqClass = DQ_DataQuality.new(@xml, @hResponseObj)
80
- maintenanceClass = MD_MaintenanceInformation.new(@xml, @hResponseObj)
81
- dateTimeClass = GcoDateTime.new(@xml, @hResponseObj)
82
-
83
- # create shortcuts to sections of internal object
84
- hMetadata = intObj[:metadata]
85
- hMetaInfo = hMetadata[:metadataInfo]
86
- hResInfo = hMetadata[:resourceInfo]
87
- aAssocRes = hMetadata[:associatedResources]
88
- version = @hResponseObj[:translatorVersion]
89
-
90
- # document head
91
- metadata = @xml.instruct! :xml, encoding: 'UTF-8'
92
- @xml.comment!('ISO 19115-2 METADATA')
93
- @xml.comment!('Metadata file was constructed using the ADIwg mdTranslator, http://mdtranslator.adiwg.org')
94
- @xml.comment!('mdTranslator software is an open-source project of the Alaska Data Integration working group (ADIwg)')
95
- @xml.comment!('mdTranslator and other metadata tools are available at https://github.com/adiwg')
96
- @xml.comment!('ADIwg is not responsible for the content of this metadata record')
97
- @xml.comment!('This metadata record was generated by mdTranslator ' + version + ' at ' + Time.now.to_s)
98
-
99
- # MI_Metadata
100
- @xml.tag!('gmi:MI_Metadata',
101
- {'xmlns:gmi' => 'http://www.isotc211.org/2005/gmi',
102
- 'xmlns:gmd' => 'http://www.isotc211.org/2005/gmd',
103
- 'xmlns:gco' => 'http://www.isotc211.org/2005/gco',
104
- 'xmlns:gml' => 'http://www.opengis.net/gml/3.2',
105
- 'xmlns:gsr' => 'http://www.isotc211.org/2005/gsr',
106
- 'xmlns:gss' => 'http://www.isotc211.org/2005/gss',
107
- 'xmlns:gst' => 'http://www.isotc211.org/2005/gst',
108
- 'xmlns:gmx' => 'http://www.isotc211.org/2005/gmx',
109
- 'xmlns:gfc' => 'http://www.isotc211.org/2005/gfc',
110
- 'xmlns:srv' => 'http://www.isotc211.org/2005/srv',
111
- 'xmlns:xlink' => 'http://www.w3.org/1999/xlink',
112
- 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
113
- 'xsi:schemaLocation' => 'http://www.isotc211.org/2005/gmi ftp://ftp.ncddc.noaa.gov/pub/Metadata/Online_ISO_Training/Intro_to_ISO/schemas/ISObio/schema.xsd'}) do
114
-
115
- # remote schema location - for deployment
116
- # ftp://ftp.ncddc.noaa.gov/pub/Metadata/Online_ISO_Training/Intro_to_ISO/schemas/ISObio/schema.xsd
117
- # local schema location - for development
118
- # C:\Users\StanSmith\Projects\ISO\19115\NOAA\schema.xsd
119
-
120
- # metadata information - file identifier (default: UUID)
121
- s = hMetaInfo[:metadataIdentifier][:identifier]
122
- @xml.tag!('gmd:fileIdentifier') do
123
- unless s.nil?
124
- @xml.tag!('gco:CharacterString', s)
125
- end
126
- if s.nil?
127
- @xml.tag!('gco:CharacterString', UUIDTools::UUID.random_create.to_s)
128
- end
129
- end
130
-
131
- # metadata information - metadata language ('eng; USA')
132
- @xml.tag!('gmd:language') do
133
- @xml.tag!('gco:CharacterString', 'eng; USA')
134
- end
135
-
136
- # metadata information - metadata character ('utf-8')
137
- @xml.tag!('gmd:characterSet') do
138
- codelistClass.writeXML('gmd', 'iso_characterSet', 'UTF-8')
139
- end
140
-
141
- # metadata information - parent identifier
142
- s = nil
143
- hParent = hMetaInfo[:parentMetadata]
144
- unless hParent.empty?
145
- s = hParent[:title]
146
- end
147
- unless s.nil?
148
- @xml.tag!('gmd:parentIdentifier') do
149
- @xml.tag!('gco:CharacterString', s)
150
- end
151
- end
152
- if s.nil? && @hResponseObj[:writerShowTags]
153
- @xml.tag!('gmd:parentIdentifier')
154
- end
155
-
156
- # metadata information - hierarchy level [] {MD_scopeCode}
157
- # metadata information - hierarchy level Name [] {string}
158
- # hierarchy comes from resourceInfo < resourceType []
159
- # pass entire array to hierarchy
160
- # all hierarchyLevel tags must precede the hierarchyLevelName tags
161
- aResTypes = hResInfo[:resourceTypes]
162
- unless aResTypes.empty?
163
- hierarchyClass.writeXML(aResTypes)
164
- end
165
- if aResTypes.empty? && @hResponseObj[:writerShowTags]
166
- @xml.tag!('gmd:hierarchyLevel')
167
- @xml.tag!('gmd:hierarchyLevelName')
168
- end
169
-
170
- # metadata information - metadata contacts (required)
171
- # [{CI_ResponsibleParty}]
172
- aRParties = hMetaInfo[:metadataContacts]
173
- aRParties.each do |hRParty|
174
- role = hRParty[:roleName]
175
- aParties = hRParty[:parties]
176
- aParties.each do |hParty|
177
- @xml.tag!('gmd:contact') do
178
- partyClass.writeXML(role, hParty)
179
- end
180
- end
181
- end
182
- if aRParties.empty?
183
- @xml.tag!('gmd:contact', {'gco:nilReason' => 'missing'})
184
- end
185
-
186
- # metadata information - date stamp (required) {default: now()}
187
- hCreateDate = {}
188
- hCreateDate[:date] = DateTime.now
189
- hCreateDate[:dateResolution] = 'YMD'
190
- aDates = hMetaInfo[:metadataDates]
191
- aDates.each do |hDate|
192
- if hDate[:dateType] == 'creation'
193
- hCreateDate = hDate
194
- end
195
- end
196
- @xml.tag!('gmd:dateStamp') do
197
- dateTimeClass.writeXML(hCreateDate)
198
- end
199
-
200
- # metadata information - metadata standard name (default)
201
- @xml.tag!('gmd:metadataStandardName') do
202
- @xml.tag!('gco:CharacterString', 'ISO 19115-2')
203
- end
204
-
205
- # metadata information - metadata standard version (default)
206
- @xml.tag!('gmd:metadataStandardVersion') do
207
- @xml.tag!('gco:CharacterString', 'ISO 19115-2:2009(E)')
208
- end
209
-
210
- # metadata information - metadata linkage
211
- s = nil
212
- unless hMetaInfo[:metadataLinkages].empty?
213
- hLinkage = hMetaInfo[:metadataLinkages][0]
214
- s = hLinkage[:olResURI]
215
- @xml.tag!('gmd:dataSetURI') do
216
- @xml.tag!('gco:CharacterString', s)
217
- end
218
- end
219
- if s.nil? && @hResponseObj[:writerShowTags]
220
- @xml.tag!('gmd:dataSetURI')
221
- end
222
-
223
- # metadata information - locale []
224
- aLocales = hMetaInfo[:otherMetadataLocales]
225
- unless hMetaInfo[:defaultMetadataLocale].empty?
226
- aLocales.insert(0, hMetaInfo[:defaultMetadataLocale])
227
- end
228
- aLocales.each do |hLocale|
229
- @xml.tag!('gmd:locale') do
230
- localeClass.writeXML(hLocale)
231
- end
232
- end
233
- if aLocales.empty? && @hResponseObj[:writerShowTags]
234
- @xml.tag!('gmd:locale')
235
- end
236
-
237
- # metadata information - spatial representation []
238
- aReps = hResInfo[:spatialRepresentations]
239
- aReps.each do |hRep|
240
- @xml.tag!('gmd:spatialRepresentationInfo') do
241
- representationClass.writeXML(hRep)
242
- end
243
- end
244
- if aReps.empty? && @hResponseObj[:writerShowTags]
245
- @xml.tag!('gmd:spatialRepresentationInfo')
246
- end
247
-
248
- # metadata information - reference system []
249
- aSystems = hResInfo[:spatialReferenceSystems]
250
- aSystems.each do |hSystem|
251
- @xml.tag!('gmd:referenceSystemInfo') do
252
- systemClass.writeXML(hSystem)
253
- end
254
- end
255
- if aSystems.empty? && @hResponseObj[:writerShowTags]
256
- @xml.tag!('gmd:referenceSystemInfo')
257
- end
258
-
259
- # metadata information - metadata extension info
260
- # add biological profile to all metadata records
261
- intBio = intMetadataClass.newMetadataExtension
262
- intBio[:name] = 'Taxonomy System'
263
- intBio[:shortName] = 'TaxonSys'
264
- intBio[:definition] = 'Documentation of taxonomic sources, procedures, and treatments'
265
- intBio[:obligation] = 'optional'
266
- intBio[:dataType] = 'class'
267
- intBio[:maxOccurrence] = '1'
268
- intBio[:parentEntities] << 'MD_Identification'
269
- intBio[:rule] = 'New Metadata section as a class to MD_Identification'
270
- intBio[:rationales] << 'The set of data elements contained within this class element ' +
271
- 'represents an attempt to provide better documentation of ' +
272
- 'taxonomic sources, procedures, and treatments.'
273
- intBio[:sourceOrganization] = 'National Biological Information Infrastructure'
274
- intBio[:sourceURI] = 'https://www2.usgs.gov/core_science_systems/Access/p1111-1.html'
275
- intBio[:sourceRole] = 'author'
276
-
277
- @xml.tag!('gmd:metadataExtensionInfo') do
278
- extensionClass.writeXML(intBio)
279
- end
280
-
281
- # ###################### Begin Data Identification #####################
282
-
283
- # metadata information - identification info - required
284
- unless hResInfo.empty?
285
- @xml.tag!('gmd:identificationInfo') do
286
- dataIdClass.writeXML(hResInfo, aAssocRes)
287
- end
288
- end
289
- if hResInfo.empty?
290
- @xml.tag!('gmd:identificationInfo', {'gco:nilReason' => 'missing'})
291
- end
292
-
293
- # ###################### End Data Identification #######################
294
-
295
- # metadata information - coverageDescription []
296
- aItems = hResInfo[:coverageDescriptions]
297
- aItems.each do |hItem|
298
- @xml.tag!('gmd:contentInfo') do
299
- coverageClass.writeXML(hItem)
300
- end
301
- end
302
- if aItems.empty? && @hResponseObj[:writerShowTags]
303
- @xml.tag!('gmd:contentInfo')
304
- end
305
-
306
- # metadata information - distribution info [0]
307
- aDistInfo = hMetadata[:distributorInfo]
308
- unless aDistInfo.empty?
309
- hDistInfo = aDistInfo[0]
310
- unless hDistInfo.empty?
311
- @xml.tag!('gmd:distributionInfo') do
312
- distClass.writeXML(hDistInfo)
313
- end
314
- end
315
- end
316
- if aDistInfo.empty? && @hResponseObj[:writerShowTags]
317
- @xml.tag!('gmd:distributionInfo')
318
- end
319
-
320
- # metadata information - data quality info []
321
- aDQInfo = hMetadata[:lineageInfo]
322
- aDQInfo.each do |hDQInfo|
323
- @xml.tag!('gmd:dataQualityInfo') do
324
- dqClass.writeXML(hDQInfo)
325
- end
326
- end
327
- if aDQInfo.empty? && @hResponseObj[:writerShowTags]
328
- @xml.tag!('gmd:dataQualityInfo')
329
- end
330
-
331
- # metadata information - metadata maintenance
332
- hMaintenance = hMetaInfo[:metadataMaintenance]
333
- unless hMaintenance.empty?
334
- @xml.tag!('gmd:metadataMaintenance') do
335
- maintenanceClass.writeXML(hMaintenance)
336
- end
337
- end
338
- if hMaintenance.empty? && @hResponseObj[:writerShowTags]
339
- @xml.tag!('gmd:metadataMaintenance')
340
- end
341
-
342
- end # gmi:MI_Metadata tag
343
-
344
- return metadata
345
-
346
- end # writeXML
347
- end # MI_Metadata class
348
-
349
- end
350
- end
351
- end
54
+ module Mdtranslator
55
+ module Writers
56
+ module Iso19115_2
57
+
58
+ class MI_Metadata
59
+
60
+ def initialize(xml, hResponseObj)
61
+ @xml = xml
62
+ @hResponseObj = hResponseObj
63
+ end
64
+
65
+ def writeXML(intObj)
66
+
67
+ # classes used
68
+ intMetadataClass = InternalMetadata.new
69
+ codelistClass = MD_Codelist.new(@xml, @hResponseObj)
70
+ partyClass = CI_ResponsibleParty.new(@xml, @hResponseObj)
71
+ hierarchyClass = Hierarchy.new(@xml, @hResponseObj)
72
+ localeClass = PT_Locale.new(@xml, @hResponseObj)
73
+ representationClass = SpatialRepresentation.new(@xml, @hResponseObj)
74
+ systemClass = MD_ReferenceSystem.new(@xml, @hResponseObj)
75
+ extensionClass = MD_MetadataExtensionInformation.new(@xml, @hResponseObj)
76
+ dataIdClass = MD_DataIdentification.new(@xml, @hResponseObj)
77
+ coverageClass = CoverageDescription.new(@xml, @hResponseObj)
78
+ distClass = MD_Distribution.new(@xml, @hResponseObj)
79
+ dqClass = DQ_DataQuality.new(@xml, @hResponseObj)
80
+ maintenanceClass = MD_MaintenanceInformation.new(@xml, @hResponseObj)
81
+ dateTimeClass = GcoDateTime.new(@xml, @hResponseObj)
82
+
83
+ # create shortcuts to sections of internal object
84
+ hMetadata = intObj[:metadata]
85
+ hMetaInfo = hMetadata[:metadataInfo]
86
+ hResInfo = hMetadata[:resourceInfo]
87
+ aAssocRes = hMetadata[:associatedResources]
88
+ version = @hResponseObj[:translatorVersion]
89
+
90
+ # document head
91
+ metadata = @xml.instruct! :xml, encoding: 'UTF-8'
92
+ @xml.comment!('ISO 19115-2 METADATA')
93
+ @xml.comment!('Metadata file was constructed using the ADIwg mdTranslator, http://mdtranslator.adiwg.org')
94
+ @xml.comment!('mdTranslator software is an open-source project of the Alaska Data Integration working group (ADIwg)')
95
+ @xml.comment!('mdTranslator and other metadata tools are available at https://github.com/adiwg')
96
+ @xml.comment!('ADIwg is not responsible for the content of this metadata record')
97
+ @xml.comment!('This metadata record was generated by mdTranslator ' + version + ' at ' + Time.now.to_s)
98
+
99
+ # MI_Metadata
100
+ @xml.tag!('gmi:MI_Metadata',
101
+ {'xmlns:gmi' => 'http://www.isotc211.org/2005/gmi',
102
+ 'xmlns:gmd' => 'http://www.isotc211.org/2005/gmd',
103
+ 'xmlns:gco' => 'http://www.isotc211.org/2005/gco',
104
+ 'xmlns:gml' => 'http://www.opengis.net/gml/3.2',
105
+ 'xmlns:gsr' => 'http://www.isotc211.org/2005/gsr',
106
+ 'xmlns:gss' => 'http://www.isotc211.org/2005/gss',
107
+ 'xmlns:gst' => 'http://www.isotc211.org/2005/gst',
108
+ 'xmlns:gmx' => 'http://www.isotc211.org/2005/gmx',
109
+ 'xmlns:gfc' => 'http://www.isotc211.org/2005/gfc',
110
+ 'xmlns:srv' => 'http://www.isotc211.org/2005/srv',
111
+ 'xmlns:xlink' => 'http://www.w3.org/1999/xlink',
112
+ 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
113
+ 'xsi:schemaLocation' => 'http://www.isotc211.org/2005/gmi ftp://ftp.ncddc.noaa.gov/pub/Metadata/Online_ISO_Training/Intro_to_ISO/schemas/ISObio/schema.xsd'}) do
114
+
115
+ # remote schema location - for deployment
116
+ # ftp://ftp.ncddc.noaa.gov/pub/Metadata/Online_ISO_Training/Intro_to_ISO/schemas/ISObio/schema.xsd
117
+ # local schema location - for development
118
+ # C:\Users\StanSmith\Projects\ISO\19115\NOAA\schema.xsd
119
+
120
+ # metadata information - file identifier (default: UUID)
121
+ s = hMetaInfo[:metadataIdentifier][:identifier]
122
+ @xml.tag!('gmd:fileIdentifier') do
123
+ unless s.nil?
124
+ @xml.tag!('gco:CharacterString', s)
125
+ end
126
+ if s.nil?
127
+ @xml.tag!('gco:CharacterString', UUIDTools::UUID.random_create.to_s)
128
+ end
129
+ end
130
+
131
+ # metadata information - metadata language ('eng; USA')
132
+ @xml.tag!('gmd:language') do
133
+ @xml.tag!('gco:CharacterString', 'eng; USA')
134
+ end
135
+
136
+ # metadata information - metadata character ('utf-8')
137
+ @xml.tag!('gmd:characterSet') do
138
+ codelistClass.writeXML('gmd', 'iso_characterSet', 'UTF-8')
139
+ end
140
+
141
+ # metadata information - parent identifier
142
+ s = nil
143
+ hParent = hMetaInfo[:parentMetadata]
144
+ unless hParent.empty?
145
+ s = hParent[:title]
146
+ end
147
+ unless s.nil?
148
+ @xml.tag!('gmd:parentIdentifier') do
149
+ @xml.tag!('gco:CharacterString', s)
150
+ end
151
+ end
152
+ if s.nil? && @hResponseObj[:writerShowTags]
153
+ @xml.tag!('gmd:parentIdentifier')
154
+ end
155
+
156
+ # metadata information - hierarchy level [] {MD_scopeCode}
157
+ # metadata information - hierarchy level Name [] {string}
158
+ # hierarchy comes from resourceInfo < resourceType []
159
+ # pass entire array to hierarchy
160
+ # all hierarchyLevel tags must precede the hierarchyLevelName tags
161
+ aResTypes = hResInfo[:resourceTypes]
162
+ unless aResTypes.empty?
163
+ hierarchyClass.writeXML(aResTypes)
164
+ end
165
+ if aResTypes.empty? && @hResponseObj[:writerShowTags]
166
+ @xml.tag!('gmd:hierarchyLevel')
167
+ @xml.tag!('gmd:hierarchyLevelName')
168
+ end
169
+
170
+ # metadata information - metadata contacts (required)
171
+ # [{CI_ResponsibleParty}]
172
+ aRParties = hMetaInfo[:metadataContacts]
173
+ aRParties.each do |hRParty|
174
+ role = hRParty[:roleName]
175
+ aParties = hRParty[:parties]
176
+ aParties.each do |hParty|
177
+ @xml.tag!('gmd:contact') do
178
+ partyClass.writeXML(role, hParty)
179
+ end
180
+ end
181
+ end
182
+ if aRParties.empty?
183
+ @xml.tag!('gmd:contact', {'gco:nilReason' => 'missing'})
184
+ end
185
+
186
+ # metadata information - date stamp (required) {default: now()}
187
+ hCreateDate = {}
188
+ hCreateDate[:date] = DateTime.now
189
+ hCreateDate[:dateResolution] = 'YMD'
190
+ aDates = hMetaInfo[:metadataDates]
191
+ aDates.each do |hDate|
192
+ if hDate[:dateType] == 'creation'
193
+ hCreateDate = hDate
194
+ end
195
+ end
196
+ @xml.tag!('gmd:dateStamp') do
197
+ dateTimeClass.writeXML(hCreateDate)
198
+ end
199
+
200
+ # metadata information - metadata standard name (default)
201
+ @xml.tag!('gmd:metadataStandardName') do
202
+ @xml.tag!('gco:CharacterString', 'ISO 19115-2')
203
+ end
204
+
205
+ # metadata information - metadata standard version (default)
206
+ @xml.tag!('gmd:metadataStandardVersion') do
207
+ @xml.tag!('gco:CharacterString', 'ISO 19115-2:2009(E)')
208
+ end
209
+
210
+ # metadata information - metadata linkage
211
+ s = nil
212
+ unless hMetaInfo[:metadataLinkages].empty?
213
+ hLinkage = hMetaInfo[:metadataLinkages][0]
214
+ s = hLinkage[:olResURI]
215
+ @xml.tag!('gmd:dataSetURI') do
216
+ @xml.tag!('gco:CharacterString', s)
217
+ end
218
+ end
219
+ if s.nil? && @hResponseObj[:writerShowTags]
220
+ @xml.tag!('gmd:dataSetURI')
221
+ end
222
+
223
+ # metadata information - locale []
224
+ aLocales = hMetaInfo[:otherMetadataLocales]
225
+ unless hMetaInfo[:defaultMetadataLocale].empty?
226
+ aLocales.insert(0, hMetaInfo[:defaultMetadataLocale])
227
+ end
228
+ aLocales.each do |hLocale|
229
+ @xml.tag!('gmd:locale') do
230
+ localeClass.writeXML(hLocale)
231
+ end
232
+ end
233
+ if aLocales.empty? && @hResponseObj[:writerShowTags]
234
+ @xml.tag!('gmd:locale')
235
+ end
236
+
237
+ # metadata information - spatial representation []
238
+ aReps = hResInfo[:spatialRepresentations]
239
+ aReps.each do |hRep|
240
+ @xml.tag!('gmd:spatialRepresentationInfo') do
241
+ representationClass.writeXML(hRep)
242
+ end
243
+ end
244
+ if aReps.empty? && @hResponseObj[:writerShowTags]
245
+ @xml.tag!('gmd:spatialRepresentationInfo')
246
+ end
247
+
248
+ # metadata information - reference system []
249
+ aSystems = hResInfo[:spatialReferenceSystems]
250
+ aSystems.each do |hSystem|
251
+ # reference systems with referenceType only are not supported in 19115-2
252
+ unless hSystem[:systemIdentifier].empty? && hSystem[:systemParameterSet].empty?
253
+ @xml.tag!('gmd:referenceSystemInfo') do
254
+ systemClass.writeXML(hSystem)
255
+ end
256
+ end
257
+ end
258
+ if aSystems.empty? && @hResponseObj[:writerShowTags]
259
+ @xml.tag!('gmd:referenceSystemInfo')
260
+ end
261
+
262
+ # metadata information - metadata extension info
263
+ # add biological profile to all metadata records
264
+ intBio = intMetadataClass.newMetadataExtension
265
+ intBio[:name] = 'Taxonomy System'
266
+ intBio[:shortName] = 'TaxonSys'
267
+ intBio[:definition] = 'Documentation of taxonomic sources, procedures, and treatments'
268
+ intBio[:obligation] = 'optional'
269
+ intBio[:dataType] = 'class'
270
+ intBio[:maxOccurrence] = '1'
271
+ intBio[:parentEntities] << 'MD_Identification'
272
+ intBio[:rule] = 'New Metadata section as a class to MD_Identification'
273
+ intBio[:rationales] << 'The set of data elements contained within this class element ' +
274
+ 'represents an attempt to provide better documentation of ' +
275
+ 'taxonomic sources, procedures, and treatments.'
276
+ intBio[:sourceOrganization] = 'National Biological Information Infrastructure'
277
+ intBio[:sourceURI] = 'https://www2.usgs.gov/core_science_systems/Access/p1111-1.html'
278
+ intBio[:sourceRole] = 'author'
279
+
280
+ @xml.tag!('gmd:metadataExtensionInfo') do
281
+ extensionClass.writeXML(intBio)
282
+ end
283
+
284
+ # ###################### Begin Data Identification #####################
285
+
286
+ # metadata information - identification info - required
287
+ unless hResInfo.empty?
288
+ @xml.tag!('gmd:identificationInfo') do
289
+ dataIdClass.writeXML(hResInfo, aAssocRes)
290
+ end
291
+ end
292
+ if hResInfo.empty?
293
+ @xml.tag!('gmd:identificationInfo', {'gco:nilReason' => 'missing'})
294
+ end
295
+
296
+ # ###################### End Data Identification #######################
297
+
298
+ # metadata information - coverageDescription []
299
+ aItems = hResInfo[:coverageDescriptions]
300
+ aItems.each do |hItem|
301
+ @xml.tag!('gmd:contentInfo') do
302
+ coverageClass.writeXML(hItem)
303
+ end
304
+ end
305
+ if aItems.empty? && @hResponseObj[:writerShowTags]
306
+ @xml.tag!('gmd:contentInfo')
307
+ end
308
+
309
+ # metadata information - distribution info [0]
310
+ aDistInfo = hMetadata[:distributorInfo]
311
+ unless aDistInfo.empty?
312
+ hDistInfo = aDistInfo[0]
313
+ unless hDistInfo.empty?
314
+ @xml.tag!('gmd:distributionInfo') do
315
+ distClass.writeXML(hDistInfo)
316
+ end
317
+ end
318
+ end
319
+ if aDistInfo.empty? && @hResponseObj[:writerShowTags]
320
+ @xml.tag!('gmd:distributionInfo')
321
+ end
322
+
323
+ # metadata information - data quality info []
324
+ aDQInfo = hMetadata[:lineageInfo]
325
+ aDQInfo.each do |hDQInfo|
326
+ @xml.tag!('gmd:dataQualityInfo') do
327
+ dqClass.writeXML(hDQInfo)
328
+ end
329
+ end
330
+ if aDQInfo.empty? && @hResponseObj[:writerShowTags]
331
+ @xml.tag!('gmd:dataQualityInfo')
332
+ end
333
+
334
+ # metadata information - metadata maintenance
335
+ hMaintenance = hMetaInfo[:metadataMaintenance]
336
+ unless hMaintenance.empty?
337
+ @xml.tag!('gmd:metadataMaintenance') do
338
+ maintenanceClass.writeXML(hMaintenance)
339
+ end
340
+ end
341
+ if hMaintenance.empty? && @hResponseObj[:writerShowTags]
342
+ @xml.tag!('gmd:metadataMaintenance')
343
+ end
344
+
345
+ end # gmi:MI_Metadata tag
346
+
347
+ return metadata
348
+
349
+ end # writeXML
350
+ end # MI_Metadata class
351
+
352
+ end
353
+ end
354
+ end
352
355
  end