adiwg-mdtranslator 2.0.0rc5 → 2.0.0rc6

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.
Files changed (23) hide show
  1. checksums.yaml +4 -4
  2. data/lib/adiwg/mdtranslator/internal/module_coordinates.rb +184 -158
  3. data/lib/adiwg/mdtranslator/internal/module_dateTimeFun.rb +19 -0
  4. data/lib/adiwg/mdtranslator/version.rb +3 -1
  5. data/lib/adiwg/mdtranslator/writers/html/sections/html_resourceType.rb +6 -1
  6. data/lib/adiwg/mdtranslator/writers/iso19110/classes/class_featureType.rb +2 -0
  7. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_gcoDateTime.rb +40 -40
  8. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_geometryCollection.rb +2 -0
  9. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_lineString.rb +2 -0
  10. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_multiLine.rb +2 -0
  11. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_multiPoint.rb +2 -0
  12. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_multiPolygon.rb +2 -0
  13. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_point.rb +63 -61
  14. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_polygon.rb +2 -0
  15. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_timeInstant.rb +2 -0
  16. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_timePeriod.rb +2 -0
  17. data/lib/adiwg/mdtranslator/writers/mdJson/sections/mdJson_date.rb +1 -14
  18. data/lib/adiwg/mdtranslator/writers/mdJson/sections/mdJson_dateTime.rb +1 -14
  19. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_citation.rb +17 -18
  20. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_provenance.rb +39 -0
  21. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_rights.rb +41 -0
  22. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_sbJson.rb +12 -0
  23. metadata +5 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ecd5337a8dfd9f2c62c7e449e2e480fd0308c806
4
- data.tar.gz: 1e0c2971909fdc056bbb4bda02c9419afc0a7e45
3
+ metadata.gz: 63347888ab794a1ee8a6def46c8dbf979c55ee47
4
+ data.tar.gz: bbe3e51b5cfedd30c354d31277f9e4c98b477d3d
5
5
  SHA512:
6
- metadata.gz: 936f7f46d97de59dbc0a48ac3056d33913f813ea27a40a68ceff0b2bb25847a41bd2530f94a6a0b6b84bfed11836e4061aa0e32b6bc8cb449b87a3b7f707f353
7
- data.tar.gz: f3efa41bd0e71fbc46d85084ae675cee4d20b643a4d1452facf4f9a7d7bf7aadd01f3c6c60da44898b8f1b783e7730ca1e5532e240e06107e6b93b0b4290e2c9
6
+ metadata.gz: 289cf433acd5d2c3fb71f6e010d2bab975ad3b6c85b57ddf54b1b44a6bcbfac21491272f34569642090e5f50c4ba6f8676a661caa753b10771bfb5e3b5af1d89
7
+ data.tar.gz: 2110820a54149d78f9a244de1d927090111f1408366e961b9ff8b7535eed597f189adf2ce77c481dbe810bdc123079506db49f99112951eea6da6240b1487744
@@ -1,171 +1,197 @@
1
1
  # repack coordinates
2
2
 
3
3
  # History:
4
- # Stan Smith 2016-11-10 added computedBbox computation
5
- # Stan Smith 2015-07-16 moved module_coordinates from mdJson reader to internal
6
- # Stan Smith 2015-07-14 refactored to remove global namespace constants
7
- # Stan Smith 2015-06-22 replace global ($response) with passed in object (responseObj)
8
- # Stan Smith 2014-12-15 refactored to handle namespacing readers and writers
9
- # Stan Smith 2014-05-23 added getLevels
4
+ # Stan Smith 2017-05-24 added checkGeometry method to move objects to real world
5
+ # Stan Smith 2016-11-10 added computedBbox computation
6
+ # Stan Smith 2015-07-16 moved module_coordinates from mdJson reader to internal
7
+ # Stan Smith 2015-07-14 refactored to remove global namespace constants
8
+ # Stan Smith 2015-06-22 replace global ($response) with passed in object (responseObj)
9
+ # Stan Smith 2014-12-15 refactored to handle namespacing readers and writers
10
+ # Stan Smith 2014-05-23 added getLevels
10
11
  # Stan Smith 2013-11-13 added getDimension
11
12
  # Stan Smith 2013-11-07 original script
12
13
 
13
14
  module AdiwgCoordinates
14
15
 
15
- # repack coordinate array into single string for ISO
16
- def self.stringifyCoords(aCoords, responseObj)
17
-
18
- s = ''
19
- i = 0
20
- coordCount = aCoords.length
21
- aCoords.each do |coord|
22
- if coord.kind_of?(Array)
23
- s = s + unpack(coord, responseObj)
24
- else
25
- i += 1
26
- s = s + coord.to_s
27
- if i < coordCount
28
- s = s + ','
29
- end
30
- s = s + ' '
16
+ # repack coordinate array into single string for ISO
17
+ def self.stringifyCoords(aCoords, responseObj)
18
+
19
+ s = ''
20
+ i = 0
21
+ coordCount = aCoords.length
22
+ aCoords.each do |coord|
23
+ if coord.kind_of?(Array)
24
+ s = s + unpack(coord, responseObj)
25
+ else
26
+ i += 1
27
+ s = s + coord.to_s
28
+ if i < coordCount
29
+ s = s + ','
31
30
  end
