ffi-gdal 1.0.0.beta6 → 1.0.0.beta7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +40 -0
  3. data/bitbucket-pipelines.yml +16 -0
  4. data/lib/ffi/gdal/version.rb +1 -1
  5. data/lib/ffi/gdal/warp_options.rb +18 -4
  6. data/lib/ffi/gdal/warper.rb +17 -1
  7. data/lib/ffi/gdal.rb +1 -1
  8. data/lib/gdal/color_entry_mixins/extensions.rb +0 -14
  9. data/lib/gdal/color_table_mixins/extensions.rb +0 -14
  10. data/lib/gdal/dataset_mixins/algorithm_methods.rb +2 -2
  11. data/lib/gdal/dataset_mixins/extensions.rb +3 -43
  12. data/lib/gdal/dataset_mixins/warp_methods.rb +50 -11
  13. data/lib/gdal/geo_transform_mixins/extensions.rb +0 -17
  14. data/lib/gdal/grid.rb +2 -1
  15. data/lib/gdal/gridder/point_extracting.rb +1 -2
  16. data/lib/gdal/gridder.rb +7 -2
  17. data/lib/gdal/options.rb +14 -13
  18. data/lib/gdal/raster_attribute_table_mixins/extensions.rb +0 -15
  19. data/lib/gdal/raster_band.rb +5 -3
  20. data/lib/gdal/raster_band_classifier.rb +5 -3
  21. data/lib/gdal/raster_band_mixins/extensions.rb +0 -35
  22. data/lib/gdal/raster_band_mixins/io_extensions.rb +4 -3
  23. data/lib/gdal/warp_options.rb +99 -35
  24. data/lib/gdal.rb +1 -0
  25. data/lib/ogr/data_source_extensions.rb +0 -19
  26. data/lib/ogr/envelope_extensions.rb +0 -22
  27. data/lib/ogr/feature_definition_extensions.rb +0 -18
  28. data/lib/ogr/feature_extensions.rb +0 -27
  29. data/lib/ogr/field_definition.rb +0 -3
  30. data/lib/ogr/geometry.rb +0 -1
  31. data/lib/ogr/geometry_field_definition.rb +0 -4
  32. data/lib/ogr/geometry_mixins/extensions.rb +0 -29
  33. data/lib/ogr/geometry_types/curve.rb +1 -1
  34. data/lib/ogr/layer.rb +3 -1
  35. data/lib/ogr/layer_mixins/extensions.rb +1 -25
  36. data/lib/ogr/spatial_reference.rb +10 -2
  37. data/lib/ogr/spatial_reference_extensions.rb +0 -26
  38. data/lib/ogr/style_table_extensions.rb +0 -10
  39. data/spec/integration/gdal/raster_band_info_spec.rb +27 -5
  40. data/spec/integration/ogr/layer_spec.rb +0 -6
  41. data/spec/support/images/123.tiff +0 -0
  42. data/spec/unit/ffi/gdal_spec.rb +1 -0
  43. data/spec/unit/gdal/dataset_mixins/warp_methods_spec.rb +52 -0
  44. data/spec/unit/gdal/geo_transform_spec.rb +0 -13
  45. data/spec/unit/gdal/grid_spec.rb +8 -0
  46. data/spec/unit/gdal/gridder_spec.rb +40 -0
  47. data/spec/unit/gdal/options_spec.rb +26 -1
  48. data/spec/unit/gdal/warp_options_spec.rb +336 -0
  49. data/spec/unit/ogr/feature_definition_spec.rb +0 -19
  50. data/spec/unit/ogr/feature_extensions_spec.rb +1 -1
  51. data/spec/unit/ogr/field_definition_spec.rb +0 -19
  52. data/spec/unit/ogr/geometry_field_definition_spec.rb +0 -16
  53. data/spec/unit/ogr/style_table_spec.rb +0 -26
  54. metadata +10 -5
  55. data/lib/ogr/field_definition_extensions.rb +0 -22
  56. data/lib/ogr/geometry_field_definition_extensions.rb +0 -19
@@ -24,6 +24,7 @@ module GDAL
24
24
  # @param pixel_array [NArray] The 2d list of pixels.
