ruby-ogc 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in ruby-ogc.gemspec
4
+ gemspec
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.
@@ -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
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
@@ -0,0 +1,3 @@
1
+ require "rogc/version"
2
+ require "rogc/formats"
3
+ require "rogc/wms_client"
@@ -0,0 +1,4 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+
3
+ require 'formats/xml'
4
+ require 'formats/wms_capabilities'
@@ -0,0 +1,8 @@
1
+ require 'xml/base'
2
+ require 'xml/versioned_ogc'
3
+ require 'wms_capabilities/base'
4
+ require 'wms_capabilities/v1'
5
+ require 'wms_capabilities/v1_1'
6
+ require 'wms_capabilities/v1_1_1'
7
+ require 'wms_capabilities/v1_3'
8
+ require 'wms_capabilities/v1_3_0'
@@ -0,0 +1,8 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+
3
+ require 'wms_capabilities/base'
4
+ require 'wms_capabilities/v1'
5
+ require 'wms_capabilities/v1_1'
6
+ require 'wms_capabilities/v1_1_1'
7
+ require 'wms_capabilities/v1_3'
8
+ require 'wms_capabilities/v1_3_0'
@@ -0,0 +1,11 @@
1
+ module ROGC
2
+ module Formats
3
+ module WMSCapabilities
4
+ class Base < ::ROGC::Formats::XML::VersionedOGC
5
+ def initialize
6
+ super
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -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,14 @@
1
+ module ROGC
2
+ module Formats
3
+ module WMSCapabilities
4
+ class V1_1_1 < V1_1
5
+ self.version = '1.1.1'
6
+
7
+ def initialize
8
+ super
9
+ @xml_readers = xml_readers.merge({ 'wms' => @xml_readers['wms'].merge({}) })
10
+ end
11
+ end
12
+ end
13
+ end
14
+ 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,13 @@
1
+ module ROGC
2
+ module Formats
3
+ module WMSCapabilities
4
+ class V1_3_0 < ::ROGC::Formats::WMSCapabilities::V1_3
5
+ self.version = '1.3.0'
6
+
7
+ def initialize
8
+ super
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,4 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+
3
+ require 'xml/base'
4
+ require 'xml/versioned_ogc'
@@ -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
@@ -0,0 +1,5 @@
1
+ module Ruby
2
+ module Ogc
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -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
@@ -0,0 +1 @@
1
+ require 'rogc'
@@ -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: []