32
- end
33
-
34
- return s
35
-
36
- end
37
-
38
- # get the number of dimensions in a coordinate array
39
- def self.getDimension(aCoords)
40
-
41
- if aCoords[0].kind_of?(Array)
42
- coordDim = getDimension(aCoords[0])
43
- else
44
- coordDim = aCoords.length
45
- end
46
-
47
- return coordDim
48
-
49
- end
50
-
51
- # get the number of levels in the coordinate array
52
- def self.getLevels(aCoords)
53
-
54
- i = 1
55
- if aCoords[0].kind_of?(Array)
56
- i = i + getLevels(aCoords[0])
57
- end
58
- return i
59
-
60
- end
61
-
62
- # compute bounding box
63
- def self.computeBbox(aGeo)
64
-
65
- # find all the eastings (x) and northings (y) in the GeoJSON object
66
- aNorthings = []
67
- aEastings = []
68
- aGeo.each do |hGeo|
69
- unpackGeometry(hGeo, aNorthings, aEastings)
70
- end
71
-
72
- # find most north/south points
73
- north = aNorthings.max
74
- south = aNorthings.min
75
-
76
- # find most east/west spanning the meridian
77
- eastM = aEastings.max
78
- westM = aEastings.min
79
-
80
- # find most east/west spanning the anti-meridian
81
- positiveEast = []
82
- negativeEast = []
83
- aEastings.each do |east|
84
- negativeEast << east if east < 0.0
85
- positiveEast << east if east >= 0.0
86
- end
87
- eastAM = negativeEast.max
88
- westAM = positiveEast.min
89
-
90
- # if eastings are all positive or all negative no meridian was spanned
91
- if positiveEast.empty? || negativeEast.empty?
31
+ s = s + ' '
32
+ end
33
+ end
34
+
35
+ return s
36
+
37
+ end
38
+
39
+ # get the number of dimensions in a coordinate array
40
+ def self.getDimension(aCoords)
41
+
42
+ if aCoords[0].kind_of?(Array)
43
+ coordDim = getDimension(aCoords[0])
44
+ else
45
+ coordDim = aCoords.length
46
+ end
47
+
48
+ return coordDim
49
+
50
+ end
51
+
52
+ # get the number of levels in the coordinate array
53
+ def self.getLevels(aCoords)
54
+
55
+ i = 1
56
+ if aCoords[0].kind_of?(Array)
57
+ i = i + getLevels(aCoords[0])
58
+ end
59
+ return i
60
+
61
+ end
62
+
63
+ # compute bounding box
64
+ def self.computeBbox(aGeo)
65
+
66
+ # find all the eastings (x) and northings (y) in the GeoJSON object
67
+ aNorthings = []
68
+ aEastings = []
69
+ aGeo.each do |hGeo|
70
+ unpackGeometry(hGeo, aNorthings, aEastings)
71
+ end
72
+
73
+ # find most north/south points
74
+ north = aNorthings.max
75
+ south = aNorthings.min
76
+
77
+ # find most east/west spanning the meridian
78
+ eastM = aEastings.max
79
+ westM = aEastings.min
80
+
81
+ # find most east/west spanning the anti-meridian
82
+ aPositiveEast = []
83
+ aNegativeEast = []
84
+ aEastings.each do |east|
85
+ aNegativeEast << east if east < 0.0
86
+ aPositiveEast << east if east >= 0.0
87
+ end
88
+ aNegativeEast.uniq!
89
+ aPositiveEast.uniq!
90
+
91
+ eastAM = aNegativeEast.max
92
+ westAM = aPositiveEast.min
93
+
94
+ # if eastings are all positive or all negative hemisphere is decided
95
+ if aPositiveEast.empty? || aNegativeEast.empty?
96
+ east = eastM
97
+ west = westM
98
+ else
99
+ # choose which meridian to span based on smaller edge-to-edge distance
100
+ distanceM = eastM - westM
101
+ distanceAM = (180 + eastAM) + (180 - westAM)
102
+ if distanceM.abs <= distanceAM.abs
103
+ # this spanned to meridian
92
104
  east = eastM
93
105
  west = westM