25
25
  def write_xy_narray(pixel_array)
26
26
  data_pointer = FFI::MemoryPointer.new(:buffer_out, block_buffer_size)
27
+ read_start = 0
27
28
 
28
29
  block_count[:y].times do |y_block_number|
29
30
  block_count[:x].times do |x_block_number|
@@ -31,14 +32,14 @@ module GDAL
31
32
  x_block_size = calculate_x_block_size(x_block_number)
32
33
 
33
34
  pixel_count_per_block = x_block_size * y_block_size
34
- read_offset = (y_block_number + 1) * (x_block_number + 1)
35
- read_range = ((read_offset - 1) * pixel_count_per_block)...(read_offset * pixel_count_per_block)
35
+ read_range = (read_start...(read_start + pixel_count_per_block))
36
36
  pixels = pixel_array[read_range]
37
37
  GDAL._write_pointer(data_pointer, data_type, pixels.to_a)
38
38
 
39
39
  write_block(x_block_number, y_block_number, data_pointer)
40
40
 
41
41
  data_pointer.clear
42
+ read_start = read_range.end
42
43
  end
43
44
  end
44
45
  end
@@ -69,7 +70,7 @@ module GDAL
69
70
  # Determines not only x and y block counts (how many blocks there are in
70
71
  # the raster band when using GDAL's suggested block size), but remainder
71
72
  # x and y counts for when the total number of pixels and lines does not
72
- # divide evently using GDAL's block count.
73
+ # divide evenly using GDAL's block count.
73
74
  #
74
75
  # @return [Hash{x => Fixnum, x_remainder => Fixnum, y => Fixnum,
75
76
  # y_remainder => Fixnum}]
@@ -3,12 +3,28 @@ require_relative '../gdal'
3
3
  module GDAL
4
4
  class WarpOptions
5
5
  attr_reader :c_struct
6
+ attr_reader :source_dataset
7
+ attr_reader :destination_dataset
8
+ attr_reader :cutline
6
9
 
7
10
  def initialize(options = {})
8
11
  @c_struct = FFI::GDAL::WarpOptions.new
9
-
10
- options.keys do |k|
11
- @c_struct[k] = options[k]
12
+ @source_dataset = nil
13
+ @destination_dataset = nil
14
+
15
+ options.each_key do |k|
16
+ assign_meth = "#{k}=".to_sym
17
+
18
+ begin
19
+ if respond_to?(assign_meth)
20
+ send(assign_meth, options[k])
21
+ else
22
+ @c_struct[k] = options[k]
23
+ end
24
+ rescue ArgumentError => ex
25
+ new_message = "#{k}; #{ex.message}"
26
+ raise $ERROR_INFO, new_message, $ERROR_INFO.backtrace
27
+ end
12
28
  end
13
29
  end
14
30
 
@@ -21,42 +37,40 @@ module GDAL
21
37
  @c_struct[:warp_operation_options] = GDAL::Options.pointer(options)
22
38
  end
23
39
 
24
- # @param limit [Float]
25
- def warp_memory_limit=(limit)
26
- @c_struct[:warp_memory_limit] = limit
27
- end
40
+ # @return [Hash]
41
+ def warp_operation_options
42
+ options = @c_struct[:warp_operation_options]
28
43
 
29
- # @param algorithm_type [FFI::GDAL::Warper::ResampleAlg]
30
- def resample_algorithm=(algorithm_type)
31
- @c_struct[:resample_alg] = algorithm_type
32
- end
33
-
34
- # @param data_type [FFI::GDAL::GDAL::DataType]
35
- def working_data_type=(data_type)
36
- @c_struct[:working_data_type] = data_type
44
+ GDAL::Options.to_hash(options)
37
45
  end
38
46
 
39
47
  # @param dataset [GDAL::Dataset]
40
48
  def source_dataset=(dataset)
49
+ @source_dataset = dataset
41
50
  @c_struct[:source_dataset] = dataset.c_pointer
42
51
  end
43
52
 
44
53
  # @param dataset [GDAL::Dataset]
45
54
  def destination_dataset=(dataset)
