Module: EsriShapefile::ByteModel::ClassMethods

Defined in:
lib/esri_shapefile/byte_model.rb

Instance Method Summary collapse

Instance Method Details

#field(name, number: nil, position:, type:, byte_order:) ⇒ Object



17
18
19
20
# File 'lib/esri_shapefile/byte_model.rb', line 17

def field(name, number: nil, position:, type:, byte_order:)
  attr_accessor name unless name == :unused
  fields << Field.new(name, position: position, type: type, byte_order: byte_order, number: number)
end

#fieldsObject



22
23
24
# File 'lib/esri_shapefile/byte_model.rb', line 22

def fields
  @fields ||= []
end

#from_bytes(bytes) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/esri_shapefile/byte_model.rb', line 26

def from_bytes(bytes)
  field_values = {}
  fields.reduce(0) do |offset, field|
    if !field.unused?
      unpack_format = field.unpack_format(field_values)
      field_value = bytes.unpack("@#{offset}#{unpack_format}")

      if field.type == :point
        field_value = field_value.each_slice(2).map do |x, y|
          point = Shapes::Point.new
          point.x = x
          point.y = y
          point
        end
      end

      field_values[field.name] = field.list? ? field_value : field_value.first
    end

    offset += field.bytesize(field_values)
    (offset < bytes.size) ? offset : break
  end

  field_values.reduce(self.new) do |model, (field, value)|
    model.send("#{field}=", value)
  model
  end
end