94
- else
95
- # choose which meridian was spanned based on smaller edge-to-edge distance
96
- distanceM = eastM - westM
97
- distanceAM = (180 + eastAM) + (180 - westAM)
98
- if distanceM <= distanceAM
99
- # this spanned to meridian
100
- east = eastM
101
- west = westM
102
- else
103
- # this spanned tne anti-meridian
104
- east = eastAM
105
- west = westAM
106
- end
107
- end
108
-
109
- bBox = {}
110
- bBox[:westLongitude] = west
111
- bBox[:eastLongitude] = east
112
- bBox[:southLatitude] = south
113
- bBox[:northLatitude] = north
114
-
115
- return bBox
116
-
117
- end
118
-
119
- # compute bounding box
120
- def self.unpackGeometry(hGeo, aNorthings, aEastings)
121
-
122
- # geometry objects
123
- type = hGeo[:type]
124
- if %w{ Point LineString Polygon MultiPoint MultiLineString MultiPolygon }.one? { |word| word == type }
125
- unpackCoords(hGeo[:coordinates], aNorthings, aEastings)
126
- end
127
-
128
- # geometry collections
129
- if hGeo[:type] == 'GeometryCollection'
130
- hGeo[:geometryObjects].each do |aGeoObj|
131
- unpackCoords(aGeoObj[:coordinates], aNorthings, aEastings)
132
- end
133
- end
134
-
135
- # features
136
- if hGeo[:type] == 'Feature'
137
- featureType = hGeo[:geometryObject][:type]
138
- if featureType == 'GeometryCollection'
139
- unpackGeometry(hGeo[:geometryObject], aNorthings, aEastings)
140
- else
141
- unpackCoords(hGeo[:geometryObject][:coordinates], aNorthings, aEastings)
142
- end
143
- end
144
-
145
- # feature collections
146
- if hGeo[:type] == 'FeatureCollection'
147
- hGeo[:features].each do |hFeature|
148
- unpackGeometry(hFeature, aNorthings, aEastings)
149
- end
150
- end
151
-
152
- end
153
-
154
- # compute bounding box
155
- def self.unpackCoords(aCoords, aNorthings, aEastings)
156
- if aCoords[0].kind_of?(Array)
157
- aCoords.each do |aTuple|
158
- unpackCoords(aTuple, aNorthings, aEastings)
159
- end
160
- else
161
- addPoint(aCoords, aNorthings, aEastings)
162
- end
163
- end
164
-
165
- # compute bounding box
166
- def self.addPoint(aPoint, aNorthings, aEastings)
167
- aEastings << aPoint[0]
168
- aNorthings << aPoint[1]
169
- end
106
+ else
107
+ # this spanned tne anti-meridian
108
+ east = eastAM
109
+ west = westAM
110
+ end
111
+ end
112
+
113
+ bBox = {}
114
+ bBox[:westLongitude] = west
115
+ bBox[:eastLongitude] = east
116
+ bBox[:southLatitude] = south
117
+ bBox[:northLatitude] = north
118
+
119
+ return bBox
120
+
121
+ end
122
+
123
+ # compute bounding box
124
+ def self.unpackGeometry(hGeo, aNorthings, aEastings)
125
+
126
+ # geometry objects
127
+ type = hGeo[:type]
128
+ if %w{ Point LineString Polygon MultiPoint MultiLineString MultiPolygon }.one? {|word| word == type}
129
+ checkGeometry(hGeo[:coordinates], aNorthings, aEastings)
130
+ end
131
+
132
+ # geometry collections
133
+ if hGeo[:type] == 'GeometryCollection'
134
+ hGeo[:geometryObjects].each do |aGeoObj|
135
+ checkGeometry(aGeoObj[:coordinates], aNorthings, aEastings)
136
+ end
137
+ end
138
+
139
+ # features
140
+ if hGeo[:type] == 'Feature'
141
+ featureType = hGeo[:geometryObject][:type]
142
+ if featureType == 'GeometryCollection'
143
+ unpackGeometry(hGeo[:geometryObject], aNorthings, aEastings)
144
+ else
145
+ checkGeometry(hGeo[:geometryObject][:coordinates], aNorthings, aEastings)
146
+ end
147
+ end
148
+
149
+ # feature collections
150
+ if hGeo[:type] == 'FeatureCollection'
151
+ hGeo[:features].each do |hFeature|
152
+ unpackGeometry(hFeature, aNorthings, aEastings)
153
+ end
154
+ end
155
+
156
+ end
157
+
158
+ # move geometry to real world if necessary
159
+ def self.checkGeometry(aCoords, aNorthings, aEastings)
160
+
161
+ aGeoNorthings = []
162
+ aGeoEastings = []
163
+
164
+ unpackCoords(aCoords, aGeoNorthings, aGeoEastings)
165
+
166
+ minEast = aGeoEastings.min
167
+ maxEast = aGeoEastings.max
168
+ if maxEast < -180
169
+ aGeoEastings.collect! { |x| x + 360 }
170
+ end
171
+ if minEast > 180
172
+ aGeoEastings.collect! { |x| x - 360 }
173
+ end
174
+
175
+ aEastings.concat(aGeoEastings)
176
+ aNorthings.concat(aGeoNorthings)
177
+
178
+ end
179
+
180
+ # unpack coordinate arrays
181
+ def self.unpackCoords(aCoords, aNorthings, aEastings)
182
+ if aCoords[0].kind_of?(Array)
183
+ aCoords.each do |aTuple|
184
+ unpackCoords(aTuple, aNorthings, aEastings)
185
+ end
186
+ else
187
+ addPoint(aCoords, aNorthings, aEastings)
188
+ end
189
+ end
190
+
191
+ # add to tuple to an array
192
+ def self.addPoint(aPoint, aNorthings, aEastings)
193
+ aEastings << aPoint[0]
194
+ aNorthings << aPoint[1]
195
+ end
170
196
 