55
+ @destination_dataset = dataset
46
56
  @c_struct[:destination_dataset] = dataset.c_pointer
47
57
  end
48
58
 
49
- # @param count [Fixnum]
50
- def band_count=(count)
51
- @c_struct[:band_count] = count
52
- end
53
-
54
59
  # @param band_numbers [Array<Fixnum>]
55
60
  def source_bands=(band_numbers)
56
- bands_ptr = FFI::MemoryPointer.new(:pointer, band_numbers.length)
61
+ bands_ptr = FFI::MemoryPointer.new(:int, band_numbers.length)
57
62
  bands_ptr.write_array_of_int(band_numbers)
58
63
 
59
64
  @c_struct[:source_bands] = bands_ptr
65
+ @c_struct[:band_count] = band_numbers.length if band_numbers.length > @c_struct[:band_count]
66
+ end
67
+
68
+ # @return [Array<Fixnum>]
69
+ def source_bands
70
+ pointer = @c_struct[:source_bands]
71
+ return [] if pointer.null?
72
+
73
+ pointer.read_array_of_int(@c_struct[:band_count])
60
74
  end
61
75
 
62
76
  # @param band_numbers [Array<Fixnum>]
@@ -65,33 +79,32 @@ module GDAL
65
79
  bands_ptr.write_array_of_int(band_numbers)
66
80
 
67
81
  @c_struct[:destination_bands] = bands_ptr
82
+ @c_struct[:band_count] = band_numbers.length if band_numbers.length > @c_struct[:band_count]
68
83
  end
69
84
 
70
- def transformer_arg=(transformation_object)
71
- @c_struct[:transformer_arg] = transformation_object.c_pointer
85
+ # @return [Array<Fixnum>]
86
+ def destination_bands
87
+ pointer = @c_struct[:destination_bands]
88
+ return [] if pointer.null?
72
89
 
73
- @c_struct[:transformer] = transformation_object.function
90
+ pointer.read_array_of_int(@c_struct[:band_count])
74
91
  end
75
92
 
76
- def transformer=(transformer)
77
- @c_struct[:transformer] = transformer
78
- end
93
+ def transformer_arg=(transformation_object)
94
+ @c_struct[:transformer_arg] = transformation_object.c_pointer
79
95
 
80
- def progress_formatter=(output_proc)
81
- @c_struct[:progress] = output_proc
96
+ @c_struct[:transformer] = transformation_object.function
82
97
  end
83
98
 
84
- def cutline_geometry=(geometry)
99
+ # @param geometry [OGR::Geometry]
100
+ def cutline=(geometry)
85
101
  raise 'Not a geom' unless geometry.is_a?(OGR::Geometry)
102
+ @cutline = geometry
86
103
 
87
104
  @c_struct[:cutline] = geometry.c_pointer
88
- # @c_struct[:cutline] = geometry.clone.c_pointer
89
- end
90
-
91
- def cutline_blend_distance=(distance)
92
- @c_struct[:cutline_blend_distance] = distance
93
105
  end
94
106
 
107
+ # @param values [Array<Float>]
95
108
  def source_no_data_real=(values)
96
109
  values_ptr = FFI::MemoryPointer.new(:double, values.length)
97
110
  values_ptr.write_array_of_double(values)
@@ -99,6 +112,15 @@ module GDAL
99
112
  @c_struct[:source_no_data_real] = values_ptr
100
113
  end
101
114
 
115
+ # @return [Array<Float>]
116
+ def source_no_data_real
117
+ pointer = @c_struct[:source_no_data_real]
118
+ return [] if pointer.null?
119
+
120
+ pointer.read_array_of_double(@c_struct[:band_count])
121
+ end
122
+
123
+ # @param values [Array<Float>]
102
124
  def source_no_data_imaginary=(values)
103
125
  values_ptr = FFI::MemoryPointer.new(:double, values.length)
104
126
  values_ptr.write_array_of_double(values)
@@ -106,6 +128,15 @@ module GDAL
106
128
  @c_struct[:source_no_data_imaginary] = values_ptr
107
129
  end
108
130
 
