ffi-gdal 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +15 -0
  3. data/.github/workflows/codacy.yml +1 -1
  4. data/.github/workflows/dependency-review.yml +1 -1
  5. data/.github/workflows/specs-in-docker.yml +3 -1
  6. data/.prettierrc.yml +4 -0
  7. data/.rubocop.yml +9 -5
  8. data/.rubocop_todo.yml +5 -11
  9. data/.solargraph.yml +13 -0
  10. data/Changelog-0.x.md +229 -174
  11. data/Changelog.md +20 -4
  12. data/Dockerfile.gdal2 +2 -85
  13. data/Gemfile +12 -2
  14. data/LICENSE.txt +1 -1
  15. data/README.md +14 -16
  16. data/Rakefile +6 -6
  17. data/bin/bundle +12 -12
  18. data/bin/rake +6 -6
  19. data/bin/rspec +6 -6
  20. data/bin/rubocop +6 -6
  21. data/examples/extract_and_colorize.rb +15 -15
  22. data/examples/geometries.rb +12 -12
  23. data/examples/gridding.rb +17 -17
  24. data/examples/ogr_layer_to_layer.rb +3 -3
  25. data/examples/raster_erasing.rb +9 -9
  26. data/examples/remove_small_polygons.rb +11 -11
  27. data/examples/testing_gdal.rb +20 -20
  28. data/examples/warping.rb +13 -13
  29. data/ffi-gdal.gemspec +16 -27
  30. data/lib/ext/ffi_library_function_checks.rb +3 -3
  31. data/lib/ext/narray_ext.rb +1 -1
  32. data/lib/ext/to_bool.rb +2 -2
  33. data/lib/ffi/cpl/conv.rb +2 -2
  34. data/lib/ffi/cpl/error.rb +1 -1
  35. data/lib/ffi/cpl/hash_set.rb +2 -2
  36. data/lib/ffi/cpl/http.rb +3 -3
  37. data/lib/ffi/cpl/http_result.rb +2 -2
  38. data/lib/ffi/cpl/list.rb +1 -1
  39. data/lib/ffi/cpl/mime_part.rb +1 -1
  40. data/lib/ffi/cpl/minixml.rb +2 -2
  41. data/lib/ffi/cpl/port.rb +1 -1
  42. data/lib/ffi/cpl/progress.rb +2 -2
  43. data/lib/ffi/cpl/quad_tree.rb +3 -3
  44. data/lib/ffi/cpl/rect_obj.rb +1 -1
  45. data/lib/ffi/cpl/string.rb +1 -1
  46. data/lib/ffi/cpl/vsi.rb +2 -2
  47. data/lib/ffi/cpl/xml_node.rb +1 -1
  48. data/lib/ffi/cpl.rb +11 -11
  49. data/lib/ffi/extensions/gdal/extensions/all.rb +2 -2
  50. data/lib/ffi/extensions/gdal/extensions.rb +2 -2
  51. data/lib/ffi/extensions/rttopo/gbox.rb +1 -1
  52. data/lib/ffi/extensions/rttopo/geom.rb +2 -2
  53. data/lib/ffi/extensions/rttopo.rb +3 -3
  54. data/lib/ffi/gdal/alg.rb +2 -2
  55. data/lib/ffi/gdal/color_entry.rb +1 -1
  56. data/lib/ffi/gdal/gcp.rb +1 -1
  57. data/lib/ffi/gdal/gdal.rb +3 -3
  58. data/lib/ffi/gdal/grid.rb +2 -2
  59. data/lib/ffi/gdal/grid_data_metrics_options.rb +1 -1
  60. data/lib/ffi/gdal/grid_inverse_distance_to_a_power_options.rb +1 -1
  61. data/lib/ffi/gdal/grid_moving_average_options.rb +1 -1
  62. data/lib/ffi/gdal/grid_nearest_neighbor_options.rb +1 -1
  63. data/lib/ffi/gdal/matching.rb +2 -2
  64. data/lib/ffi/gdal/rpc_info.rb +1 -1
  65. data/lib/ffi/gdal/transformer_info.rb +1 -1
  66. data/lib/ffi/gdal/version.rb +1 -1
  67. data/lib/ffi/gdal/vrt.rb +2 -2
  68. data/lib/ffi/gdal/warp_options.rb +1 -1
  69. data/lib/ffi/gdal/warper.rb +2 -2
  70. data/lib/ffi/gdal.rb +22 -22
  71. data/lib/ffi/ogr/api.rb +3 -3
  72. data/lib/ffi/ogr/contour_writer_info.rb +1 -1
  73. data/lib/ffi/ogr/core.rb +9 -9
  74. data/lib/ffi/ogr/envelope.rb +1 -1
  75. data/lib/ffi/ogr/envelope_3d.rb +1 -1
  76. data/lib/ffi/ogr/featurestyle.rb +1 -1
  77. data/lib/ffi/ogr/field.rb +1 -1
  78. data/lib/ffi/ogr/geocoding.rb +2 -2
  79. data/lib/ffi/ogr/srs_api.rb +63 -63
  80. data/lib/ffi/ogr/style_param.rb +2 -2
  81. data/lib/ffi/ogr/style_value.rb +1 -1
  82. data/lib/ffi/ogr.rb +11 -11
  83. data/lib/ffi-gdal.rb +8 -8
  84. data/lib/gdal/color_table.rb +6 -6
  85. data/lib/gdal/dataset/accessors.rb +101 -0
  86. data/lib/gdal/{dataset_mixins → dataset}/algorithm_methods.rb +1 -1
  87. data/lib/gdal/dataset/class_methods.rb +69 -0
  88. data/lib/gdal/dataset/internal_functions.rb +22 -0
  89. data/lib/gdal/{dataset_mixins → dataset}/matching.rb +1 -1
  90. data/lib/gdal/dataset/raster_band_methods.rb +181 -0
  91. data/lib/gdal/{dataset_mixins → dataset}/warp_methods.rb +1 -1
  92. data/lib/gdal/dataset.rb +21 -359
  93. data/lib/gdal/driver.rb +10 -10
  94. data/lib/gdal/environment_methods.rb +1 -1
  95. data/lib/gdal/extensions/all.rb +1 -1
  96. data/lib/gdal/extensions/color_entry/extensions.rb +2 -2
  97. data/lib/gdal/extensions/color_table/extensions.rb +2 -2
  98. data/lib/gdal/extensions/dataset/extensions.rb +11 -11
  99. data/lib/gdal/extensions/driver/extensions.rb +7 -7
  100. data/lib/gdal/extensions/geo_transform/extensions.rb +2 -2
  101. data/lib/gdal/extensions/gridder.rb +8 -8
  102. data/lib/gdal/extensions/gridder_options.rb +6 -6
  103. data/lib/gdal/extensions/raster_attribute_table/extensions.rb +1 -1
  104. data/lib/gdal/extensions/raster_band/algorithm_extensions.rb +4 -4
  105. data/lib/gdal/extensions/raster_band/coloring_extensions.rb +1 -1
  106. data/lib/gdal/extensions/raster_band/extensions.rb +3 -3
  107. data/lib/gdal/extensions/raster_band/io_extensions.rb +4 -4
  108. data/lib/gdal/extensions/raster_band_classifier.rb +3 -3
  109. data/lib/gdal/geo_transform.rb +1 -1
  110. data/lib/gdal/grid.rb +6 -6
  111. data/lib/gdal/grid_algorithms/metric_average_distance.rb +1 -1
  112. data/lib/gdal/grid_algorithms/metric_average_distance_pts.rb +1 -1
  113. data/lib/gdal/grid_algorithms/metric_count.rb +1 -1
  114. data/lib/gdal/grid_algorithms/metric_maximum.rb +1 -1
  115. data/lib/gdal/grid_algorithms/metric_minimum.rb +1 -1
  116. data/lib/gdal/grid_algorithms/metric_range.rb +1 -1
  117. data/lib/gdal/grid_algorithms.rb +9 -9
  118. data/lib/gdal/internal_helpers.rb +3 -3
  119. data/lib/gdal/logger.rb +1 -1
  120. data/lib/gdal/major_object.rb +6 -6
  121. data/lib/gdal/options.rb +2 -2
  122. data/lib/gdal/raster_attribute_table.rb +5 -5
  123. data/lib/gdal/raster_band.rb +24 -24
  124. data/lib/gdal/rpc_info.rb +2 -2
  125. data/lib/gdal/transformer.rb +1 -1
  126. data/lib/gdal/transformers/general_image_projection_transformer.rb +1 -1
  127. data/lib/gdal/transformers/general_image_projection_transformer2.rb +1 -1
  128. data/lib/gdal/transformers/general_image_projection_transformer3.rb +1 -1
  129. data/lib/gdal/version_info.rb +9 -9
  130. data/lib/gdal/virtual_dataset.rb +4 -4
  131. data/lib/gdal/warp_operation.rb +2 -2
  132. data/lib/gdal/warp_options.rb +2 -2
  133. data/lib/gdal.rb +17 -17
  134. data/lib/ogr/coordinate_transformation.rb +5 -5
  135. data/lib/ogr/data_source.rb +9 -9
  136. data/lib/ogr/driver.rb +9 -9
  137. data/lib/ogr/envelope.rb +1 -1
  138. data/lib/ogr/error_handling.rb +1 -1
  139. data/lib/ogr/extensions/all.rb +1 -1
  140. data/lib/ogr/extensions/data_source/capability_methods.rb +4 -4
  141. data/lib/ogr/extensions/data_source/data_source_extensions.rb +1 -1
  142. data/lib/ogr/extensions/driver/capability_methods.rb +3 -3
  143. data/lib/ogr/extensions/envelope/extensions.rb +1 -1
  144. data/lib/ogr/extensions/feature/extensions.rb +1 -1
  145. data/lib/ogr/extensions/feature_definition/extensions.rb +1 -1
  146. data/lib/ogr/extensions/geometries/point/extensions.rb +1 -1
  147. data/lib/ogr/extensions/geometry/container_mixins.rb +10 -10
  148. data/lib/ogr/extensions/geometry/ewkb_io_extensions.rb +3 -3
  149. data/lib/ogr/extensions/geometry/ewkb_record.rb +4 -4
  150. data/lib/ogr/extensions/geometry/extensions.rb +4 -7
  151. data/lib/ogr/extensions/geometry/rttopo_extensions.rb +2 -2
  152. data/lib/ogr/extensions/geometry/wkb_record.rb +3 -3
  153. data/lib/ogr/extensions/geometry_types/curve/extensions.rb +2 -2
  154. data/lib/ogr/extensions/layer/capability_methods.rb +17 -17
  155. data/lib/ogr/extensions/layer/extensions.rb +1 -1
  156. data/lib/ogr/extensions/spatial_reference/extensions.rb +1 -1
  157. data/lib/ogr/extensions/spatial_reference/initializers.rb +2 -2
  158. data/lib/ogr/extensions/style_table/extensions.rb +1 -1
  159. data/lib/ogr/feature.rb +15 -15
  160. data/lib/ogr/feature_definition.rb +2 -2
  161. data/lib/ogr/field.rb +5 -5
  162. data/lib/ogr/field_definition.rb +1 -1
  163. data/lib/ogr/geocoder.rb +1 -1
  164. data/lib/ogr/geometries/geometry_collection.rb +2 -2
  165. data/lib/ogr/geometries/geometry_collection_25d.rb +1 -1
  166. data/lib/ogr/geometries/line_string.rb +1 -1
  167. data/lib/ogr/geometries/line_string_25d.rb +1 -1
  168. data/lib/ogr/geometries/linear_ring.rb +2 -2
  169. data/lib/ogr/geometries/multi_line_string.rb +2 -2
  170. data/lib/ogr/geometries/multi_line_string_25d.rb +1 -1
  171. data/lib/ogr/geometries/multi_point.rb +1 -1
  172. data/lib/ogr/geometries/multi_point_25d.rb +1 -1
  173. data/lib/ogr/geometries/multi_polygon.rb +2 -2
  174. data/lib/ogr/geometries/multi_polygon_25d.rb +1 -1
  175. data/lib/ogr/geometries/point_25d.rb +1 -1
  176. data/lib/ogr/geometries/polygon.rb +2 -2
  177. data/lib/ogr/geometries/polygon_25d.rb +1 -1
  178. data/lib/ogr/geometry.rb +11 -11
  179. data/lib/ogr/geometry_types/container.rb +1 -1
  180. data/lib/ogr/geometry_types/curve.rb +1 -1
  181. data/lib/ogr/internal_helpers.rb +4 -4
  182. data/lib/ogr/layer.rb +8 -8
  183. data/lib/ogr/layer_mixins/ogr_feature_methods.rb +9 -9
  184. data/lib/ogr/layer_mixins/ogr_field_methods.rb +15 -15
  185. data/lib/ogr/layer_mixins/ogr_sql_methods.rb +2 -2
  186. data/lib/ogr/spatial_reference.rb +19 -19
  187. data/lib/ogr/spatial_reference_mixins/coordinate_system_getter_setters.rb +4 -4
  188. data/lib/ogr/spatial_reference_mixins/exporters.rb +9 -9
  189. data/lib/ogr/spatial_reference_mixins/importers.rb +2 -2
  190. data/lib/ogr/spatial_reference_mixins/morphers.rb +2 -2
  191. data/lib/ogr/spatial_reference_mixins/parameter_getter_setters.rb +1 -1
  192. data/lib/ogr/style_table.rb +3 -3
  193. data/lib/ogr/style_tool.rb +1 -1
  194. data/lib/ogr.rb +33 -33
  195. data/rakelib/docker.rake +2 -2
  196. metadata +14 -150
  197. data/bitbucket-pipelines.yml +0 -16
  198. data/tilt/gdal2.yml +0 -22
  199. data/tilt/gdal3.yml +0 -22
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GDAL
4
+ class Dataset
5
+ module ClassMethods
6
+ # @param path [String] Path to the file that contains the dataset. Can be
7
+ # a local file or a URL.
8
+ # @param access_flag [String] 'r' or 'w'.
9
+ # @param shared [Boolean] Whether or not to open using GDALOpenShared
10
+ # vs GDALOpen. Defaults to +true+.
11
+ def open(path, access_flag, shared: true)
12
+ ds = new(path, access_flag, shared_open: shared)
13
+
14
+ if block_given?
15
+ result = yield ds
16
+ ds.close
17
+ result
18
+ else
19
+ ds
20
+ end
21
+ end
22
+
23
+ # Copy all dataset raster data.
24
+ #
25
+ # This function copies the complete raster contents of one dataset to
26
+ # another similarly configured dataset. The source and destination dataset
27
+ # must have the same number of bands, and the same width and height. The
28
+ # bands do not have to have the same data type.
29
+ #
30
+ # This function is primarily intended to support implementation of driver
31
+ # specific CreateCopy() functions. It implements efficient copying, in
32
+ # particular "chunking" the copy in substantial blocks and, if appropriate,
33
+ # performing the transfer in a pixel interleaved fashion.
34
+ #
35
+ # @param source [GDAL::Dataset, FFI::Pointer]
36
+ # @param destination [GDAL::Dataset, FFI::Pointer]
37
+ # @param options [Hash]
38
+ # @option options interleave: 'pixel'
39
+ # @option options compressed: true
40
+ # @option options skip_holes: true
41
+ # @param progress_function [Proc]
42
+ # @raise [GDAL::Error]
43
+ def copy_whole_raster(source, destination, options = {}, progress_function = nil)
44
+ source_ptr = GDAL._pointer(GDAL::Dataset, source, autorelease: false)
45
+ dest_ptr = GDAL._pointer(GDAL::Dataset, destination, autorelease: false)
46
+ options_ptr = GDAL::Options.pointer(options)
47
+
48
+ GDAL::CPLErrorHandler.manually_handle("Unable to copy whole raster") do
49
+ FFI::GDAL::GDAL.GDALDatasetCopyWholeRaster(source_ptr, dest_ptr, options_ptr, progress_function, nil)
50
+ end
51
+ end
52
+
53
+ # @param dataset [GDAL::Dataset]
54
+ # @return [FFI::AutoPointer]
55
+ def new_pointer(dataset, warn_on_nil: true)
56
+ ptr = GDAL._pointer(GDAL::Dataset, dataset, warn_on_nil: warn_on_nil, autorelease: false)
57
+
58
+ FFI::AutoPointer.new(ptr, Dataset.method(:release))
59
+ end
60
+
61
+ # @param pointer [FFI::Pointer]
62
+ def release(pointer)
63
+ return unless pointer && !pointer.null?
64
+
65
+ FFI::GDAL::GDAL.GDALClose(pointer)
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GDAL
4
+ class Dataset
5
+ module InternalFunctions
6
+ # Makes a pointer of +band_numbers+.
7
+ #
8
+ # @param band_numbers [Array<Integer>]
9
+ # @return [Array<FFI::MemoryPointer, Integer>]
10
+ def self.band_numbers_args(band_numbers)
11
+ band_count = band_numbers&.size || 0
12
+ ptr = FFI::MemoryPointer.new(:int, band_count)
13
+
14
+ ptr.write_array_of_int(band_numbers) if band_numbers
15
+
16
+ ptr.autorelease = false
17
+
18
+ [ptr, band_count]
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GDAL
4
- module DatasetMixins
4
+ class Dataset
5
5
  module Matching