171
197
  end
@@ -140,4 +140,23 @@ module AdiwgDateTimeFun
140
140
  return sDuration
141
141
  end
142
142
 
143
+ def self.stringFromDateObject(obj)
144
+
145
+ date = obj[:date]
146
+ if date.nil?
147
+ date = obj[:dateTime]
148
+ end
149
+ dateRes = obj[:dateResolution]
150
+ unless date.nil?
151
+ case dateRes
152
+ when 'Y', 'YM', 'YMD'
153
+ dateStr = stringDateFromDateTime(date, dateRes)
154
+ else
155
+ dateStr = stringDateTimeFromDateTime(date, dateRes)
156
+ end
157
+ end
158
+
159
+ return dateStr
160
+ end
161
+
143
162
  end
@@ -1,6 +1,8 @@
1
1
  # adiwg mdTranslator
2
2
 
3
3
  # version 2 history
4
+ # 2.0.0rc6 2017-05-24 move geometries to real world if in -1 or +1 world
5
+ # --- removed special characters from ids for gml:id= in iso writers
4
6
  # 2.0.0rc5 2017-05-20 Fixed bug with no writer provided
5
7
  # 2.0.0rc4 2017-05-19 bump mdJson schema version to 2.1.2
6
8
  # 2.0.0rc3 2017-05-16 removed topicCategory from schema and manage as keyword
@@ -11,7 +13,7 @@
11
13
  module ADIWG
12
14
  module Mdtranslator
13
15
  # current mdtranslator version
14
- VERSION = "2.0.0rc5"
16
+ VERSION = "2.0.0rc6"
15
17
  end
16
18
  end
17
19
 
@@ -2,6 +2,7 @@
2
2
  # resource type
3
3
 
4
4
  # History:
5
+ # Stan Smith 2017-05-24 Fixed problem with nil name
5
6
  # Stan Smith 2015-03-25 original script
6
7
 
7
8
  module ADIWG
@@ -19,7 +20,11 @@ module ADIWG
19
20
 
20
21
  # resource type
21
22
  @html.em('Resource Type: ')
22
- @html.text!(hType[:type] + ' - ' + hType[:name])
23
+ @html.text!(hType[:type])
24
+ unless hType[:name].nil?
25
+ @html.em(' Name: ')
26
+ @html.text!(hType[:name])
27
+ end
23
28
  @html.br
24
29
 
25
30
  end # writeHtml
@@ -36,6 +36,8 @@ module ADIWG
36
36
  if entityId.nil?
37
37
  @hResponseObj[:writerMissingIdCount] = @hResponseObj[:writerMissingIdCount].succ
38
38
  entityId = 'entity' + @hResponseObj[:writerMissingIdCount]
39
+ else
40
+ entityId.gsub!(/[^0-9a-zA-Z]/,'')
39
41
  end
40
42
 
41
43
  @xml.tag!('gfc:FC_FeatureType', {'id' => entityId}) do
@@ -5,44 +5,44 @@
5
5
  # Stan Smith 2017-02-10 original script
6
6
 
7
7
  module ADIWG
