Class: RGeo::WKRep::WKTGenerator
- Inherits:
-
Object
- Object
- RGeo::WKRep::WKTGenerator
- Defined in:
- lib/rgeo/wkrep/wkt_generator.rb
Overview
This class provides the functionality of serializing a geometry as WKT (well-known text) format. You may also customize the serializer to generate PostGIS EWKT extensions to the output, or to follow the Simple Features Specification 1.2 extensions for Z and M.
To use this class, create an instance with the desired settings and customizations, and call the generate method.
Configuration options
The following options are recognized. These can be passed to the constructor, or set on the object afterwards.
[:tag_format] The format for tags. Possible values are :wkt11, indicating SFS 1.1 WKT (i.e. no Z or M markers in the tags) but with Z and/or M values added in if they are present; :wkt11_strict, indicating SFS 1.1 WKT with Z and M dropped from the output (since WKT strictly does not support the Z or M dimensions); :ewkt, indicating the PostGIS EWKT extensions (i.e. "M" appended to tag names if M but not Z is present); or :wkt12, indicating SFS 1.2 WKT tags that indicate the presence of Z and M in a separate token. Default is :wkt11. [:emit_ewkt_srid] If true, embed the SRID of the toplevel geometry. Available only if :type_format is :ewkt. Default is false. [:square_brackets] If true, uses square brackets rather than parentheses. Default is false. [:convert_case] Possible values are :upper, which changes all letters in the output to ALL CAPS; :lower, which changes all letters to lower case; or nil, indicating no case changes from the default (which is not specified exactly, but is chosen by the generator to emphasize readability.) Default is nil.
Instance Method Summary collapse
-
#_generate_coords(obj_) ⇒ Object
:nodoc:.
-
#_generate_feature(obj_, toplevel_ = false) ⇒ Object
:nodoc:.
-
#_generate_geometry_collection(obj_) ⇒ Object
:nodoc:.
-
#_generate_line_string(obj_, contained_ = false) ⇒ Object
:nodoc:.
-
#_generate_multi_line_string(obj_) ⇒ Object
:nodoc:.
-
#_generate_multi_point(obj_) ⇒ Object
:nodoc:.
-
#_generate_multi_polygon(obj_) ⇒ Object
:nodoc:.
-
#_generate_point(obj_) ⇒ Object
:nodoc:.
-
#_generate_polygon(obj_, contained_ = false) ⇒ Object
:nodoc:.
-
#convert_case ⇒ Object
Returns the case for output.
-
#convert_case=(value_) ⇒ Object
Sets the case for output.
-
#emit_ewkt_srid=(value_) ⇒ Object
Sets whether SRID is embedded.
-
#emit_ewkt_srid? ⇒ Boolean
Returns whether SRID is embedded.
-
#generate(obj_) ⇒ Object
Generate and return the WKT format for the given geometry object, according to the current settings.
-
#initialize(opts_ = {}) ⇒ WKTGenerator
constructor
Create and configure a WKT generator.
-
#square_brackets=(value_) ⇒ Object
Sets whether square brackets rather than parens are output.
-
#square_brackets? ⇒ Boolean
Returns whether square brackets rather than parens are output.
-
#tag_format ⇒ Object
Returns the format for type tags.
-
#tag_format=(value_) ⇒ Object
Sets the format for type tags.
Constructor Details
#initialize(opts_ = {}) ⇒ WKTGenerator
Create and configure a WKT generator. See the WKTGenerator documentation for the options that can be passed.
85 86 87 88 89 90 |
# File 'lib/rgeo/wkrep/wkt_generator.rb', line 85 def initialize(opts_={}) @tag_format = opts_[:tag_format] || :wkt11 @emit_ewkt_srid = opts_[:emit_ewkt_srid] ? true : false if @tag_format == :ewkt @square_brackets = opts_[:square_brackets] ? true : false @convert_case = opts_[:convert_case] end |
Instance Method Details
#_generate_coords(obj_) ⇒ Object
:nodoc:
203 204 205 206 207 208 |
# File 'lib/rgeo/wkrep/wkt_generator.rb', line 203 def _generate_coords(obj_) # :nodoc: str_ = "#{obj_.x.to_s} #{obj_.y.to_s}" str_ << " #{obj_.z.to_s}" if @cur_support_z str_ << " #{obj_.m.to_s}" if @cur_support_m str_ end |
#_generate_feature(obj_, toplevel_ = false) ⇒ Object
:nodoc:
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
# File 'lib/rgeo/wkrep/wkt_generator.rb', line 162 def _generate_feature(obj_, toplevel_=false) # :nodoc: type_ = obj_.geometry_type tag_ = type_.type_name if @tag_format == :ewkt if @cur_support_m && !@cur_support_z tag_ << 'M' end if toplevel_ && @emit_ewkt_srid tag_ = "SRID=#{obj_.srid};#{tag_}" end elsif @tag_format == :wkt12 if @cur_support_z if @cur_support_m tag_ << ' ZM' else tag_ << ' Z' end elsif @cur_support_m tag_ << ' M' end end if type_ == Feature::Point tag_ + _generate_point(obj_) elsif type_.subtype_of?(Feature::LineString) tag_ + _generate_line_string(obj_) elsif type_ == Feature::Polygon tag_ + _generate_polygon(obj_) elsif type_ == Feature::GeometryCollection tag_ + _generate_geometry_collection(obj_) elsif type_ == Feature::MultiPoint tag_ + _generate_multi_point(obj_) elsif type_ == Feature::MultiLineString tag_ + _generate_multi_line_string(obj_) elsif type_ == Feature::MultiPolygon tag_ + _generate_multi_polygon(obj_) else raise Error::ParseError, "Unrecognized geometry type: #{type_}" end end |
#_generate_geometry_collection(obj_) ⇒ Object
:nodoc:
234 235 236 237 238 239 240 |
# File 'lib/rgeo/wkrep/wkt_generator.rb', line 234 def _generate_geometry_collection(obj_) # :nodoc: if obj_.is_empty? ' EMPTY' else "#{@begin_bracket}#{obj_.map{ |f_| _generate_feature(f_) }.join(',')}#{@end_bracket}" end end |
#_generate_line_string(obj_, contained_ = false) ⇒ Object
:nodoc:
216 217 218 219 220 221 222 |
# File 'lib/rgeo/wkrep/wkt_generator.rb', line 216 def _generate_line_string(obj_, contained_=false) # :nodoc: if obj_.is_empty? contained_ ? 'EMPTY' : ' EMPTY' else "#{@begin_bracket}#{obj_.points.map{ |p_| _generate_coords(p_) }.join(',')}#{@end_bracket}" end end |
#_generate_multi_line_string(obj_) ⇒ Object
:nodoc:
252 253 254 255 256 257 258 |
# File 'lib/rgeo/wkrep/wkt_generator.rb', line 252 def _generate_multi_line_string(obj_) # :nodoc: if obj_.is_empty? " EMPTY" else "#{@begin_bracket}#{obj_.map{ |f_| _generate_line_string(f_, true) }.join(',')}#{@end_bracket}" end end |
#_generate_multi_point(obj_) ⇒ Object
:nodoc:
243 244 245 246 247 248 249 |
# File 'lib/rgeo/wkrep/wkt_generator.rb', line 243 def _generate_multi_point(obj_) # :nodoc: if obj_.is_empty? " EMPTY" else "#{@begin_bracket}#{obj_.map{ |f_| _generate_point(f_) }.join(',')}#{@end_bracket}" end end |
#_generate_multi_polygon(obj_) ⇒ Object
:nodoc:
261 262 263 264 265 266 267 |
# File 'lib/rgeo/wkrep/wkt_generator.rb', line 261 def _generate_multi_polygon(obj_) # :nodoc: if obj_.is_empty? " EMPTY" else "#{@begin_bracket}#{obj_.map{ |f_| _generate_polygon(f_, true) }.join(',')}#{@end_bracket}" end end |
#_generate_point(obj_) ⇒ Object
:nodoc:
211 212 213 |
# File 'lib/rgeo/wkrep/wkt_generator.rb', line 211 def _generate_point(obj_) # :nodoc: "#{@begin_bracket}#{_generate_coords(obj_)}#{@end_bracket}" end |
#_generate_polygon(obj_, contained_ = false) ⇒ Object
:nodoc:
225 226 227 228 229 230 231 |
# File 'lib/rgeo/wkrep/wkt_generator.rb', line 225 def _generate_polygon(obj_, contained_=false) # :nodoc: if obj_.is_empty? contained_ ? 'EMPTY' : ' EMPTY' else "#{@begin_bracket}#{([_generate_line_string(obj_.exterior_ring, true)] + obj_.interior_rings.map{ |r_| _generate_line_string(r_, true) }).join(',')}#{@end_bracket}" end end |
#convert_case ⇒ Object
Returns the case for output. See WKTGenerator for details.
127 128 129 |
# File 'lib/rgeo/wkrep/wkt_generator.rb', line 127 def convert_case @convert_case end |
#convert_case=(value_) ⇒ Object
Sets the case for output. See WKTGenerator for details.
132 133 134 |
# File 'lib/rgeo/wkrep/wkt_generator.rb', line 132 def convert_case=(value_) @convert_case = value_ end |
#emit_ewkt_srid=(value_) ⇒ Object
Sets whether SRID is embedded. Available only when the tag_format is :ewkt. See WKTGenerator for details.
110 111 112 |
# File 'lib/rgeo/wkrep/wkt_generator.rb', line 110 def emit_ewkt_srid=(value_) @emit_ewkt_srid = @type_format == :ewkt && value_ end |
#emit_ewkt_srid? ⇒ Boolean
Returns whether SRID is embedded. See WKTGenerator for details.
104 105 106 |
# File 'lib/rgeo/wkrep/wkt_generator.rb', line 104 def emit_ewkt_srid? @emit_ewkt_srid end |
#generate(obj_) ⇒ Object
Generate and return the WKT format for the given geometry object, according to the current settings.
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
# File 'lib/rgeo/wkrep/wkt_generator.rb', line 140 def generate(obj_) @begin_bracket = @square_brackets ? '[' : '(' @end_bracket = @square_brackets ? ']' : ')' factory_ = obj_.factory if @tag_format == :wkt11_strict @cur_support_z = nil @cur_support_m = nil else @cur_support_z = factory_.property(:has_z_coordinate) @cur_support_m = factory_.property(:has_m_coordinate) end str_ = _generate_feature(obj_, true) if @convert_case == :upper str_.upcase elsif @convert_case == :lower str_.downcase else str_ end end |
#square_brackets=(value_) ⇒ Object
Sets whether square brackets rather than parens are output. See WKTGenerator for details.
122 123 124 |
# File 'lib/rgeo/wkrep/wkt_generator.rb', line 122 def square_brackets=(value_) @square_brackets = value_ ? true : false end |
#square_brackets? ⇒ Boolean
Returns whether square brackets rather than parens are output. See WKTGenerator for details.
116 117 118 |
# File 'lib/rgeo/wkrep/wkt_generator.rb', line 116 def square_brackets? @square_brackets end |
#tag_format ⇒ Object
Returns the format for type tags. See WKTGenerator for details.
94 95 96 |
# File 'lib/rgeo/wkrep/wkt_generator.rb', line 94 def tag_format @tag_format end |
#tag_format=(value_) ⇒ Object
Sets the format for type tags. See WKTGenerator for details.
99 100 101 |
# File 'lib/rgeo/wkrep/wkt_generator.rb', line 99 def tag_format=(value_) @tag_format = value_ end |