131
+ # @return [Array<Float>]
132
+ def source_no_data_imaginary
133
+ pointer = @c_struct[:source_no_data_imaginary]
134
+ return [] if pointer.null?
135
+
136
+ pointer.read_array_of_double(@c_struct[:band_count])
137
+ end
138
+
139
+ # @param values [Array<Float>]
109
140
  def destination_no_data_real=(values)
110
141
  values_ptr = FFI::MemoryPointer.new(:double, values.length)
111
142
  values_ptr.write_array_of_double(values)
@@ -113,6 +144,15 @@ module GDAL
113
144
  @c_struct[:destination_no_data_real] = values_ptr
114
145
  end
115
146
 
147
+ # @return [Array<Float>]
148
+ def destination_no_data_real
149
+ pointer = @c_struct[:destination_no_data_real]
150
+ return [] if pointer.null?
151
+
152
+ pointer.read_array_of_double(@c_struct[:band_count])
153
+ end
154
+
155
+ # @param values [Array<Float>]
116
156
  def destination_no_data_imaginary=(values)
117
157
  values_ptr = FFI::MemoryPointer.new(:double, values.length)
118
158
  values_ptr.write_array_of_double(values)
@@ -120,6 +160,30 @@ module GDAL
120
160
  @c_struct[:destination_no_data_imaginary] = values_ptr
121
161
  end
122
162
 
163
+ # @return [Array<Float>]
164
+ def destination_no_data_imaginary
165
+ pointer = @c_struct[:destination_no_data_imaginary]
166
+ return [] if pointer.null?
167
+
168
+ pointer.read_array_of_double(@c_struct[:band_count])
169
+ end
170
+
171
+ # Set a Proc per source band; number of procs in +band_procs+ should equal
172
+ # {band_count}.
173
+ #
174
+ # @param band_procs [Array<Proc>]
175
+ def source_per_band_validity_mask_function=(band_procs)
176
+ mask_func = FFI::GDAL::Warper::MaskFunc
177
+
178
+ funcs = band_procs.map do |band_proc|
179
+ FFI::Function.new(mask_func.result_type, mask_func.param_types, band_proc, blocking: true)
180
+ end
181
+
182
+ pointer = FFI::MemoryPointer.new(:pointer, band_procs.length)
183
+ pointer.write_array_of_pointer(funcs)
184
+ @c_struct[:source_per_band_validity_mask_function] = pointer
185
+ end
186
+
123
187
  # Used for getting attributes of the internal WarpOptions struct.
124
188
  #
125
189
  # @param meth [Symbol] The FFI::GDAL::WarpOptions key.
data/lib/gdal.rb CHANGED
@@ -30,6 +30,7 @@ module GDAL
30
30
  autoload :Driver, gdal_require('gdal/driver')
31
31
  autoload :GeoTransform, gdal_require('gdal/geo_transform')
32
32
  autoload :Logger, gdal_require('gdal/logger')
33
+ autoload :MajorObject, gdal_require('gdal/major_object')
33
34
  autoload :Options, gdal_require('gdal/options')
34
35
  autoload :RasterAttributeTable, gdal_require('gdal/raster_attribute_table')
35
36
  autoload :RasterBand, gdal_require('gdal/raster_band')
@@ -4,24 +4,5 @@ module OGR
4
4
  def layers
5
5
  @layers = Array.new(layer_count) { |i| layer(i) }
6
6
  end
7
-
8
- # @return [Hash]
9
- def as_json(options = nil)
10
- {
11
- data_source: {
12
- driver: driver.name,
13
- layer_count: layer_count,
14
- layers: layers.map(&:as_json),
15
- name: name,
16
- style_table: style_table ? style_table.as_json(options) : nil
17
- },
18
- metadata: all_metadata
19
- }
20
- end
21
-
22
- # @return [String]
23
- def to_json(options = nil)
24
- as_json(options).to_json
25
- end
26
7
  end
27
8
  end
@@ -101,28 +101,6 @@ module OGR
101
101
  polygon
102
102
  end
103
103
 