8
- module Mdtranslator
9
- module Writers
10
- module Iso19115_2
11
-
12
- class GcoDateTime
13
-
14
- def initialize(xml, hResponseObj)
15
- @xml = xml
16
- @hResponseObj = hResponseObj
17
- end
18
-
19
- def writeXML(hDate)
20
-
21
- date = hDate[:date]
22
- dateRes = hDate[:dateResolution]
23
-
24
- # date - date (required)
25
- unless date.nil?
26
- case dateRes
27
- when 'Y', 'YM', 'YMD'
28
- dateStr = AdiwgDateTimeFun.stringDateFromDateTime(date, dateRes)
29
- @xml.tag!('gco:Date', dateStr)
30
- when 'YMDh', 'YMDhm', 'YMDhms'
31
- dateStr = AdiwgDateTimeFun.stringDateTimeFromDateTime(date, 'YMDhms')
32
- @xml.tag!('gco:DateTime', dateStr)
33
- when 'YMDhZ', 'YMDhmZ', 'YMDhmsZ'
34
- dateStr = AdiwgDateTimeFun.stringDateTimeFromDateTime(date, 'YMDhmsZ')
35
- @xml.tag!('gco:DateTime', dateStr)
36
- else
37
- dateStr = AdiwgDateTimeFun.stringDateTimeFromDateTime(date, dateRes)
38
- @xml.tag!('gco:DateTime', dateStr)
39
- end
40
- end
41
-
42
- end # write XML
43
- end # Date class
44
-
45
- end
46
- end
47
- end
8
+ module Mdtranslator
9
+ module Writers
10
+ module Iso19115_2
11
+
12
+ class GcoDateTime
13
+
14
+ def initialize(xml, hResponseObj)
15
+ @xml = xml
16
+ @hResponseObj = hResponseObj
17
+ end
18
+
19
+ def writeXML(hDate)
20
+
21
+ date = hDate[:date]
22
+ dateRes = hDate[:dateResolution]
23
+
24
+ # date - date (required)
25
+ unless date.nil?
26
+ case dateRes
27
+ when 'Y', 'YM', 'YMD'
28
+ dateStr = AdiwgDateTimeFun.stringDateFromDateTime(date, dateRes)
29
+ @xml.tag!('gco:Date', dateStr)
30
+ when 'YMDh', 'YMDhm', 'YMDhms'
31
+ dateStr = AdiwgDateTimeFun.stringDateTimeFromDateTime(date, 'YMDhms')
32
+ @xml.tag!('gco:DateTime', dateStr)
33
+ when 'YMDhZ', 'YMDhmZ', 'YMDhmsZ'
34
+ dateStr = AdiwgDateTimeFun.stringDateTimeFromDateTime(date, 'YMDhmsZ')
35
+ @xml.tag!('gco:DateTime', dateStr)
36
+ else
37
+ dateStr = AdiwgDateTimeFun.stringDateTimeFromDateTime(date, dateRes)
38
+ @xml.tag!('gco:DateTime', dateStr)
39
+ end
40
+ end
41
+
42
+ end # write XML
43
+ end # Date class
44
+
45
+ end
46
+ end
47
+ end
48
48
  end
@@ -42,6 +42,8 @@ module ADIWG
42
42
  if objId.nil?
43
43
  @hResponseObj[:writerMissingIdCount] = @hResponseObj[:writerMissingIdCount].succ
44
44
  objId = 'geometryCollection' + @hResponseObj[:writerMissingIdCount]
45
+ else
46
+ objId.gsub!(/[^0-9a-zA-Z]/,'')
45
47
  end
46
48
  attributes['gml:id'] = objId
47
49
 
@@ -39,6 +39,8 @@ module ADIWG
39
39
  if lineId.nil?
40
40
  @hResponseObj[:writerMissingIdCount] = @hResponseObj[:writerMissingIdCount].succ
41
41
  lineId = 'line' + @hResponseObj[:writerMissingIdCount]
42
+ else
43
+ lineId.gsub!(/[^0-9a-zA-Z]/,'')
42
44
  end
43
45
  attributes['gml:id'] = lineId
44
46
 
@@ -35,6 +35,8 @@ module ADIWG
35
35
  if objId.nil?
36
36
  @hResponseObj[:writerMissingIdCount] = @hResponseObj[:writerMissingIdCount].succ
37
37
  objId = 'multiLine' + @hResponseObj[:writerMissingIdCount]
38
+ else
39
+ objId.gsub!(/[^0-9a-zA-Z]/,'')
38
40
  end
39
41
  attributes['gml:id'] = objId
40
42
 
@@ -35,6 +35,8 @@ module ADIWG
35
35
  if objId.nil?
36
36
  @hResponseObj[:writerMissingIdCount] = @hResponseObj[:writerMissingIdCount].succ
37
37
  objId = 'multiPoint' + @hResponseObj[:writerMissingIdCount]
38
+ else
39
+ objId.gsub!(/[^0-9a-zA-Z]/,'')
38
40
  end
39
41
  attributes['gml:id'] = objId
40
42
 
@@ -35,6 +35,8 @@ module ADIWG
35
35
  if objId.nil?
36
36
  @hResponseObj[:writerMissingIdCount] = @hResponseObj[:writerMissingIdCount].succ
37
37
  objId = 'multiPolygon' + @hResponseObj[:writerMissingIdCount]
38
+ else
39
+ objId.gsub!(/[^0-9a-zA-Z]/,'')
38
40
  end
39
41
  attributes['gml:id'] = objId
40
42
 
@@ -16,68 +16,70 @@ require 'adiwg/mdtranslator/internal/module_coordinates'
16
16
  require_relative 'class_featureProperties'
