adiwg-mdtranslator 2.0.0rc5 → 2.0.0rc6

Sign up to get free protection for your applications and to get access to all the features.
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