ruby-ogc 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +29 -0
- data/Rakefile +2 -0
- data/lib/rogc.rb +3 -0
- data/lib/rogc/formats.rb +4 -0
- data/lib/rogc/formats/formats.rb +8 -0
- data/lib/rogc/formats/wms_capabilities.rb +8 -0
- data/lib/rogc/formats/wms_capabilities/base.rb +11 -0
- data/lib/rogc/formats/wms_capabilities/v1.rb +238 -0
- data/lib/rogc/formats/wms_capabilities/v1_1.rb +63 -0
- data/lib/rogc/formats/wms_capabilities/v1_1_1.rb +14 -0
- data/lib/rogc/formats/wms_capabilities/v1_3.rb +84 -0
- data/lib/rogc/formats/wms_capabilities/v1_3_0.rb +13 -0
- data/lib/rogc/formats/xml.rb +4 -0
- data/lib/rogc/formats/xml/base.rb +99 -0
- data/lib/rogc/formats/xml/versioned_ogc.rb +91 -0
- data/lib/rogc/version.rb +5 -0
- data/lib/rogc/wms_client.rb +35 -0
- data/lib/ruby-ogc.rb +1 -0
- data/ruby-ogc.gemspec +19 -0
- metadata +83 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Philippe HUET
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Ruby::Ogc
|
2
|
+
|
3
|
+
TODO: Write a gem description
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'ruby-ogc'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install ruby-ogc
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
TODO: Write usage instructions here
|
22
|
+
|
23
|
+
## Contributing
|
24
|
+
|
25
|
+
1. Fork it
|
26
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
28
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
data/lib/rogc.rb
ADDED
data/lib/rogc/formats.rb
ADDED
@@ -0,0 +1,238 @@
|
|
1
|
+
module ROGC
|
2
|
+
module Formats
|
3
|
+
module WMSCapabilities
|
4
|
+
class V1 < Base
|
5
|
+
self.version = '1.0.0'
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
super
|
9
|
+
@xml_readers = xml_readers.merge({
|
10
|
+
'wms' => {
|
11
|
+
'Service' => lambda { |node, obj|
|
12
|
+
obj.service ||= OpenStruct.new
|
13
|
+
read_child_nodes(node, obj.service)
|
14
|
+
},
|
15
|
+
'Name' => lambda { |node, obj|
|
16
|
+
obj.name = child_value(node)
|
17
|
+
},
|
18
|
+
'Title' => lambda { |node, obj|
|
19
|
+
obj.title = child_value(node)
|
20
|
+
},
|
21
|
+
'Abstract' => lambda { |node, obj|
|
22
|
+
obj.abstract = child_value(node)
|
23
|
+
},
|
24
|
+
'BoundingBox' => lambda { |node, obj|
|
25
|
+
return get_bounding_box(node, obj)
|
26
|
+
bbox = OpenStruct.new
|
27
|
+
bbox.bbox = [
|
28
|
+
node['minx'].to_f,
|
29
|
+
node['miny'].to_f,
|
30
|
+
node['maxx'].to_f,
|
31
|
+
node['maxy'].to_f
|
32
|
+
]
|
33
|
+
|
34
|
+
res = OpenStruct.new
|
35
|
+
res.x = node['resx'].to_f if node['resx']
|
36
|
+
res.y = node['resy'].to_f if node['resy']
|
37
|
+
|
38
|
+
bbox.res = res unless res.x.nil? || res.y.nil?
|
39
|
+
|
40
|
+
# obj.bbox = bbox
|
41
|
+
# obj
|
42
|
+
bbox
|
43
|
+
},
|
44
|
+
'OnlineReource' => lambda { |node, obj|
|
45
|
+
# obj.contact_information = OpenStruct.new
|
46
|
+
# read_child_nodes(node, obj.contact_information)
|
47
|
+
},
|
48
|
+
'ContactInformation' => lambda { |node, obj|
|
49
|
+
obj.contact_information = OpenStruct.new
|
50
|
+
read_child_nodes(node, obj.contact_information)
|
51
|
+
},
|
52
|
+
'ContactPersonPrimary' => lambda { |node, obj|
|
53
|
+
obj.person_primary = OpenStruct.new
|
54
|
+
read_child_nodes(node, obj.person_primary)
|
55
|
+
},
|
56
|
+
'Capability' => lambda { |node, obj|
|
57
|
+
obj.capability = OpenStruct.new
|
58
|
+
obj.capability.nested_layers = Array.new
|
59
|
+
obj.capability.layers = Array.new
|
60
|
+
|
61
|
+
read_child_nodes(node, obj.capability)
|
62
|
+
},
|
63
|
+
'Request' => lambda { |node, obj|
|
64
|
+
obj.request = OpenStruct.new
|
65
|
+
read_child_nodes(node, obj.request)
|
66
|
+
},
|
67
|
+
'GetCapabilities' => lambda { |node, obj|
|
68
|
+
obj.getcapabilities = OpenStruct.new(formats: Array.new)
|
69
|
+
read_child_nodes(node, obj.getcapabilities)
|
70
|
+
},
|
71
|
+
'Format' => lambda { |node, obj|
|
72
|
+
if obj.formats.is_a?(Array)
|
73
|
+
obj.formats << node.child.content if node.child?
|
74
|
+
else
|
75
|
+
obj.format = node.child.content if node.child?
|
76
|
+
end
|
77
|
+
},
|
78
|
+
'DCPType' => lambda { |node, obj|
|
79
|
+
read_child_nodes(node, obj)
|
80
|
+
},
|
81
|
+
'HTTP' => lambda { |node, obj|
|
82
|
+
read_child_nodes(node, obj)
|
83
|
+
},
|
84
|
+
'Get' => lambda { |node, obj|
|
85
|
+
obj.get = OpenStruct.new
|
86
|
+
read_child_nodes(node, obj.get)
|
87
|
+
|
88
|
+
if obj.href.nil? || obj.href == ''
|
89
|
+
obj.href = obj.get.href
|
90
|
+
end
|
91
|
+
},
|
92
|
+
'Post' => lambda { |node, obj|
|
93
|
+
obj.post = OpenStruct.new
|
94
|
+
read_child_nodes(node, obj.post)
|
95
|
+
|
96
|
+
if obj.href.nil? || obj.href == ''
|
97
|
+
obj.href = obj.get.href
|
98
|
+
# obj.href = obj.post.href # Isn't it better?
|
99
|
+
end
|
100
|
+
},
|
101
|
+
'GetMap' => lambda { |node, obj|
|
102
|
+
obj.getmap = OpenStruct.new(formats: Array.new)
|
103
|
+
read_child_nodes(node, obj.getmap)
|
104
|
+
},
|
105
|
+
'GetFeatureInfo' => lambda { |node, obj|
|
106
|
+
obj.getfeatureinfo = OpenStruct.new(formats: Array.new)
|
107
|
+
read_child_nodes(node, obj.getfeatureinfo)
|
108
|
+
},
|
109
|
+
'Exception' => lambda { |node, obj|
|
110
|
+
obj.exception = OpenStruct.new(formats: Array.new)
|
111
|
+
read_child_nodes(node, obj.exception)
|
112
|
+
},
|
113
|
+
'Layer' => lambda { |node, obj|
|
114
|
+
parent_layer, capability = nil
|
115
|
+
|
116
|
+
if (obj.capability)
|
117
|
+
capability = obj.capability
|
118
|
+
parent_layer = obj
|
119
|
+
else
|
120
|
+
capability = obj
|
121
|
+
end
|
122
|
+
|
123
|
+
#
|
124
|
+
# List of attributes
|
125
|
+
#
|
126
|
+
|
127
|
+
queryable = node['queryable']
|
128
|
+
cascaded = node['cascaded']
|
129
|
+
opaque = node['opaque']
|
130
|
+
no_subsets = node['noSubsets']
|
131
|
+
fixed_width = node['fixed_width']
|
132
|
+
fixed_height = node['fixed_height']
|
133
|
+
|
134
|
+
parent = parent_layer || OpenStruct.new
|
135
|
+
#
|
136
|
+
# Create layer
|
137
|
+
#
|
138
|
+
layer = OpenStruct.new(
|
139
|
+
{
|
140
|
+
nested_layers: Array.new,
|
141
|
+
styles: parent_layer.nil? ? Array.new : [] + parent_layer.styles,
|
142
|
+
srs: parent_layer.nil? ? {} : {}.merge(parent.srs),
|
143
|
+
metadata_urls: [],
|
144
|
+
bbox: parent_layer.nil? ? {} : {}.merge(parent.bbox),
|
145
|
+
llbbox: parent.llbbox,
|
146
|
+
dimensions: parent_layer.nil? ? {} : {}.merge(parent.dimensions),
|
147
|
+
authority_urls: parent_layer.nil? ? {} : {}.merge(parent.authority_urls),
|
148
|
+
identifiers: OpenStruct.new,
|
149
|
+
keywords: Array.new,
|
150
|
+
queryable?: queryable.to_bool || parent.queryable?.to_bool, # TODO
|
151
|
+
cascaded: cascaded.to_i || parent.cascaded.to_i, # TODO
|
152
|
+
opaque: opaque.to_bool || parent.opaque.to_bool, # TODO
|
153
|
+
no_subsets: no_subsets.to_bool || parent.no_subsets.to_bool, # TODO
|
154
|
+
fixed_width: fixed_width.to_i || parent.fixed_width.to_i, # TODO
|
155
|
+
fixed_height: fixed_height.to_i || parent.fixed_height.to_i, # TODO
|
156
|
+
min_scale: parent.min_scale,
|
157
|
+
max_scale: parent.max_scale,
|
158
|
+
attribution: parent.attribution
|
159
|
+
}
|
160
|
+
)
|
161
|
+
|
162
|
+
obj.nested_layers ||= Array.new
|
163
|
+
obj.nested_layers << layer
|
164
|
+
layer.capability = capability
|
165
|
+
read_child_nodes(node, layer)
|
166
|
+
layer.delete_field(:capability)
|
167
|
+
|
168
|
+
unless layer.name.nil? || layer.name.strip == ''
|
169
|
+
parts = layer.name.split(':')
|
170
|
+
request = capability.request
|
171
|
+
gfi = request.getfeatureinfo
|
172
|
+
|
173
|
+
if parts.length > 0
|
174
|
+
layer.prefix = parts.first
|
175
|
+
end
|
176
|
+
capability.layers << layer
|
177
|
+
|
178
|
+
if layer.formats.nil?
|
179
|
+
layer.formats = request.getmap.formats
|
180
|
+
end
|
181
|
+
|
182
|
+
if layer.info_formats.nil? && gfi
|
183
|
+
layer.info_formats = gfi.formats
|
184
|
+
end
|
185
|
+
end
|
186
|
+
#
|
187
|
+
# Handle layer name
|
188
|
+
#
|
189
|
+
},
|
190
|
+
'Request' => lambda { |node, obj|
|
191
|
+
obj.request = OpenStruct.new
|
192
|
+
read_child_nodes(node, obj.request)
|
193
|
+
},
|
194
|
+
'KeywordList' => lambda { |node, obj|
|
195
|
+
read_child_nodes(node, obj)
|
196
|
+
},
|
197
|
+
'Style' => lambda { |node, obj|
|
198
|
+
style = OpenStruct.new
|
199
|
+
obj.styles << style
|
200
|
+
read_child_nodes(node, style)
|
201
|
+
},
|
202
|
+
'SRS' => lambda { |node, obj|
|
203
|
+
get_srs(node, obj)
|
204
|
+
#obj.srs[child_value(node)] = true
|
205
|
+
}
|
206
|
+
|
207
|
+
}
|
208
|
+
})
|
209
|
+
end
|
210
|
+
|
211
|
+
def get_srs(node, obj)
|
212
|
+
obj.srs ||= Hash.new
|
213
|
+
obj.srs[child_value(node)] = true
|
214
|
+
end
|
215
|
+
|
216
|
+
def get_bounding_box(node, obj)
|
217
|
+
bbox = OpenStruct.new
|
218
|
+
bbox.bbox = [
|
219
|
+
node['minx'].to_f,
|
220
|
+
node['miny'].to_f,
|
221
|
+
node['maxx'].to_f,
|
222
|
+
node['maxy'].to_f
|
223
|
+
]
|
224
|
+
|
225
|
+
res = OpenStruct.new
|
226
|
+
res.x = node['resx'].to_f if node['resx']
|
227
|
+
res.y = node['resy'].to_f if node['resy']
|
228
|
+
|
229
|
+
bbox.res = res unless res.x.nil? || res.y.nil?
|
230
|
+
|
231
|
+
# obj.bbox = bbox
|
232
|
+
# obj
|
233
|
+
bbox
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module ROGC
|
2
|
+
module Formats
|
3
|
+
module WMSCapabilities
|
4
|
+
class V1_1 < V1
|
5
|
+
def initialize
|
6
|
+
super
|
7
|
+
@xml_readers = xml_readers.merge({ 'wms' => xml_readers['wms'].merge({
|
8
|
+
'WMT_MS_Capabilities' => lambda { |node, obj|
|
9
|
+
read_child_nodes(node, obj)
|
10
|
+
},
|
11
|
+
'Keyword' => lambda { |node, obj|
|
12
|
+
obj.keywords ||= Array.new
|
13
|
+
obj.keywords << child_value(node)
|
14
|
+
},
|
15
|
+
'DescribeLayer' => lambda { |node, obj|
|
16
|
+
obj.describelayer = OpenStruct.new({ formats: Array.new })
|
17
|
+
read_child_nodes(node, obj.describelayer)
|
18
|
+
},
|
19
|
+
'GetLegendGraphic' => lambda { |node, obj|
|
20
|
+
obj.getlegendgraphic = OpenStruct.new({ formats: Array.new })
|
21
|
+
read_child_nodes(node, obj.getlegendgraphic)
|
22
|
+
},
|
23
|
+
'GetStyles' => lambda { |node, obj|
|
24
|
+
obj.getstyles = OpenStruct.new({ formats: Array.new })
|
25
|
+
read_child_nodes(node, obj.getstyles)
|
26
|
+
},
|
27
|
+
'PutStyles' => lambda { |node, obj|
|
28
|
+
obj.putstyles = OpenStruct.new({ formats: Array.new })
|
29
|
+
read_child_nodes(node, obj.putstyles)
|
30
|
+
},
|
31
|
+
'UserDefinedSymbolization' => lambda { |node, obj|
|
32
|
+
obj.user_symbols = OpenStruct.new({
|
33
|
+
supports_SLD: node['SupportSLD'].to_i == 1,
|
34
|
+
user_layer: node['UserLayer'].to_i == 1,
|
35
|
+
user_style: node['UserStyle'].to_i == 1,
|
36
|
+
remote_WFS: node['RemoteWFS'].to_i == 1
|
37
|
+
})
|
38
|
+
},
|
39
|
+
'LatLonBoundingBox' => lambda { |node, obj|
|
40
|
+
obj.llbox = [
|
41
|
+
node['minx'].to_f,
|
42
|
+
node['miny'].to_f,
|
43
|
+
node['maxx'].to_f,
|
44
|
+
node['maxy'].to_f
|
45
|
+
]
|
46
|
+
},
|
47
|
+
'BoundingBox' => lambda { |node, obj|
|
48
|
+
# raise super['wms']['BOundingBox'].inspect
|
49
|
+
bbox = get_bounding_box(node, obj)
|
50
|
+
# bbox = obj.bbox
|
51
|
+
bbox.srs = node['SRS']
|
52
|
+
obj.bbox ||= {}
|
53
|
+
obj.bbox[bbox.srs] = bbox
|
54
|
+
|
55
|
+
obj.bbox
|
56
|
+
}
|
57
|
+
|
58
|
+
}) })
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module ROGC
|
2
|
+
module Formats
|
3
|
+
module WMSCapabilities
|
4
|
+
class V1_3 < ::ROGC::Formats::WMSCapabilities::V1_1
|
5
|
+
|
6
|
+
READERS_v1_3 = {
|
7
|
+
'wms' => {
|
8
|
+
'WMS_Capabilities' => lambda { |node, obj|
|
9
|
+
read_child_nodes(node, obj)
|
10
|
+
}
|
11
|
+
}
|
12
|
+
}
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
super
|
16
|
+
#@xml_readers= xml_readers.merge(
|
17
|
+
# 'wms' => READERS_v1_3_0['wms']
|
18
|
+
#)
|
19
|
+
@xml_readers= xml_readers.merge( {
|
20
|
+
'wms' => @xml_readers['wms'].merge({
|
21
|
+
'WMS_Capabilities' => lambda { |node, obj|
|
22
|
+
read_child_nodes(node, obj)
|
23
|
+
},
|
24
|
+
'LayerLimit' => lambda { |node, obj|
|
25
|
+
obj.layer_limit = child_value(node).to_i
|
26
|
+
},
|
27
|
+
'MaxWidth' => lambda { |node, obj|
|
28
|
+
obj.layer_limit = child_value(node).to_i
|
29
|
+
},
|
30
|
+
'MaxHeight' => lambda { |node, obj|
|
31
|
+
obj.layer_limit = child_value(node).to_i
|
32
|
+
},
|
33
|
+
'BoundingBox' => lambda { |node, obj|
|
34
|
+
# raise super['wms']['BOundingBox'].inspect
|
35
|
+
bbox = get_bounding_box(node, obj)
|
36
|
+
bbox.srs = node['CRS']
|
37
|
+
obj.bbox ||= {}
|
38
|
+
obj.bbox[bbox.srs] = bbox
|
39
|
+
|
40
|
+
obj.bbox
|
41
|
+
},
|
42
|
+
'CRS' => lambda { |node, obj|
|
43
|
+
get_srs(node, obj)
|
44
|
+
},
|
45
|
+
'EX_GeographicBoundingBox' => lambda { |node, obj|
|
46
|
+
# replacement of LatLonBoundingBox
|
47
|
+
obj.llbbox = [];
|
48
|
+
read_child_nodes(node, obj.llbbox)
|
49
|
+
},
|
50
|
+
'westBoundLongitude' => lambda { |node, obj|
|
51
|
+
obj[0] = child_value(node)
|
52
|
+
},
|
53
|
+
'eastBoundLongitude' => lambda { |node, obj|
|
54
|
+
obj[2] = child_value(node)
|
55
|
+
},
|
56
|
+
'southBoundLatitude' => lambda { |node, obj|
|
57
|
+
obj[1] = child_value(node)
|
58
|
+
},
|
59
|
+
'northBoundLatitude' => lambda { |node, obj|
|
60
|
+
obj[3] = child_value(node)
|
61
|
+
},
|
62
|
+
'MinScaleDenominator' => lambda { |node, obj|
|
63
|
+
# obj.maxScale = parseFloat(this.getChildValue(node)).toPrecision(16);
|
64
|
+
obj.max_scale = child_value(node).to_f.round(16)
|
65
|
+
},
|
66
|
+
'MaxScaleDenominator' => lambda { |node, obj|
|
67
|
+
# obj.minScale = parseFloat(this.getChildValue(node)).toPrecision(16);
|
68
|
+
obj.max_scale = child_value(node).to_f.round(16)
|
69
|
+
},
|
70
|
+
'Keyword' => lambda { |node, obj|
|
71
|
+
keyword = {
|
72
|
+
'value' => child_value(node),
|
73
|
+
'vocabulary' => node['vocabulary']
|
74
|
+
}
|
75
|
+
|
76
|
+
obj.keywords << keyword if (obj.keywords)
|
77
|
+
}
|
78
|
+
})
|
79
|
+
})
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'libxml'
|
2
|
+
require 'open-uri'
|
3
|
+
require 'ostruct'
|
4
|
+
require 'active_support/all'
|
5
|
+
|
6
|
+
unless Object.respond_to?(:blank)
|
7
|
+
class Object
|
8
|
+
def blank?
|
9
|
+
respond_to?(:empty?) ? empty? : !self
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
unless Object.respond_to?(:to_bool)
|
15
|
+
class Object
|
16
|
+
def to_bool
|
17
|
+
return false if self == false || self.blank? || self.to_s =~ (/(false|f|no|n|0)$/i)
|
18
|
+
return true if self == true || self.to_s =~ (/(true|t|yes|y|1)$/i)
|
19
|
+
raise ArgumentError.new("invalid value for Boolean: \"#{self}\"")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
# TODO: OnlineResource
|
26
|
+
#
|
27
|
+
|
28
|
+
module ROGC
|
29
|
+
module Formats
|
30
|
+
module XML
|
31
|
+
class Base
|
32
|
+
|
33
|
+
# class_attribute :readers
|
34
|
+
cattr_accessor :namespace_alias, :default_prefix, :xmldom
|
35
|
+
|
36
|
+
attr_accessor :xml_readers
|
37
|
+
|
38
|
+
def initialize
|
39
|
+
# @io = io
|
40
|
+
# @parser = LibXML::XML::Parser.io(io)
|
41
|
+
# @raw = @parser.parse
|
42
|
+
# @capabilities = OpenStruct.new
|
43
|
+
# @root = @raw.root
|
44
|
+
# self.class.read_node(@root, @capabilities)
|
45
|
+
@xml_readers = {}
|
46
|
+
end
|
47
|
+
|
48
|
+
# class << self
|
49
|
+
def read_node(node, obj)
|
50
|
+
if (obj.nil?)
|
51
|
+
obj = OpenStruct.new
|
52
|
+
end
|
53
|
+
|
54
|
+
# reader = self.readers['wms'][node.name]
|
55
|
+
reader = xml_readers['wms'][node.name]
|
56
|
+
if (reader)
|
57
|
+
reader.call(node, obj)
|
58
|
+
end
|
59
|
+
obj
|
60
|
+
end
|
61
|
+
|
62
|
+
def read_child_nodes(node, obj)
|
63
|
+
if (obj.nil?)
|
64
|
+
obj = OpenStruct.new
|
65
|
+
end
|
66
|
+
|
67
|
+
children = node.children
|
68
|
+
children.each do |child|
|
69
|
+
if (child.node_type == 1)
|
70
|
+
read_node(child, obj)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
obj
|
75
|
+
end
|
76
|
+
|
77
|
+
def child_value(node, default = nil)
|
78
|
+
value = default || ""
|
79
|
+
|
80
|
+
node.each do |child|
|
81
|
+
case child.node_type
|
82
|
+
when 3,4 # Text: 3 or CDATA: 4 use cdata? or text?
|
83
|
+
value << child.content
|
84
|
+
end
|
85
|
+
end
|
86
|
+
value.strip!
|
87
|
+
|
88
|
+
value
|
89
|
+
end
|
90
|
+
# end
|
91
|
+
|
92
|
+
# def read_node(node, obj)
|
93
|
+
# self.class.read_node(node, obj)
|
94
|
+
# end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
@@ -0,0 +1,91 @@
|
|
1
|
+
module ROGC
|
2
|
+
module Formats
|
3
|
+
module XML
|
4
|
+
class VersionedOGC < Base
|
5
|
+
class << self
|
6
|
+
attr_accessor :version
|
7
|
+
end
|
8
|
+
|
9
|
+
cattr_accessor :profile, :default_version
|
10
|
+
|
11
|
+
self.version = nil
|
12
|
+
|
13
|
+
parser = nil
|
14
|
+
default_version = nil
|
15
|
+
profile = nil
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
super
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_version(root, options = {})
|
22
|
+
lversion = nil
|
23
|
+
|
24
|
+
unless root.nil?
|
25
|
+
lversion = self.class.version
|
26
|
+
if lversion.nil?
|
27
|
+
lversion = root['version']
|
28
|
+
lversion ||= default_version
|
29
|
+
end
|
30
|
+
else
|
31
|
+
lversion = options[:version] || self.version || self.default_version
|
32
|
+
end
|
33
|
+
lversion
|
34
|
+
end
|
35
|
+
|
36
|
+
def get_parser(version)
|
37
|
+
version ||= default_version
|
38
|
+
profile = self.profile.nil? ? "" : "_" + self.profile
|
39
|
+
|
40
|
+
if @parser.nil? || @parser.class.version != version
|
41
|
+
# version = 1
|
42
|
+
# format = "ROGC::Formats::WMSCapabilities::V#{version}".constantize
|
43
|
+
parser_class_name = "V#{version.to_s.gsub(/\./, "_")}" + profile
|
44
|
+
begin
|
45
|
+
format = "#{self.class.name.deconstantize}::#{parser_class_name}".constantize
|
46
|
+
rescue
|
47
|
+
format = nil
|
48
|
+
end
|
49
|
+
if format.nil?
|
50
|
+
if !profile.empty? && self.allow_fallback
|
51
|
+
profile = ""
|
52
|
+
parser_class_name = "V#{version.to_s.gsub(/\./, "_")}" + profile
|
53
|
+
begin
|
54
|
+
format = "#{self.class.name.deconstantize}::#{parser_class_name}".constantize
|
55
|
+
rescue
|
56
|
+
format = nil
|
57
|
+
end
|
58
|
+
end
|
59
|
+
if format.nil?
|
60
|
+
raise "Can't find a parser for version #{version} #{profile}"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
@parser = format.new
|
65
|
+
else
|
66
|
+
puts "Yahoo one parser"
|
67
|
+
end
|
68
|
+
|
69
|
+
@parser
|
70
|
+
end
|
71
|
+
|
72
|
+
def read(data, options = {})
|
73
|
+
if data.is_a?(String)
|
74
|
+
data = StringIO.new(data)
|
75
|
+
end
|
76
|
+
xml_parser = LibXML::XML::Parser.io(data)
|
77
|
+
xml = xml_parser.parse
|
78
|
+
root = xml.root
|
79
|
+
version = get_version(root)
|
80
|
+
|
81
|
+
parser = get_parser(version)
|
82
|
+
# puts parser.readers['wms']['Layer'].inspect
|
83
|
+
capabilities = OpenStruct.new
|
84
|
+
capabilities = parser.read_node(root, capabilities)
|
85
|
+
capabilities.version = version
|
86
|
+
capabilities
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
data/lib/rogc/version.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require 'formats'
|
4
|
+
require 'open-uri'
|
5
|
+
|
6
|
+
|
7
|
+
module ROGC
|
8
|
+
class WMSClient
|
9
|
+
def initialize(wms_url)
|
10
|
+
@wms_url = wms_url
|
11
|
+
@capabilities = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def capabilities
|
15
|
+
return @capabilities if @capabilities
|
16
|
+
doc = open(build_wms_url)
|
17
|
+
format = ROGC::Formats::WMSCapabilities::Base.new
|
18
|
+
|
19
|
+
@capabilities = format.read(doc)
|
20
|
+
@capabilities
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
def build_wms_url(request = 'GetCapabilities', version = "1.3.0", params = {})
|
25
|
+
params.merge!({
|
26
|
+
'service' => 'wms',
|
27
|
+
'request' => request,
|
28
|
+
'version' => version
|
29
|
+
})
|
30
|
+
|
31
|
+
query_string = params.map { |k,v| "#{k}=#{v}" }.join('&')
|
32
|
+
"#{@wms_url}?#{query_string}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/ruby-ogc.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'rogc'
|
data/ruby-ogc.gemspec
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/rogc/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Philippe HUET"]
|
6
|
+
gem.email = ["philippe@dotgee.fr"]
|
7
|
+
gem.description = %q{Ruby lib for OGC manipulations}
|
8
|
+
gem.summary = %q{Ruby lib for OGC manipulations}
|
9
|
+
gem.homepage = ""
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "ruby-ogc"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Ruby::Ogc::VERSION
|
17
|
+
|
18
|
+
gem.add_dependency "libxml-ruby"
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ruby-ogc
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Philippe HUET
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-01-24 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: libxml-ruby
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
description: Ruby lib for OGC manipulations
|
31
|
+
email:
|
32
|
+
- philippe@dotgee.fr
|
33
|
+
executables: []
|
34
|
+
extensions: []
|
35
|
+
extra_rdoc_files: []
|
36
|
+
files:
|
37
|
+
- .gitignore
|
38
|
+
- Gemfile
|
39
|
+
- LICENSE
|
40
|
+
- README.md
|
41
|
+
- Rakefile
|
42
|
+
- lib/rogc.rb
|
43
|
+
- lib/rogc/formats.rb
|
44
|
+
- lib/rogc/formats/formats.rb
|
45
|
+
- lib/rogc/formats/wms_capabilities.rb
|
46
|
+
- lib/rogc/formats/wms_capabilities/base.rb
|
47
|
+
- lib/rogc/formats/wms_capabilities/v1.rb
|
48
|
+
- lib/rogc/formats/wms_capabilities/v1_1.rb
|
49
|
+
- lib/rogc/formats/wms_capabilities/v1_1_1.rb
|
50
|
+
- lib/rogc/formats/wms_capabilities/v1_3.rb
|
51
|
+
- lib/rogc/formats/wms_capabilities/v1_3_0.rb
|
52
|
+
- lib/rogc/formats/xml.rb
|
53
|
+
- lib/rogc/formats/xml/base.rb
|
54
|
+
- lib/rogc/formats/xml/versioned_ogc.rb
|
55
|
+
- lib/rogc/version.rb
|
56
|
+
- lib/rogc/wms_client.rb
|
57
|
+
- lib/ruby-ogc.rb
|
58
|
+
- ruby-ogc.gemspec
|
59
|
+
homepage: ''
|
60
|
+
licenses: []
|
61
|
+
post_install_message:
|
62
|
+
rdoc_options: []
|
63
|
+
require_paths:
|
64
|
+
- lib
|
65
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
requirements: []
|
78
|
+
rubyforge_project:
|
79
|
+
rubygems_version: 1.8.21
|
80
|
+
signing_key:
|
81
|
+
specification_version: 3
|
82
|
+
summary: Ruby lib for OGC manipulations
|
83
|
+
test_files: []
|