17
17
 
18
18
  module ADIWG
19
- module Mdtranslator
20
- module Writers
21
- module Iso19115_2
22
-
23
- class Point
24
-
25
- def initialize(xml, hResponseObj)
26
- @xml = xml
27
- @hResponseObj = hResponseObj
28
- end
29
-
30
- def writeXML(hGeoObject, hProperties, objId)
31
-
32
- # classes used
33
- geoPropClass = FeatureProperties.new(@xml, @hResponseObj)
34
-
35
- # Point attributes
36
- attributes = {}
37
-
38
- # Point attributes - gml:id (required)
39
- if objId.nil?
40
- @hResponseObj[:writerMissingIdCount] = @hResponseObj[:writerMissingIdCount].succ
41
- objId = 'point' + @hResponseObj[:writerMissingIdCount]
19
+ module Mdtranslator
20
+ module Writers
21
+ module Iso19115_2
22
+
23
+ class Point
24
+
25
+ def initialize(xml, hResponseObj)
26
+ @xml = xml
27
+ @hResponseObj = hResponseObj
28
+ end
29
+
30
+ def writeXML(hGeoObject, hProperties, objId)
31
+
32
+ # classes used
33
+ geoPropClass = FeatureProperties.new(@xml, @hResponseObj)
34
+
35
+ # Point attributes
36
+ attributes = {}
37
+
38
+ # Point attributes - gml:id (required)
39
+ if objId.nil?
40
+ @hResponseObj[:writerMissingIdCount] = @hResponseObj[:writerMissingIdCount].succ
41
+ objId = 'point' + @hResponseObj[:writerMissingIdCount]
42
+ else
43
+ objId.gsub!(/[^0-9a-zA-Z]/,'')
44
+ end
45
+ attributes['gml:id'] = objId
46
+
47
+ # Point attributes - srsDimension
48
+ s = AdiwgCoordinates.getDimension(hGeoObject[:coordinates])
49
+ if !s.nil?
50
+ attributes[:srsDimension] = s
51
+ end
52
+
53
+ # Point attributes - srsName (GeoJSON is WGS84)
54
+ attributes[:srsName] = 'WGS84'
55
+
56
+ @xml.tag!('gml:Point', attributes) do
57
+
58
+ # point - properties for Feature
59
+ unless hProperties.empty?
60
+ geoPropClass.writeXML(hProperties)
61
+ end
62
+ if hProperties.empty? && @hResponseObj[:writerShowTags]
63
+ @xml.tag!('gml:description')
64
+ @xml.tag!('gml:identifier', {'codeSpace' => ''})
65
+ @xml.tag!('gml:name')
66
+ end
67
+
68
+ # point - pos (required)
69
+ s = ''
70
+ unless hGeoObject[:coordinates].empty?
71
+ hGeoObject[:coordinates].each do |coord|
72
+ s += coord.to_s + ' '
42
73
  end
43
- attributes['gml:id'] = objId
74
+ s = s.strip
75
+ end
76
+ @xml.tag!('gml:pos', s)
44
77
 
45
- # Point attributes - srsDimension
46
- s = AdiwgCoordinates.getDimension(hGeoObject[:coordinates])
47
- if !s.nil?
48
- attributes[:srsDimension] = s
49
- end
78
+ end # gml:Point tag
79
+ end # writeXML
80
+ end # Point class
50
81
 
51
- # Point attributes - srsName (GeoJSON is WGS84)
52
- attributes[:srsName] = 'WGS84'
53
-
54
- @xml.tag!('gml:Point', attributes) do
55
-
56
- # point - properties for Feature
57
- unless hProperties.empty?
58
- geoPropClass.writeXML(hProperties)
59
- end
60
- if hProperties.empty? && @hResponseObj[:writerShowTags]
61
- @xml.tag!('gml:description')
62
- @xml.tag!('gml:identifier', {'codeSpace'=>''})
63
- @xml.tag!('gml:name')
64
- end
65
-
66
- # point - pos (required)
67
- s = ''
68
- unless hGeoObject[:coordinates].empty?
69
- hGeoObject[:coordinates].each do |coord|
70
- s += coord.to_s + ' '
71
- end
72
- s = s.strip
73
- end
74
- @xml.tag!('gml:pos', s)
75
-
76
- end # gml:Point tag
77
- end # writeXML
78
- end # Point class
79
-
80
- end
81
- end
82
- end
82
+ end
83
+ end
84
+ end
83
85
  end
@@ -39,6 +39,8 @@ module ADIWG
39
39
  if objId.nil?
40
40
  @hResponseObj[:writerMissingIdCount] = @hResponseObj[:writerMissingIdCount].succ
41
41
  objId = 'polygon' + @hResponseObj[:writerMissingIdCount]