104
- # @return [Hash]
105
- def as_json(_options = nil)
106
- json = {
107
- x_min: x_min,
108
- x_max: x_max,
109
- y_min: y_min,
110
- y_max: y_max
111
- }
112
-
113
- if @c_struct.is_a? FFI::OGR::Envelope3D
114
- json[:z_min] = z_min
115
- json[:z_max] = z_max
116
- end
117
-
118
- json
119
- end
120
-
121
- # @return [String]
122
- def to_json(options = nil)
123
- as_json(options).to_json
124
- end
125
-
126
104
  def to_a
127
105
  [x_min, y_min, x_max, y_max]
128
106
  end
@@ -33,23 +33,5 @@ module OGR
33
33
 
34
34
  geometry_field_definition(g)
35
35
  end
36
-
37
- # @return [Hash]
38
- def as_json(_options = nil)
39
- {
40
- field_count: field_count,
41
- field_definitions: field_definitions.map(&:as_json),
42
- geometry_field_count: geometry_field_count,
43
- geometry_type: geometry_type,
44
- is_geometry_ignored: geometry_ignored?,
45
- is_style_ignored: style_ignored?,
46
- name: name
47
- }
48
- end
49
-
50
- # @return [String]
51
- def to_json(options = nil)
52
- as_json(options).to_json
53
- end
54
36
  end
55
37
  end
@@ -81,32 +81,5 @@ module OGR
81
81
  def geometry_fields
82
82
  each_geometry_field.to_a
83
83
  end
84
-
85
- # @return [Hash]
86
- def as_json(options = nil)
87
- fields_with_nested_json = fields.map.with_index do |f, i|
88
- {
89
- field_definition: field_definition(i).as_json(options),
90
- value: f
91
- }
92
- end
93
-
94
- {
95
- definition: definition.as_json(options),
96
- fid: fid,
97
- field_count: field_count,
98
- fields: fields_with_nested_json,
99
- geometry: geometry ? geometry.as_json(options) : nil,
100
- geometry_field_count: geometry_field_count,
101
- geometry_field_definition: each_geometry_field_definition.map { |gfd| gfd.as_json(options) },
102
- style_string: style_string,
103
- style_table: style_table ? style_table.as_json(options) : nil
104
- }
105
- end
106
-
107
- # @return [String]
108
- def to_json(options = nil)
109
- as_json(options).to_json
110
- end
111
84
  end
112
85
  end
@@ -1,10 +1,7 @@
1
1
  require_relative '../ogr'
2
- require_relative 'field_definition_extensions'
3
2
 
4
3
  module OGR
5
4
  class FieldDefinition
6
- include FieldDefinitionExtensions
7
-
8
5
  # @return [FFI::Pointer] C pointer to the C FieldDefn.
9
6
  attr_reader :c_pointer
10
7
 
data/lib/ogr/geometry.rb CHANGED
@@ -240,7 +240,6 @@ module OGR
240
240
  end
241
241
 
242
242
  # @return [Fixnum]
243
- # @todo This regularly crashes, so disabling it.
244
243
  def centroid
245
244
  point = is_3d? ? OGR::Point25D.new : OGR::Point.new
246
245
 
@@ -1,9 +1,5 @@
1
- require_relative 'geometry_field_definition_extensions'
2
-
3
1
  module OGR
4
2
  class GeometryFieldDefinition
5
- include GeometryFieldDefinitionExtensions
6
-
7
3
  # @return [FFI::Pointer]
8
4
  attr_reader :c_pointer
9
5
 
@@ -53,35 +53,6 @@ module OGR
53
53
  !valid?
54
54
  end
55
55
 
56
- # @return [Hash]
57
- def as_json(options = nil)
58
- json = {
59
- coordinate_dimension: coordinate_dimension,
60
- geometry_count: geometry_count,
61
- dimension: dimension,
62
- is_empty: empty?,
63
- is_ring: ring?,
64
- is_simple: simple?,
65
- is_valid: valid?,
66
- name: name,
67
- point_count: point_count,
68
- spatial_reference: spatial_reference.nil? ? nil : spatial_reference.as_json(options),
69
- type: type_to_name,
70
- wkb_size: wkb_size
71
- }
72
-
73
- json[:area] = area if respond_to? :area
74
- json[:length] = length if respond_to? :length
75
- json[:points] = points if respond_to? :points
76
-
77
- json
78
- end
79
-
80
- # @return [String]
81
- def to_json(options = nil)
82
- as_json(options).to_json
83
- end
84
-
85
56
  def collection?
