class GeoRuby::SimpleFeatures::EWKBParser
Parses EWKB strings and notifies of events (such as the beginning of the definition of geometry, the value of the SRID…) the factory passed as argument to the constructor.
Example¶ ↑
factory = GeometryFactory::new
ewkb_parser = EWKBParser::new(factory)
ewkb_parser.parse(<EWKB String>) geometry = @factory.geometry
You can also use directly the static method Geometry.from_ewkb
Public Class Methods
new(factory)
click to toggle source
# File lib/geo_ruby/ewk/ewkb_parser.rb, line 17 def initialize(factory) @factory = factory end
Public Instance Methods
parse(ewkb)
click to toggle source
Parses the ewkb string passed as argument and notifies the factory of events
# File lib/geo_ruby/ewk/ewkb_parser.rb, line 22 def parse(ewkb) @factory.reset @with_z = false @with_m = false @unpack_structure = UnpackStructure.new(ewkb) parse_geometry @unpack_structure.done @srid = nil end
Private Instance Methods
parse_geometry()
click to toggle source
# File lib/geo_ruby/ewk/ewkb_parser.rb, line 34 def parse_geometry @unpack_structure.endianness = @unpack_structure.read_byte geometry_type = @unpack_structure.read_uint if (geometry_type & Z_MASK) != 0 @with_z = true geometry_type = geometry_type & ~Z_MASK end if (geometry_type & M_MASK) != 0 @with_m = true geometry_type = geometry_type & ~M_MASK end if (geometry_type & SRID_MASK) != 0 @srid = @unpack_structure.read_uint geometry_type = geometry_type & ~SRID_MASK else # to manage multi geometries : the srid is not present in sub_geometries, therefore we take the srid of the parent ; if it is the root, we take the default srid @srid ||= DEFAULT_SRID end case geometry_type when 1 parse_point when 2 parse_line_string when 3 parse_polygon when 4 parse_multi_point when 5 parse_multi_line_string when 6 parse_multi_polygon when 7 parse_geometry_collection else fail EWKBFormatError.new('Unknown geometry type') end end
parse_geometry_collection()
click to toggle source
# File lib/geo_ruby/ewk/ewkb_parser.rb, line 74 def parse_geometry_collection parse_multi_geometries(GeometryCollection) end
parse_line_string()
click to toggle source
# File lib/geo_ruby/ewk/ewkb_parser.rb, line 108 def parse_line_string parse_point_list(LineString) end
parse_linear_ring()
click to toggle source
# File lib/geo_ruby/ewk/ewkb_parser.rb, line 104 def parse_linear_ring parse_point_list(LinearRing) end
parse_multi_geometries(geometry_type)
click to toggle source
# File lib/geo_ruby/ewk/ewkb_parser.rb, line 90 def parse_multi_geometries(geometry_type) @factory.begin_geometry(geometry_type, @srid) num_geometries = @unpack_structure.read_uint 1.upto(num_geometries) { parse_geometry } @factory.end_geometry(@with_z, @with_m) end
parse_multi_line_string()
click to toggle source
# File lib/geo_ruby/ewk/ewkb_parser.rb, line 82 def parse_multi_line_string parse_multi_geometries(MultiLineString) end
parse_multi_point()
click to toggle source
# File lib/geo_ruby/ewk/ewkb_parser.rb, line 86 def parse_multi_point parse_multi_geometries(MultiPoint) end
parse_multi_polygon()
click to toggle source
# File lib/geo_ruby/ewk/ewkb_parser.rb, line 78 def parse_multi_polygon parse_multi_geometries(MultiPolygon) end
parse_point()
click to toggle source
# File lib/geo_ruby/ewk/ewkb_parser.rb, line 120 def parse_point @factory.begin_geometry(Point, @srid) x, y = *@unpack_structure.read_point if ! (@with_z || @with_m) # most common case probably @factory.add_point_x_y(x, y) elsif @with_m && @with_z z = @unpack_structure.read_double m = @unpack_structure.read_double @factory.add_point_x_y_z_m(x, y, z, m) elsif @with_z z = @unpack_structure.read_double @factory.add_point_x_y_z(x, y, z) else m = @unpack_structure.read_double @factory.add_point_x_y_m(x, y, m) end @factory.end_geometry(@with_z, @with_m) end
parse_point_list(geometry_type)
click to toggle source
used to parse line_strings and linear_rings
# File lib/geo_ruby/ewk/ewkb_parser.rb, line 113 def parse_point_list(geometry_type) @factory.begin_geometry(geometry_type, @srid) num_points = @unpack_structure.read_uint 1.upto(num_points) { parse_point } @factory.end_geometry(@with_z, @with_m) end
parse_polygon()
click to toggle source
# File lib/geo_ruby/ewk/ewkb_parser.rb, line 97 def parse_polygon @factory.begin_geometry(Polygon, @srid) num_linear_rings = @unpack_structure.read_uint 1.upto(num_linear_rings) { parse_linear_ring } @factory.end_geometry(@with_z, @with_m) end