42
+ else
43
+ objId.gsub!(/[^0-9a-zA-Z]/,'')
42
44
  end
43
45
  attributes['gml:id'] = objId
44
46
 
@@ -33,6 +33,8 @@ module ADIWG
33
33
  if timeID.nil?
34
34
  @hResponseObj[:writerMissingIdCount] = @hResponseObj[:writerMissingIdCount].succ
35
35
  timeID = 'timeInstant' + @hResponseObj[:writerMissingIdCount]
36
+ else
37
+ timeID.gsub!(/[^0-9a-zA-Z]/,'')
36
38
  end
37
39
 
38
40
  @xml.tag!('gml:TimeInstant', {'gml:id' => timeID}) do
@@ -34,6 +34,8 @@ module ADIWG
34
34
  if timeID.nil?
35
35
  @hResponseObj[:writerMissingIdCount] = @hResponseObj[:writerMissingIdCount].succ
36
36
  timeID = 'timePeriod' + @hResponseObj[:writerMissingIdCount]
37
+ else
38
+ timeID.gsub!(/[^0-9a-zA-Z]/,'')
37
39
  end
38
40
 
39
41
  @xml.tag!('gml:TimePeriod', {'gml:id' => timeID}) do
@@ -15,21 +15,8 @@ module ADIWG
15
15
 
16
16
  def self.build(hDate)
17
17
 
18
- date = hDate[:date]
19
- dateRes = hDate[:dateResolution]
20
- dateStr = ''
21
-
22
- unless date.nil?
23
- case dateRes
24
- when 'Y', 'YM', 'YMD'
25
- dateStr = AdiwgDateTimeFun.stringDateFromDateTime(date, dateRes)
26
- else
27
- dateStr = AdiwgDateTimeFun.stringDateTimeFromDateTime(date, dateRes)
28
- end
29
- end
30
-
31
18
  Jbuilder.new do |json|
32
- json.date(dateStr)
19
+ json.date(AdiwgDateTimeFun.stringFromDateObject(hDate))
33
20
  json.dateType hDate[:dateType]
34
21
  end
35
22
 
@@ -14,20 +14,7 @@ module ADIWG
14
14
 
15
15
  def self.build(hDateTime)
16
16
 
17
- date = hDateTime[:dateTime]
18
- dateRes = hDateTime[:dateResolution]
19
- dateStr = ''
20
-
21
- unless date.nil?
22
- case dateRes
23
- when 'Y', 'YM', 'YMD'
24
- dateStr = AdiwgDateTimeFun.stringDateFromDateTime(date, dateRes)
25
- else
26
- dateStr = AdiwgDateTimeFun.stringDateTimeFromDateTime(date, dateRes)
27
- end
28
- end
29
-
30
- return dateStr
17
+ return AdiwgDateTimeFun.stringFromDateObject(hDateTime)
31
18
 
32
19
  end # build
33
20
  end # DateTime
@@ -18,40 +18,39 @@ module ADIWG
18
18
  def self.build(hCitation)
19
19
 
20
20
  citation = ''
21
+ role = ''
21
22
 
22
23
  # names
23
- indexes = []
24
+ aIndexes = []
24
25
  hCitation[:responsibleParties].each do |hResponsibility|
26
+ role = hResponsibility[:roleName]
25
27
  hResponsibility[:parties].each do |hParty|
26
- indexes << hParty[:contactIndex]
28
+ party = {}
29
+ party[:role] = role
30
+ party[:index] = hParty[:contactIndex]
31
+ aIndexes << party
27
32
  hParty[:organizationMembers].each do |hMember|
28
- indexes << hMember[:contactIndex]
33
+ party = {}
34
+ party[:role] = role
35
+ party[:index] = hMember[:contactIndex]
36
+ aIndexes << party
29
37
  end
30
38
  end
31
39
  end
32
- indexes.uniq!
33
- indexes.each do |index|
34
- hContact = ADIWG::Mdtranslator::Writers::SbJson.getContact(index)
40
+ aIndexes.uniq!
41
+ aIndexes.each do |hIndex|
42
+ hContact = ADIWG::Mdtranslator::Writers::SbJson.getContact(hIndex[:index])
35
43
  unless hContact.empty?
36
44
  unless hContact[:name].nil?
37
- citation += hContact[:name] + ', '
45
+ citation += hContact[:name] + '(' + hIndex[:role] + '), '
38
46
  end
39
47
  end
40
48
  end
41
49
 
42
50
  # dates
43
51
  hCitation[:dates].each do |hDate|
