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.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +15 -0
- data/.github/workflows/codacy.yml +1 -1
- data/.github/workflows/dependency-review.yml +1 -1
- data/.github/workflows/specs-in-docker.yml +3 -1
- data/.prettierrc.yml +4 -0
- data/.rubocop.yml +9 -5
- data/.rubocop_todo.yml +5 -11
- data/.solargraph.yml +13 -0
- data/Changelog-0.x.md +229 -174
- data/Changelog.md +20 -4
- data/Dockerfile.gdal2 +2 -85
- data/Gemfile +12 -2
- data/LICENSE.txt +1 -1
- data/README.md +14 -16
- data/Rakefile +6 -6
- data/bin/bundle +12 -12
- data/bin/rake +6 -6
- data/bin/rspec +6 -6
- data/bin/rubocop +6 -6
- data/examples/extract_and_colorize.rb +15 -15
- data/examples/geometries.rb +12 -12
- data/examples/gridding.rb +17 -17
- data/examples/ogr_layer_to_layer.rb +3 -3
- data/examples/raster_erasing.rb +9 -9
- data/examples/remove_small_polygons.rb +11 -11
- data/examples/testing_gdal.rb +20 -20
- data/examples/warping.rb +13 -13
- data/ffi-gdal.gemspec +16 -27
- data/lib/ext/ffi_library_function_checks.rb +3 -3
- data/lib/ext/narray_ext.rb +1 -1
- data/lib/ext/to_bool.rb +2 -2
- data/lib/ffi/cpl/conv.rb +2 -2
- data/lib/ffi/cpl/error.rb +1 -1
- data/lib/ffi/cpl/hash_set.rb +2 -2
- data/lib/ffi/cpl/http.rb +3 -3
- data/lib/ffi/cpl/http_result.rb +2 -2
- data/lib/ffi/cpl/list.rb +1 -1
- data/lib/ffi/cpl/mime_part.rb +1 -1
- data/lib/ffi/cpl/minixml.rb +2 -2
- data/lib/ffi/cpl/port.rb +1 -1
- data/lib/ffi/cpl/progress.rb +2 -2
- data/lib/ffi/cpl/quad_tree.rb +3 -3
- data/lib/ffi/cpl/rect_obj.rb +1 -1
- data/lib/ffi/cpl/string.rb +1 -1
- data/lib/ffi/cpl/vsi.rb +2 -2
- data/lib/ffi/cpl/xml_node.rb +1 -1
- data/lib/ffi/cpl.rb +11 -11
- data/lib/ffi/extensions/gdal/extensions/all.rb +2 -2
- data/lib/ffi/extensions/gdal/extensions.rb +2 -2
- data/lib/ffi/extensions/rttopo/gbox.rb +1 -1
- data/lib/ffi/extensions/rttopo/geom.rb +2 -2
- data/lib/ffi/extensions/rttopo.rb +3 -3
- data/lib/ffi/gdal/alg.rb +2 -2
- data/lib/ffi/gdal/color_entry.rb +1 -1
- data/lib/ffi/gdal/gcp.rb +1 -1
- data/lib/ffi/gdal/gdal.rb +3 -3
- data/lib/ffi/gdal/grid.rb +2 -2
- data/lib/ffi/gdal/grid_data_metrics_options.rb +1 -1
- data/lib/ffi/gdal/grid_inverse_distance_to_a_power_options.rb +1 -1
- data/lib/ffi/gdal/grid_moving_average_options.rb +1 -1
- data/lib/ffi/gdal/grid_nearest_neighbor_options.rb +1 -1
- data/lib/ffi/gdal/matching.rb +2 -2
- data/lib/ffi/gdal/rpc_info.rb +1 -1
- data/lib/ffi/gdal/transformer_info.rb +1 -1
- data/lib/ffi/gdal/version.rb +1 -1
- data/lib/ffi/gdal/vrt.rb +2 -2
- data/lib/ffi/gdal/warp_options.rb +1 -1
- data/lib/ffi/gdal/warper.rb +2 -2
- data/lib/ffi/gdal.rb +22 -22
- data/lib/ffi/ogr/api.rb +3 -3
- data/lib/ffi/ogr/contour_writer_info.rb +1 -1
- data/lib/ffi/ogr/core.rb +9 -9
- data/lib/ffi/ogr/envelope.rb +1 -1
- data/lib/ffi/ogr/envelope_3d.rb +1 -1
- data/lib/ffi/ogr/featurestyle.rb +1 -1
- data/lib/ffi/ogr/field.rb +1 -1
- data/lib/ffi/ogr/geocoding.rb +2 -2
- data/lib/ffi/ogr/srs_api.rb +63 -63
- data/lib/ffi/ogr/style_param.rb +2 -2
- data/lib/ffi/ogr/style_value.rb +1 -1
- data/lib/ffi/ogr.rb +11 -11
- data/lib/ffi-gdal.rb +8 -8
- data/lib/gdal/color_table.rb +6 -6
- data/lib/gdal/dataset/accessors.rb +101 -0
- data/lib/gdal/{dataset_mixins → dataset}/algorithm_methods.rb +1 -1
- data/lib/gdal/dataset/class_methods.rb +69 -0
- data/lib/gdal/dataset/internal_functions.rb +22 -0
- data/lib/gdal/{dataset_mixins → dataset}/matching.rb +1 -1
- data/lib/gdal/dataset/raster_band_methods.rb +181 -0
- data/lib/gdal/{dataset_mixins → dataset}/warp_methods.rb +1 -1
- data/lib/gdal/dataset.rb +21 -359
- data/lib/gdal/driver.rb +10 -10
- data/lib/gdal/environment_methods.rb +1 -1
- data/lib/gdal/extensions/all.rb +1 -1
- data/lib/gdal/extensions/color_entry/extensions.rb +2 -2
- data/lib/gdal/extensions/color_table/extensions.rb +2 -2
- data/lib/gdal/extensions/dataset/extensions.rb +11 -11
- data/lib/gdal/extensions/driver/extensions.rb +7 -7
- data/lib/gdal/extensions/geo_transform/extensions.rb +2 -2
- data/lib/gdal/extensions/gridder.rb +8 -8
- data/lib/gdal/extensions/gridder_options.rb +6 -6
- data/lib/gdal/extensions/raster_attribute_table/extensions.rb +1 -1
- data/lib/gdal/extensions/raster_band/algorithm_extensions.rb +4 -4
- data/lib/gdal/extensions/raster_band/coloring_extensions.rb +1 -1
- data/lib/gdal/extensions/raster_band/extensions.rb +3 -3
- data/lib/gdal/extensions/raster_band/io_extensions.rb +4 -4
- data/lib/gdal/extensions/raster_band_classifier.rb +3 -3
- data/lib/gdal/geo_transform.rb +1 -1
- data/lib/gdal/grid.rb +6 -6
- data/lib/gdal/grid_algorithms/metric_average_distance.rb +1 -1
- data/lib/gdal/grid_algorithms/metric_average_distance_pts.rb +1 -1
- data/lib/gdal/grid_algorithms/metric_count.rb +1 -1
- data/lib/gdal/grid_algorithms/metric_maximum.rb +1 -1
- data/lib/gdal/grid_algorithms/metric_minimum.rb +1 -1
- data/lib/gdal/grid_algorithms/metric_range.rb +1 -1
- data/lib/gdal/grid_algorithms.rb +9 -9
- data/lib/gdal/internal_helpers.rb +3 -3
- data/lib/gdal/logger.rb +1 -1
- data/lib/gdal/major_object.rb +6 -6
- data/lib/gdal/options.rb +2 -2
- data/lib/gdal/raster_attribute_table.rb +5 -5
- data/lib/gdal/raster_band.rb +24 -24
- data/lib/gdal/rpc_info.rb +2 -2
- data/lib/gdal/transformer.rb +1 -1
- data/lib/gdal/transformers/general_image_projection_transformer.rb +1 -1
- data/lib/gdal/transformers/general_image_projection_transformer2.rb +1 -1
- data/lib/gdal/transformers/general_image_projection_transformer3.rb +1 -1
- data/lib/gdal/version_info.rb +9 -9
- data/lib/gdal/virtual_dataset.rb +4 -4
- data/lib/gdal/warp_operation.rb +2 -2
- data/lib/gdal/warp_options.rb +2 -2
- data/lib/gdal.rb +17 -17
- data/lib/ogr/coordinate_transformation.rb +5 -5
- data/lib/ogr/data_source.rb +9 -9
- data/lib/ogr/driver.rb +9 -9
- data/lib/ogr/envelope.rb +1 -1
- data/lib/ogr/error_handling.rb +1 -1
- data/lib/ogr/extensions/all.rb +1 -1
- data/lib/ogr/extensions/data_source/capability_methods.rb +4 -4
- data/lib/ogr/extensions/data_source/data_source_extensions.rb +1 -1
- data/lib/ogr/extensions/driver/capability_methods.rb +3 -3
- data/lib/ogr/extensions/envelope/extensions.rb +1 -1
- data/lib/ogr/extensions/feature/extensions.rb +1 -1
- data/lib/ogr/extensions/feature_definition/extensions.rb +1 -1
- data/lib/ogr/extensions/geometries/point/extensions.rb +1 -1
- data/lib/ogr/extensions/geometry/container_mixins.rb +10 -10
- data/lib/ogr/extensions/geometry/ewkb_io_extensions.rb +3 -3
- data/lib/ogr/extensions/geometry/ewkb_record.rb +4 -4
- data/lib/ogr/extensions/geometry/extensions.rb +4 -7
- data/lib/ogr/extensions/geometry/rttopo_extensions.rb +2 -2
- data/lib/ogr/extensions/geometry/wkb_record.rb +3 -3
- data/lib/ogr/extensions/geometry_types/curve/extensions.rb +2 -2
- data/lib/ogr/extensions/layer/capability_methods.rb +17 -17
- data/lib/ogr/extensions/layer/extensions.rb +1 -1
- data/lib/ogr/extensions/spatial_reference/extensions.rb +1 -1
- data/lib/ogr/extensions/spatial_reference/initializers.rb +2 -2
- data/lib/ogr/extensions/style_table/extensions.rb +1 -1
- data/lib/ogr/feature.rb +15 -15
- data/lib/ogr/feature_definition.rb +2 -2
- data/lib/ogr/field.rb +5 -5
- data/lib/ogr/field_definition.rb +1 -1
- data/lib/ogr/geocoder.rb +1 -1
- data/lib/ogr/geometries/geometry_collection.rb +2 -2
- data/lib/ogr/geometries/geometry_collection_25d.rb +1 -1
- data/lib/ogr/geometries/line_string.rb +1 -1
- data/lib/ogr/geometries/line_string_25d.rb +1 -1
- data/lib/ogr/geometries/linear_ring.rb +2 -2
- data/lib/ogr/geometries/multi_line_string.rb +2 -2
- data/lib/ogr/geometries/multi_line_string_25d.rb +1 -1
- data/lib/ogr/geometries/multi_point.rb +1 -1
- data/lib/ogr/geometries/multi_point_25d.rb +1 -1
- data/lib/ogr/geometries/multi_polygon.rb +2 -2
- data/lib/ogr/geometries/multi_polygon_25d.rb +1 -1
- data/lib/ogr/geometries/point_25d.rb +1 -1
- data/lib/ogr/geometries/polygon.rb +2 -2
- data/lib/ogr/geometries/polygon_25d.rb +1 -1
- data/lib/ogr/geometry.rb +11 -11
- data/lib/ogr/geometry_types/container.rb +1 -1
- data/lib/ogr/geometry_types/curve.rb +1 -1
- data/lib/ogr/internal_helpers.rb +4 -4
- data/lib/ogr/layer.rb +8 -8
- data/lib/ogr/layer_mixins/ogr_feature_methods.rb +9 -9
- data/lib/ogr/layer_mixins/ogr_field_methods.rb +15 -15
- data/lib/ogr/layer_mixins/ogr_sql_methods.rb +2 -2
- data/lib/ogr/spatial_reference.rb +19 -19
- data/lib/ogr/spatial_reference_mixins/coordinate_system_getter_setters.rb +4 -4
- data/lib/ogr/spatial_reference_mixins/exporters.rb +9 -9
- data/lib/ogr/spatial_reference_mixins/importers.rb +2 -2
- data/lib/ogr/spatial_reference_mixins/morphers.rb +2 -2
- data/lib/ogr/spatial_reference_mixins/parameter_getter_setters.rb +1 -1
- data/lib/ogr/style_table.rb +3 -3
- data/lib/ogr/style_tool.rb +1 -1
- data/lib/ogr.rb +33 -33
- data/rakelib/docker.rake +2 -2
- metadata +14 -150
- data/bitbucket-pipelines.yml +0 -16
- data/tilt/gdal2.yml +0 -22
- 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
|
@@ -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
|