Module: EsriShapefile::ByteModel::ClassMethods
- Defined in:
- lib/esri_shapefile/byte_model.rb
Instance Method Summary collapse
- #field(name, number: nil, position:, type:, byte_order:) ⇒ Object
- #fields ⇒ Object
- #from_bytes(bytes) ⇒ Object
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 |
#fields ⇒ Object
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 |