44
- date = hDate[:date]
45
- dateRes = hDate[:dateResolution]
46
- unless date.nil?
47
- case dateRes
48
- when 'Y', 'YM', 'YMD'
49
- dateStr = AdiwgDateTimeFun.stringDateFromDateTime(date, dateRes)
50
- else
51
- dateStr = AdiwgDateTimeFun.stringDateTimeFromDateTime(date, dateRes)
52
- end
53
- citation += dateStr.to_s + '(' + hDate[:dateType] + '), '
54
- end
52
+ dateStr = AdiwgDateTimeFun.stringFromDateObject(hDate)
53
+ citation += dateStr + '(' + hDate[:dateType] + '), '
55
54
  end
56
55
 
57
56
  # title
@@ -0,0 +1,39 @@
1
+ # sbJson 1.0 writer
2
+
3
+ # History:
4
+ # Stan Smith 2017-05-23 original script
5
+
6
+ module ADIWG
7
+ module Mdtranslator
8
+ module Writers
9
+ module SbJson
10
+
11
+ module Provenance
12
+
13
+ def self.build(hMetadataInfo)
14
+
15
+ aContacts = hMetadataInfo[:metadataContacts]
16
+ aDates = hMetadataInfo[:metadataDates]
17
+
18
+ hProvenance = {}
19
+ hProvenance[:dataSource] = 'generated using ADIwg mdTranslator ' + ADIWG::Mdtranslator::VERSION
20
+
21
+ aDates.each do |hDate|
22
+ if hDate[:dateType] == 'creation'
23
+ hProvenance[:dateCreated] = AdiwgDateTimeFun.stringFromDateObject(hDate)
24
+ end
25
+ if hDate[:dateType] == 'lastUpdate'
26
+ hProvenance[:lastUpdated] = AdiwgDateTimeFun.stringFromDateObject(hDate)
27
+ end
28
+ end
29
+
30
+ hProvenance
31
+
32
+ end
33
+
34
+ end
35
+
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,41 @@
1
+ # sbJson 1.0 writer
2
+
3
+ # History:
4
+ # Stan Smith 2017-05-22 original script
5
+
6
+ module ADIWG
7
+ module Mdtranslator
8
+ module Writers
9
+ module SbJson
10
+
11
+ module Rights
12
+
13
+ def self.build(aConstraints)
14
+
15
+ rights = ''
16
+
17
+ aConstraints.each do |hConstraint|
18
+ if hConstraint[:type] = 'legal'
19
+ unless hConstraint[:legalConstraint].empty?
20
+ hConstraint[:legalConstraint][:otherCons].each do |con|
21
+ rights += con + '; '
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ # clean off last semicolon
28
+ if rights.length > 2
29
+ rights = rights[0...-2]
30
+ end
31
+
32
+ rights
33
+
34
+ end
35
+
36
+ end
37
+
38
+ end
39
+ end
40
+ end
41
+ end
@@ -8,6 +8,8 @@ require 'jbuilder'
8
8
  require_relative 'sbJson_id'
9
9
  require_relative 'sbJson_citation'
10
10
  require_relative 'sbJson_identifier'
11
+ require_relative 'sbJson_rights'
12
+ require_relative 'sbJson_provenance'
11
13
 
12
14
  module ADIWG
13
15
  module Mdtranslator
@@ -16,6 +18,7 @@ module ADIWG
16
18
 
17
19
  def self.build(intObj, responseObj)
18
20
 
21
+ metadataInfo = intObj[:metadata][:metadataInfo]
19
22
  resourceInfo = intObj[:metadata][:resourceInfo]
20
23
  hCitation = resourceInfo[:citation]
21
24
 
@@ -46,6 +49,15 @@ module ADIWG
46
49
  json.purpose resourceInfo[:purpose]
47
50
 
48
51
  # rights
52
+ unless resourceInfo[:constraints].empty?
53
+ json.rights Rights.build(resourceInfo[:constraints])
54
+ end
55
+
56
+ # provenance
57
+ json.provenance Provenance.build(metadataInfo)
58
+
59
+ # material requisition instructions
60
+ json.materialRequisitionInstructions
49
61
 
50
62
  end
51
63
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adiwg-mdtranslator
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0rc5
4
+ version: 2.0.0rc6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stan Smith
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-05-21 00:00:00.000000000 Z
12
+ date: 2017-05-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -586,6 +586,8 @@ files:
586
586
  - lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_facet.rb
587
587
  - lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_id.rb
588
588
  - lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_identifier.rb
589
+ - lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_provenance.rb
590
+ - lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_rights.rb
589
591
  - lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_sbJson.rb
590
592
  - lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_spatial.rb
591
593
  - lib/adiwg/mdtranslator/writers/sbJson/version.rb
@@ -610,7 +612,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
610
612
  version: 1.3.1
611
613
  requirements: []
612
614
  rubyforge_project:
613
- rubygems_version: 2.4.5
615
+ rubygems_version: 2.5.2
614
616
  signing_key:
615
617
  specification_version: 4
616
618
  summary: The mdtranslator (metadata translator) is a tool for translating metadata