86
57
  false
87
58
  end
@@ -102,7 +102,7 @@ module OGR
102
102
  y_buffer = FFI::MemoryPointer.new(:buffer_out, buffer_size)
103
103
  z_buffer = FFI::MemoryPointer.new(:buffer_out, buffer_size) if coordinate_dimension == 3
104
104
 
105
- FFI::OGR::API.OGR_G_GetPoints(@c_pointer,
105
+ num_points = FFI::OGR::API.OGR_G_GetPoints(@c_pointer,
106
106
  x_buffer, x_stride, y_buffer,
107
107
  y_stride, z_buffer, z_stride)
108
108
 
data/lib/ogr/layer.rb CHANGED
@@ -20,7 +20,9 @@ module OGR
20
20
  include LayerMixins::OGRQueryFilterMethods
21
21
  include LayerMixins::OGRSQLMethods
22
22
 
23
- class_eval FFI::OGR::Core::OGR_ALTER.to_ruby
23
+ FFI::OGR::Core::OGR_ALTER.constants.each do |_name, obj|
24
+ const_set(obj.ruby_name, obj.value.to_i(16))
25
+ end
24
26
 
25
27
  # @return [FFI::Pointer] C pointer to the C Layer.
26
28
  attr_reader :c_pointer
@@ -66,7 +66,7 @@ module OGR
66
66
  #
67
67
  # @return [Array<OGR::Feature>]
68
68
  def features
69
- each_feature.map { |f| f.clone }
69
+ each_feature.map(&:clone)
70
70
  end
71
71
 
72
72
  # @return [OGR::Polygon] A polygon derived from a LinearRing that connects
@@ -229,30 +229,6 @@ module OGR
229
229
  found_z_geom
230
230
  end
231
231
 
232
- # @return [Hash]
233
- def as_json(options = nil)
234
- {
235
- layer: {
236
- extent: extent.as_json(options),
237
- feature_count: feature_count,
238
- feature_definition: feature_definition.as_json(options),
239
- features: each_feature.map { |f| f.as_json(options) },
240
- fid_column: fid_column,
241
- geometry_column: geometry_column,
242
- geometry_type: geometry_type,
243
- name: name,
244
- spatial_reference: spatial_reference ? spatial_reference.as_json(options) : nil,
245
- style_table: style_table ? style_table.as_json(options) : nil
246
- },
247
- metadata: nil # all_metadata
248
- }
249
- end
250
-
251
- # @return [String]
252
- def to_json(options = nil)
253
- as_json(options).to_json
254
- end
255
-
256
232
  private
257
233
 
258
234
  # @param geometry_ptr [FFI::Pointer]
@@ -22,9 +22,17 @@ module OGR
22
22
  include SpatialReferenceMixins::ParameterGetterSetters
23
23
  include SpatialReferenceMixins::TypeChecks
24
24
 
25
- class_eval FFI::OGR::SRSAPI::SRS_UL.to_ruby
25
+ # class_eval FFI::OGR::SRSAPI::SRS_UL.to_ruby
26
+ FFI::OGR::SRSAPI::SRS_UL.constants.each do |_name, obj|
27
+ const_set(obj.ruby_name, obj.value)
28
+ end
29
+
26
30
  METER_TO_METER = 1.0
27
- class_eval FFI::OGR::SRSAPI::SRS_UA.to_ruby
31
+
32
+ FFI::OGR::SRSAPI::SRS_UA.constants.each do |_name, obj|
33
+ const_set(obj.ruby_name, obj.value)
34
+ end
35
+
28
36
  RADIAN_TO_RADIAN = 1.0
29
37
 
30
38
  # @return [Array<String>]
@@ -28,31 +28,5 @@ module OGR
28
28
  rescue NameError
29
29
  raise NameError, "Param must be a known linear unit type: #{unit_label}"
30
30
  end
31
-
32
- # @return [Hash]
33
- def as_json(_options = nil)
34
- {
35
- angular_units: angular_units,
36
- epsg_treats_as_lat_long: epsg_treats_as_lat_long?,
37
- epsg_treats_as_northing_easting: epsg_treats_as_northing_easting?,
38
- is_compound: compound?,
39
- is_geocentric: geocentric?,
40
- is_geographic: geographic?,
41
- is_local: local?,
42
- is_projected: projected?,
43
- is_vertical: vertical?,
44
- linear_units: linear_units,
45
- prime_meridian: prime_meridian,
46
- semi_major: semi_major,
47
- semi_minor: semi_minor,
48
- spheroid_inverse_flattening: spheroid_inverse_flattening,
49
- utm_zone: utm_zone
50
- }
51
- end
52
-
53
- # @return [String]
54
- def to_json(options = nil)
55
- as_json(options).to_json
56
- end
57
31
  end
58
32
  end
@@ -20,15 +20,5 @@ module OGR
20
20
 
21
21
  styles
22
22
  end
23
-
24
- # @return [Hash]
25
- def as_json(_options = nil)
26
- styles
27
- end
28
-
29
- # @return [String]
30
- def to_json(options = nil)
31
- as_json(options).to_json
32
- end
33
23
  end
34
24
  end
@@ -8,6 +8,13 @@ RSpec.describe 'Raster Band Info', type: :integration do
8
8
  File.expand_path(path, __dir__)
9
9
  end
10
10
 
11
+ let(:nodata_tiff) do
12
+ path = '../../../spec/support/images/123.tiff'
13
+ File.expand_path(path, __dir__)
14
+ end
15
+
16
+ let(:nodata_dataset) { GDAL::Dataset.open(nodata_tiff, 'r') }
17
+
11
18
  let(:tmp_tiff) { make_temp_test_file(original_tiff) }
12
19
  let(:dataset) { GDAL::Dataset.open(tmp_tiff, 'w') }
13
20
  after { dataset.close }
@@ -89,12 +96,27 @@ RSpec.describe 'Raster Band Info', type: :integration do
89
96
  end
90
97
  end
91
98
 
92
- describe '#no_data_value' do
93
- it 'is a Hash with :value and :is_associated keys' do
94
- expect(subject.no_data_value).to be_an Hash
99
+ context 'no data not set' do
100
+ describe '#no_data_value' do
101
+ it 'is a Hash with :value and :is_associated keys' do
102
+ expect(subject.no_data_value).to be_an Hash
95
103
 
96
- expect(subject.no_data_value[:value]).to be_a Float
97
- expect(subject.no_data_value[:is_associated]).to_not be_nil
104
+ expect(subject.no_data_value[:value]).to be_nil
105
+ expect(subject.no_data_value[:is_associated]).to_not be_nil
106
+ end
107
+ end
108
+ end
109
+
110
+ context 'no data is set' do
111
+ subject { nodata_dataset.raster_band(1) }
112
+
113
+ describe '#no_data_value' do
114
+ it 'is a Hash with :value and :is_associated keys' do
115
+ expect(subject.no_data_value).to be_an Hash
116
+
117
+ expect(subject.no_data_value[:value]).to be_a Float
118
+ expect(subject.no_data_value[:is_associated]).to_not be_nil
119
+ end
98
120
  end
99
121
  end
100
122
 
@@ -90,10 +90,4 @@ RSpec.describe 'OGR::Layer' do
90
90
  expect(geometry).to be_a OGR::Polygon
91
91
  end
92
92
  end
93
-
94
- describe '#as_json' do
95
- specify do
96
- expect { subject.as_json }.to_not raise_exception
97
- end
98
- end
99
93
  end
Binary file
@@ -9,6 +9,7 @@ RSpec.describe FFI::GDAL do
9
9
  end
10
10
 
11
11
  it 'returns GDAL_LIBRARY_PATH + libgdal file name' do
12
+ expect(Dir).to receive(:[]).with(%r{/pants/stuff\.+}).and_return '/pants/stuff.dylib'
12
13
  expect(described_class.find_lib('stuff')).to match %r{\A/pants/stuff\.+}
13
14
  end
14
15
  end