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