6
6
  # @param other_dataset [GDAL::Dataset]
7
7
  # @param options [Hash]
@@ -0,0 +1,181 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../dataset/internal_functions"
4
+
5
+ module GDAL
6
+ class Dataset
7
+ module RasterBandMethods
8
+ # Lets you pass in :GMF_ symbols that represent mask band flags and bitwise
9
+ # ors them.
10
+ #
11
+ # @param flags [Symbol]
12
+ # @return [Integer]
13
+ def self.parse_mask_flag_symbols(*flags)
14
+ flags.reduce(0) do |result, flag|
15
+ result | case flag
16
+ when :GMF_ALL_VALID then 0x01
17
+ when :GMF_PER_DATASET then 0x02
18
+ when :GMF_PER_ALPHA then 0x04
19
+ when :GMF_NODATA then 0x08
20
+ else 0
21
+ end
22
+ end
23
+ end
24
+
25
+ # @param buffer_data_type [FFI::GDAL::GDAL::DataType]
26
+ # @param x_buffer_size [Integer]
27
+ # @param y_buffer_size [Integer]
28
+ # @return [Integer]
29
+ def self.valid_min_buffer_size(buffer_data_type, x_buffer_size, y_buffer_size)
30
+ data_type_bytes = GDAL::DataType.size(buffer_data_type) / 8
31
+
32
+ data_type_bytes * x_buffer_size * y_buffer_size
33
+ end
34
+
35
+ # @return [Integer, nil]
36
+ def raster_x_size
37
+ return nil if null?
38
+
39
+ FFI::GDAL::GDAL.GDALGetRasterXSize(@c_pointer)
40
+ end
41
+
42
+ # @return [Integer, nil]
43
+ def raster_y_size
44
+ return nil if null?
45
+
46
+ FFI::GDAL::GDAL.GDALGetRasterYSize(@c_pointer)
47
+ end
48
+
49
+ # @return [Integer]
50
+ def raster_count
51
+ return 0 if null?
52
+
53
+ FFI::GDAL::GDAL.GDALGetRasterCount(@c_pointer)
54
+ end
55
+
56
+ # @param raster_index [Integer]
57
+ # @return [GDAL::RasterBand]
58
+ def raster_band(raster_index)
59
+ if raster_index > raster_count
60
+ raise GDAL::InvalidRasterBand, "Invalid raster band number '#{raster_index}'. Must be <= #{raster_count}"
61
+ end
62
+
63
+ raster_band_ptr = FFI::GDAL::GDAL.GDALGetRasterBand(@c_pointer, raster_index)
64
+ raster_band_ptr.autorelease = false
65
+
66
+ GDAL::RasterBand.new(raster_band_ptr, self)
67
+ end
68
+
69
+ # @param type [FFI::GDAL::GDAL::DataType]
70
+ # @param options [Hash]
71
+ # @raise [GDAL::Error]
72
+ # @return [GDAL::RasterBand, nil]
73
+ def add_band(type, **options)
74
+ options_ptr = GDAL::Options.pointer(options)
75
+
76
+ GDAL::CPLErrorHandler.manually_handle("Unable to add band") do
77
+ FFI::GDAL::GDAL.GDALAddBand(@c_pointer, type, options_ptr)
78
+ end
79
+
80
+ raster_band(raster_count)
81
+ end
82
+
83
+ # Adds a mask band to the dataset.
84
+ #
85
+ # @param flags [Array<Symbol>, Symbol] Any of the :GMF symbols.
86
+ # @raise [GDAL::Error]
87
+ def create_mask_band(*flags)
88
+ flag_value = RasterBandMethods.parse_mask_flag_symbols(flags)
89
+
90
+ GDAL::CPLErrorHandler.manually_handle("Unable to create Dataset mask band") do
91
+ FFI::GDAL::GDAL.GDALCreateDatasetMaskBand(@c_pointer, flag_value)
92
+ end
93
+ end
94
+
95
+ # @param access_flag [String] 'r' or 'w'.
96
+ # @param buffer [FFI::MemoryPointer] The pointer to the data to read/write
97
+ # to the dataset.
98
+ # @param x_size [Integer] If not given, uses {{#raster_x_size}}.
99
+ # @param y_size [Integer] If not given, uses {{#raster_y_size}}.
100
+ # @param x_offset [Integer] The pixel number in the line to start operating
101
+ # on. Note that when using this, +x_size+ - +x_offset+ should be >= 0,
102
+ # otherwise this means you're telling the method to read past the end of
103
+ # the line. Defaults to 0.
104
+ # @param y_offset [Integer] The line number to start operating on. Note that
105
+ # when using this, +y_size+ - +y_offset+ should be >= 0, otherwise this
106
+ # means you're telling the method to read more lines than the raster has.
107
+ # Defaults to 0.
108
+ # @param buffer_x_size [Integer] The width of the buffer image in which to
109
+ # read/write the raster data into/from. Typically this should be the same
110
+ # size as +x_size+; if it's different, GDAL will resample accordingly.
111
+ # @param buffer_y_size [Integer] The height of the buffer image in which to
112
+ # read/write the raster data into/from. Typically this should be the same
113
+ # size as +y_size+; if it's different, GDAL will resample accordingly.
114
+ # @param buffer_data_type [FFI::GDAL::GDAL::DataType] Can be used to convert the
115
+ # data to a different type. You must account for this when reading/writing
116
+ # to/from your buffer--your buffer size must be +buffer_x_size+ *
117
+ # +buffer_y_size+.
118
+ # @param band_numbers [Array<Integer>] The numbers of the bands to do IO on.
119
+ # Pass +nil+ defaults to choose the first band.
120
+ # @param pixel_space [Integer] The byte offset from the start of one pixel
121
+ # value in the buffer to the start of the next pixel value within a line.
122
+ # If defaulted (0), the size of +buffer_data_type+ is used.
123
+ # @param line_space [Integer] The byte offset from the start of one line in
124
+ # the buffer to the start of the next. If defaulted (0), the size of
125
+ # +buffer_data_type+ * +buffer_x_size* is used.
126
+ # @param band_space [Integer] The byte offset from the start of one band's
127
+ # data to the start of the next. If defaulted (0), the size of
128
+ # +line_space+ * +buffer_y_size* is used.
129
+ # @return [FFI::MemoryPointer] The buffer that was passed in.
130
+ # @raise [GDAL::Error] On failure.
131
+ # rubocop:disable Metrics/ParameterLists
132
+ def raster_io(access_flag, buffer = nil,
133
+ x_size: nil, y_size: nil, x_offset: 0, y_offset: 0,
134
+ buffer_x_size: nil, buffer_y_size: nil, buffer_data_type: nil,
135
+ band_numbers: nil,
136
+ pixel_space: 0, line_space: 0, band_space: 0)
137
+ x_size ||= raster_x_size
138
+ y_size ||= raster_y_size
139
+ buffer_x_size ||= x_size
140
+ buffer_y_size ||= y_size
141
+ buffer_data_type ||= raster_band(1).data_type
142
+
143
+ band_numbers_ptr, band_count = InternalFunctions.band_numbers_args(band_numbers)
144
+ band_count = raster_count if band_count.zero?
145
+
146
+ buffer ||= GDAL._pointer_from_data_type(buffer_data_type, buffer_x_size * buffer_y_size * band_count)
147
+
148
+ gdal_access_flag = GDAL._gdal_access_flag(access_flag)
149
+
150
+ min_buffer_size = RasterBandMethods.valid_min_buffer_size(buffer_data_type, buffer_x_size, buffer_y_size)
151
+
152
+ unless buffer.size >= min_buffer_size
153
+ raise GDAL::BufferTooSmall, "Buffer size (#{buffer.size}) too small (#{min_buffer_size})"
154
+ end
155
+
156
+ GDAL::CPLErrorHandler.manually_handle("Unable to perform raster band IO") do
157
+ FFI::GDAL::GDAL::GDALDatasetRasterIO(
158
+ @c_pointer, # hDS
159
+ gdal_access_flag, # eRWFlag
160
+ x_offset, # nXOff
161
+ y_offset, # nYOff
162
+ x_size, # nXSize
163
+ y_size, # nYSize
164
+ buffer, # pData
165
+ buffer_x_size, # nBufXSize
166
+ buffer_y_size, # nBufYSize
167
+ buffer_data_type, # eBufType
168
+ band_count, # nBandCount
169
+ band_numbers_ptr, # panBandMap (WTH is this?)
170
+ pixel_space, # nPixelSpace
171
+ line_space, # nLineSpace
172
+ band_space # nBandSpace
173
+ )
174
+ end
175
+
176
+ buffer
177
+ end
178
+ # rubocop:enable Metrics/ParameterLists
179
+ end
180
+ end
181
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GDAL
4
- module DatasetMixins
4
+ class Dataset
5
5
  # Methods used for warping; most taken from gdalwarper.h.
6
6
  module WarpMethods
7
7
  # @param destination_dataset [GDAL::Dataset]