ffi-gdal 1.0.4 → 1.1.0

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 (78) hide show
  1. checksums.yaml +4 -4
  2. data/.devcontainer/Dockerfile +9 -0
  3. data/.devcontainer/devcontainer.json +98 -0
  4. data/.github/CODEOWNERS +1 -0
  5. data/.github/workflows/codacy.yml +3 -3
  6. data/.github/workflows/codeql.yml +4 -4
  7. data/.github/workflows/continuous-integration.yml +30 -19
  8. data/.github/workflows/dependency-review.yml +2 -2
  9. data/.github/workflows/specs-in-docker.yml +12 -6
  10. data/.gitignore +4 -1
  11. data/Changelog.md +40 -5
  12. data/Gemfile +4 -2
  13. data/README.md +35 -0
  14. data/lib/ext/numeric_as_data_type.rb +1 -1
  15. data/lib/ffi/cpl/vsi.rb +10 -0
  16. data/lib/ffi/gdal/gdal.rb +9 -2
  17. data/lib/ffi/gdal/grid_data_metrics_options.rb +27 -5
  18. data/lib/ffi/gdal/grid_inverse_distance_to_a_power_options.rb +30 -10
  19. data/lib/ffi/gdal/grid_moving_average_options.rb +30 -5
  20. data/lib/ffi/gdal/grid_nearest_neighbor_options.rb +24 -4
  21. data/lib/ffi/gdal/internal_helpers/gdal_version.rb +15 -0
  22. data/lib/ffi/gdal/internal_helpers/layout_version.rb +9 -0
  23. data/lib/ffi/gdal/internal_helpers/layout_version_resolver.rb +24 -0
  24. data/lib/ffi/gdal/internal_helpers.rb +11 -0
  25. data/lib/ffi/gdal/utils.rb +984 -0
  26. data/lib/ffi/gdal/version.rb +1 -1
  27. data/lib/ffi/gdal.rb +3 -1
  28. data/lib/ffi/ogr/core.rb +1 -1
  29. data/lib/ffi/ogr/srs_api.rb +17 -0
  30. data/lib/gdal/cpl_error_handler.rb +30 -15
  31. data/lib/gdal/exceptions.rb +35 -16
  32. data/lib/gdal/extensions/color_table/extensions.rb +1 -1
  33. data/lib/gdal/extensions/gridder.rb +4 -0
  34. data/lib/gdal/geo_transform.rb +13 -0
  35. data/lib/gdal/grid_algorithms/algorithm_base.rb +35 -0
  36. data/lib/gdal/grid_algorithms/inverse_distance_to_a_power.rb +3 -7
  37. data/lib/gdal/grid_algorithms/metric_average_distance.rb +5 -4
  38. data/lib/gdal/grid_algorithms/metric_average_distance_pts.rb +5 -4
  39. data/lib/gdal/grid_algorithms/metric_count.rb +5 -4
  40. data/lib/gdal/grid_algorithms/metric_maximum.rb +5 -4
  41. data/lib/gdal/grid_algorithms/metric_minimum.rb +5 -4
  42. data/lib/gdal/grid_algorithms/metric_range.rb +5 -4
  43. data/lib/gdal/grid_algorithms/moving_average.rb +3 -7
  44. data/lib/gdal/grid_algorithms/nearest_neighbor.rb +3 -7
  45. data/lib/gdal/grid_algorithms.rb +2 -0
  46. data/lib/gdal/internal_helpers.rb +8 -5
  47. data/lib/gdal/major_object.rb +6 -0
  48. data/lib/gdal/raster_band.rb +16 -12
  49. data/lib/gdal/utils/dem/options.rb +52 -0
  50. data/lib/gdal/utils/dem.rb +108 -0
  51. data/lib/gdal/utils/grid/options.rb +52 -0
  52. data/lib/gdal/utils/grid.rb +72 -0
  53. data/lib/gdal/utils/helpers/dataset_list.rb +43 -0
  54. data/lib/gdal/utils/helpers/string_list.rb +47 -0
  55. data/lib/gdal/utils/helpers.rb +11 -0
  56. data/lib/gdal/utils/info/options.rb +52 -0
  57. data/lib/gdal/utils/info.rb +40 -0
  58. data/lib/gdal/utils/nearblack/options.rb +52 -0
  59. data/lib/gdal/utils/nearblack.rb +119 -0
  60. data/lib/gdal/utils/rasterize/options.rb +52 -0
  61. data/lib/gdal/utils/rasterize.rb +108 -0
  62. data/lib/gdal/utils/translate/options.rb +52 -0
  63. data/lib/gdal/utils/translate.rb +72 -0
  64. data/lib/gdal/utils/vector_translate/options.rb +52 -0
  65. data/lib/gdal/utils/vector_translate.rb +132 -0
  66. data/lib/gdal/utils/warp/options.rb +52 -0
  67. data/lib/gdal/utils/warp.rb +118 -0
  68. data/lib/gdal/utils.rb +22 -0
  69. data/lib/gdal/warp_options.rb +11 -2
  70. data/lib/gdal.rb +1 -0
  71. data/lib/ogr/extensions/layer/extensions.rb +1 -1
  72. data/lib/ogr/extensions/spatial_reference/extensions.rb +4 -4
  73. data/lib/ogr/geometry.rb +1 -6
  74. data/lib/ogr/layer.rb +1 -1
  75. data/lib/ogr/spatial_reference.rb +27 -2
  76. metadata +32 -5
  77. data/.ruby-version +0 -1
  78. data/lib/gdal/grid_algorithms/data_metrics_base.rb +0 -14
@@ -2,6 +2,6 @@
2
2
 
3
3
  module FFI
4
4
  module GDAL
5
- VERSION = "1.0.4"
5
+ VERSION = "1.1.0"
6
6
  end
7
7
  end
data/lib/ffi/gdal.rb CHANGED
@@ -19,9 +19,11 @@ module FFI
19
19
  File.expand_path("gdal/grid_inverse_distance_to_a_power_options.rb", __dir__)
20
20
  autoload :GridMovingAverageOptions, File.expand_path("gdal/grid_moving_average_options.rb", __dir__)
21
21
  autoload :GridNearestNeighborOptions, File.expand_path("gdal/grid_nearest_neighbor_options.rb", __dir__)
22
+ autoload :InternalHelpers, File.expand_path("gdal/internal_helpers.rb", __dir__)
22
23
  autoload :Matching, File.expand_path("gdal/matching.rb", __dir__)
23
24
  autoload :RPCInfo, File.expand_path("gdal/rpc_info.rb", __dir__)
24
25
  autoload :TransformerInfo, File.expand_path("gdal/transformer_info.rb", __dir__)
26
+ autoload :Utils, File.expand_path("gdal/utils.rb", __dir__)
25
27
  autoload :VRT, File.expand_path("gdal/vrt.rb", __dir__)
26
28
  autoload :Warper, File.expand_path("gdal/warper.rb", __dir__)
27
29
  autoload :WarpOptions, File.expand_path("gdal/warp_options.rb", __dir__)
@@ -39,7 +41,7 @@ module FFI
39
41
  ogr_core.h ogr_srs_api.h
40
42
  ]
41
43
 
42
- header_search_paths = %w[/usr/local/include /usr/include /usr/include/gdal]
44
+ header_search_paths = %w[/usr/local/include /usr/include /usr/include/gdal /opt/homebrew/include/]
43
45
 
44
46
  header_files.map do |file|
45
47
  dir = header_search_paths.find do |d|
data/lib/ffi/ogr/core.rb CHANGED
@@ -121,7 +121,7 @@ module FFI
121
121
  :OGRSTSymbolPriority, 9,
122
122
  :OGRSTSymbolFontName, 10,
123
123
  :OGRSTSymbolOColor, 11,
124
- :OGRSTSymbolLast, 12
124
+ :OGRSTSymbolLast, 12
125
125
 
126
126
  STLabelParam = enum :OGRSTLabelFontName, 0,
127
127
  :OGRSTLabelSize, 1,
@@ -38,6 +38,13 @@ module FFI
38
38
  :ODT_LD_Min, 10_000,
39
39
  :ODT_LD_Max, 32_767
40
40
 
41
+ # https://gdal.org/api/ogr_srs_api.html#_CPPv422OSRAxisMappingStrategy
42
+ OSRAxisMappingStrategy = enum(
43
+ :OAMS_TRADITIONAL_GIS_ORDER, 0,
44
+ :OAMS_AUTHORITY_COMPLIANT, 1,
45
+ :OAMS_CUSTOM, 2
46
+ )
47
+
41
48
  # -----------------------------------------------------------------------
42
49
  # Constants
43
50
  # -----------------------------------------------------------------------
@@ -125,6 +132,10 @@ module FFI
125
132
  # ~~~~~~~~~~~~~
126
133
  # SpatialReference
127
134
  # ~~~~~~~~~~~~~
135
+
136
+ # https://gdal.org/api/ogr_srs_api.html#_CPPv417OSRGetPROJVersionPiPiPi
137
+ attach_function :OSRGetPROJVersion, %i[pointer pointer pointer], :void
138
+
128
139
  attach_function :OSRNewSpatialReference, %i[string], :OGRSpatialReferenceH
129
140
  attach_function :OSRCloneGeogCS, %i[OGRSpatialReferenceH], :OGRSpatialReferenceH
130
141
  attach_function :OSRClone, %i[OGRSpatialReferenceH], :OGRSpatialReferenceH
@@ -215,6 +226,12 @@ module FFI
215
226
  %i[OGRSpatialReferenceH string int pointer],
216
227
  :string
217
228
 
229
+ # https://gdal.org/api/ogr_srs_api.html#_CPPv425OSRGetAxisMappingStrategy20OGRSpatialReferenceH
230
+ attach_function :OSRGetAxisMappingStrategy, %i[OGRSpatialReferenceH], OSRAxisMappingStrategy
231
+
232
+ # https://gdal.org/api/ogr_srs_api.html#_CPPv425OSRGetAxisMappingStrategy20OGRSpatialReferenceH
233
+ attach_function :OSRSetAxisMappingStrategy, [:OGRSpatialReferenceH, OSRAxisMappingStrategy], :void
234
+
218
235
  attach_function :OSRSetACEA,
219
236
  %i[OGRSpatialReferenceH double double double double double double],
220
237
  FFI::OGR::Core::Err
@@ -9,19 +9,27 @@ module GDAL
9
9
  class CPLErrorHandler
10
10
  include GDAL::Logger
11
11
 
12
+ # NOTE: Error codes are defined in https://gdal.org/doxygen/cpl__error_8h_source.html
12
13
  CPLE_MAP = [
13
- { cple: :CPLE_None, exception: nil },
14
- { cple: :CPLE_AppDefined, exception: GDAL::Error },
15
- { cple: :CPLE_OutOfMemory, exception: ::NoMemoryError },
16
- { cple: :CPLE_FileIO, exception: ::IOError },
17
- { cple: :CPLE_OpenFailed, exception: GDAL::OpenFailure },
18
- { cple: :CPLE_IllegalArg, exception: ::ArgumentError },
19
- { cple: :CPLE_NotSupported, exception: GDAL::UnsupportedOperation },
20
- { cple: :CPLE_AssertionFailed, exception: ::RuntimeError },
21
- { cple: :CPLE_NoWriteAccess, exception: GDAL::NoWriteAccess },
22
- { cple: :CPLE_UserInterrupt, exception: ::Interrupt },
23
- { cple: :CPLE_ObjectNull, exception: GDAL::NullObject }
14
+ { cple: :CPLE_None, exception: nil }.freeze,
15
+ { cple: :CPLE_AppDefined, exception: GDAL::Error }.freeze,
16
+ { cple: :CPLE_OutOfMemory, exception: ::NoMemoryError }.freeze,
17
+ { cple: :CPLE_FileIO, exception: ::IOError }.freeze,
18
+ { cple: :CPLE_OpenFailed, exception: GDAL::OpenFailure }.freeze,
19
+ { cple: :CPLE_IllegalArg, exception: ::ArgumentError }.freeze,
20
+ { cple: :CPLE_NotSupported, exception: GDAL::UnsupportedOperation }.freeze,
21
+ { cple: :CPLE_AssertionFailed, exception: ::RuntimeError }.freeze,
22
+ { cple: :CPLE_NoWriteAccess, exception: GDAL::NoWriteAccess }.freeze,
23
+ { cple: :CPLE_UserInterrupt, exception: ::Interrupt }.freeze,
24
+ { cple: :CPLE_ObjectNull, exception: GDAL::NullObject }.freeze,
25
+ { cple: :CPLE_HttpResponse, exception: GDAL::HttpResponse }.freeze,
26
+ { cple: :CPLE_AWSBucketNotFound, exception: GDAL::AWSBucketNotFound }.freeze,
27
+ { cple: :CPLE_AWSObjectNotFound, exception: GDAL::AWSObjectNotFound }.freeze,
28
+ { cple: :CPLE_AWSAccessDenied, exception: GDAL::AWSAccessDenied }.freeze,
29
+ { cple: :CPLE_AWSInvalidCredentials, exception: GDAL::AWSInvalidCredentials }.freeze,
30
+ { cple: :CPLE_AWSSignatureDoesNotMatch, exception: GDAL::AWSSignatureDoesNotMatch }.freeze
24
31
  ].freeze
32
+ FALLBACK_CPLE_EXCEPTION = { exception: GDAL::Error }.freeze
25
33
 
26
34
  FAIL_PROC = lambda do |exception, message|
27
35
  ex = exception ? exception.new(message) : GDAL::Error.new(message)
@@ -65,11 +73,15 @@ module GDAL
65
73
 
66
74
  def initialize
67
75
  @on_none = SUCCESS_PROC
68
- @on_debug = SUCCESS_PROC
76
+
77
+ @on_debug = lambda do |_, message|
78
+ logger.debug(message)
79
+ true
80
+ end
69
81
 
70
82
  @on_warning = lambda do |_, message|
71
- warn(message)
72
- false
83
+ logger.warn(message)
84
+ true
73
85
  end
74
86
 
75
87
  @on_failure = FAIL_PROC
@@ -123,7 +135,10 @@ module GDAL
123
135
 
124
136
  # @return Whatever the Proc evaluates.
125
137
  def result(error_class, error_number, message)
126
- error_class_map(error_class).call(CPLE_MAP[error_number][:exception], message)
138
+ error_class_map(error_class).call(
139
+ CPLE_MAP.fetch(error_number, FALLBACK_CPLE_EXCEPTION).fetch(:exception),
140
+ message
141
+ )
127
142
  end
128
143
 
129
144
  def error_class_map(error_class)
@@ -1,22 +1,50 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GDAL
4
- class BufferTooSmall < StandardError
5
- end
6
-
7
- class CreateFail < StandardError
8
- end
9
-
10
4
  class Error < ::RuntimeError
11
5
  end
12
6
 
13
- class OpenFailure < StandardError
7
+ # CPLE_OpenFailed
8
+ class OpenFailure < ::StandardError
14
9
  def initialize(file, msg = nil)
15
10
  message = msg || "Unable to open file '#{file}'. Perhaps an unsupported file format?"
16
11
  super(message)
17
12
  end
18
13
  end
19
14
 
15
+ # CPLE_NotSupported
16
+ class UnsupportedOperation < ::StandardError; end
17
+
18
+ # CPLE_NoWriteAccess
19
+ class NoWriteAccess < ::RuntimeError; end
20
+
21
+ # CPLE_ObjectNull
22
+ class NullObject < ::TypeError; end
23
+
24
+ # CPLE_HttpResponse
25
+ class HttpResponse < ::RuntimeError; end
26
+
27
+ # CPLE_AWSBucketNotFound
28
+ class AWSBucketNotFound < ::RuntimeError; end
29
+
30
+ # CPLE_AWSObjectNotFound
31
+ class AWSObjectNotFound < ::RuntimeError; end
32
+
33
+ # CPLE_AWSAccessDenied
34
+ class AWSAccessDenied < ::RuntimeError; end
35
+
36
+ # CPLE_AWSInvalidCredentials
37
+ class AWSInvalidCredentials < ::RuntimeError; end
38
+
39
+ # CPLE_AWSSignatureDoesNotMatch
40
+ class AWSSignatureDoesNotMatch < ::RuntimeError; end
41
+
42
+ class BufferTooSmall < StandardError
43
+ end
44
+
45
+ class CreateFail < StandardError
46
+ end
47
+
20
48
  class InvalidAccessFlag < RuntimeError
21
49
  end
22
50
 
@@ -51,12 +79,6 @@ module GDAL
51
79
  class NoValuesToGrid < RuntimeError
52
80
  end
53
81
 
54
- class NoWriteAccess < RuntimeError
55
- end
56
-
57
- class NullObject < TypeError
58
- end
59
-
60
82
  class RequiredBandNotFound < StandardError
61
83
  end
62
84
 
@@ -69,7 +91,4 @@ module GDAL
69
91
 
70
92
  class UnknownRasterAttributeTableType < StandardError
71
93
  end
72
-
73
- class UnsupportedOperation < StandardError
74
- end
75
94
  end
@@ -10,7 +10,7 @@ module GDAL
10
10
  raise "Invalid ColorEntry number 'color#{color_number}'" unless (1..4).to_a.include? color_number
11
11
 
12
12
  Array.new(color_entry_count) do |i|
13
- color_entry(i).send("color#{color_number}".to_sym)
13
+ color_entry(i).send(:"color#{color_number}")
14
14
  end
15
15
  end
16
16
 
@@ -4,6 +4,10 @@ require "narray"
4
4
  require "gdal"
5
5
  require "gdal/options"
6
6
  require "ogr"
7
+ require "ogr/extensions/envelope/extensions"
8
+ require "ogr/extensions/layer/extensions"
9
+ require "gdal/extensions/geo_transform/extensions"
10
+
7
11
  require_relative "gridder_options"
8
12
  require_relative "gridder/point_extracting"
9
13
 
@@ -40,6 +40,19 @@ module GDAL
40
40
  self.y_rotation ||= 0.0
41
41
  end
42
42
 
43
+ # @param other [GDAL::GeoTransform]
44
+ # @return [Boolean]
45
+ def ==(other)
46
+ return false unless other.is_a?(GDAL::GeoTransform)
47
+
48
+ x_origin == other.x_origin &&
49
+ pixel_width == other.pixel_width &&
50
+ x_rotation == other.x_rotation &&
51
+ y_origin == other.y_origin &&
52
+ y_rotation == other.y_rotation &&
53
+ pixel_height == other.pixel_height
54
+ end
55
+
43
56
  def null?
44
57
  @c_pointer.null?
45
58
  end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GDAL
4
+ module GridAlgorithms
5
+ # Base abstract class for all grid algorithms.
6
+ class AlgorithmBase
7
+ # @return Options object.
8
+ attr_reader :options
9
+
10
+ def initialize
11
+ @options = options_class.new
12
+ assign_size_of_structure
13
+ end
14
+
15
+ # @return [Class] Options class.
16
+ def options_class
17
+ # This method must be overridden in subclasses.
18
+ end
19
+
20
+ # @return [Symbol] C identifier for the algorithm.
21
+ def c_identifier
22
+ # This method must be overridden in subclasses.
23
+ end
24
+
25
+ private
26
+
27
+ def assign_size_of_structure
28
+ # Starting GDAL 3.6.0 we must assign nSizeOfStructure to the size of the structure.
29
+ return unless @options.members.include?(:n_size_of_structure)
30
+
31
+ @options[:n_size_of_structure] = @options.size
32
+ end
33
+ end
34
+ end
35
+ end
@@ -2,15 +2,11 @@
2
2
 
3
3
  module GDAL
4
4
  module GridAlgorithms
5
- class InverseDistanceToAPower
6
- # @return [FFI::GDAL::GridInverseDistanceToAPowerOptions]
7
- attr_reader :options
8
-
9
- def initialize
10
- @options = FFI::GDAL::GridInverseDistanceToAPowerOptions.new
5
+ class InverseDistanceToAPower < AlgorithmBase
6
+ def options_class
7
+ ::FFI::GDAL::GridInverseDistanceToAPowerOptions
11
8
  end
12
9
 
13
- # @return [Symbol]
14
10
  def c_identifier
15
11
  :GGA_InverseDistanceToAPower
16
12
  end
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "data_metrics_base"
4
-
5
3
  module GDAL
6
4
  module GridAlgorithms
7
- class MetricAverageDistance < DataMetricsBase
8
- # @return [Symbol]
5
+ class MetricAverageDistance < AlgorithmBase
6
+ def options_class
7
+ ::FFI::GDAL::GridDataMetricsOptions
8
+ end
9
+
9
10
  def c_identifier
10
11
  :GGA_MetricAverageDistance
11
12
  end
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "data_metrics_base"
4
-
5
3
  module GDAL
6
4
  module GridAlgorithms
7
- class MetricAverageDistancePts < DataMetricsBase
8
- # @return [Symbol]
5
+ class MetricAverageDistancePts < AlgorithmBase
6
+ def options_class
7
+ ::FFI::GDAL::GridDataMetricsOptions
8
+ end
9
+
9
10
  def c_identifier
10
11
  :GGA_MetricAverageDistancePts
11
12
  end
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "data_metrics_base"
4
-
5
3
  module GDAL
6
4
  module GridAlgorithms
7
- class MetricCount < DataMetricsBase
8
- # @return [Symbol]
5
+ class MetricCount < AlgorithmBase
6
+ def options_class
7
+ ::FFI::GDAL::GridDataMetricsOptions
8
+ end
9
+
9
10
  def c_identifier
10
11
  :GGA_MetricCount
11
12
  end
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "data_metrics_base"
4
-
5
3
  module GDAL
6
4
  module GridAlgorithms
7
- class MetricMaximum < DataMetricsBase
8
- # @return [Symbol]
5
+ class MetricMaximum < AlgorithmBase
6
+ def options_class
7
+ ::FFI::GDAL::GridDataMetricsOptions
8
+ end
9
+
9
10
  def c_identifier
10
11
  :GGA_MetricMaximum
11
12
  end
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "data_metrics_base"
4
-
5
3
  module GDAL
6
4
  module GridAlgorithms
7
- class MetricMinimum < DataMetricsBase
8
- # @return [Symbol]
5
+ class MetricMinimum < AlgorithmBase
6
+ def options_class
7
+ ::FFI::GDAL::GridDataMetricsOptions
8
+ end
9
+
9
10
  def c_identifier
10
11
  :GGA_MetricMinimum
11
12
  end
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "data_metrics_base"
4
-
5
3
  module GDAL
6
4
  module GridAlgorithms
7
- class MetricRange < DataMetricsBase
8
- # @return [Symbol]
5
+ class MetricRange < AlgorithmBase
6
+ def options_class
7
+ ::FFI::GDAL::GridDataMetricsOptions
8
+ end
9
+
9
10
  def c_identifier
10
11
  :GGA_MetricRange
11
12
  end
@@ -2,15 +2,11 @@
2
2
 
3
3
  module GDAL
4
4
  module GridAlgorithms
5
- class MovingAverage
6
- # @return [FFI::GDAL::GridMovingAverageOptions]
7
- attr_reader :options
8
-
9
- def initialize
10
- @options = FFI::GDAL::GridMovingAverageOptions.new
5
+ class MovingAverage < AlgorithmBase
6
+ def options_class
7
+ ::FFI::GDAL::GridMovingAverageOptions
11
8
  end
12
9
 
13
- # @return [Symbol]
14
10
  def c_identifier
15
11
  :GGA_MovingAverage
16
12
  end
@@ -2,15 +2,11 @@
2
2
 
3
3
  module GDAL
4
4
  module GridAlgorithms
5
- class NearestNeighbor
6
- # @return [FFI::GDAL::GridNearestNeighborOptions]
7
- attr_reader :options
8
-
9
- def initialize
10
- @options = FFI::GDAL::GridNearestNeighborOptions.new
5
+ class NearestNeighbor < AlgorithmBase
6
+ def options_class
7
+ ::FFI::GDAL::GridNearestNeighborOptions
11
8
  end
12
9
 
13
- # @return [Symbol]
14
10
  def c_identifier
15
11
  :GGA_NearestNeighbor
16
12
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  module GDAL
4
4
  module GridAlgorithms
5
+ autoload :AlgorithmBase,
6
+ File.expand_path("grid_algorithms/algorithm_base", __dir__)
5
7
  autoload :InverseDistanceToAPower,
6
8
  File.expand_path("grid_algorithms/inverse_distance_to_a_power", __dir__)
7
9
  autoload :MetricAverageDistance,
@@ -106,7 +106,7 @@ module GDAL
106
106
  def _read_pointer_pointer_safely(pointer_ptr, type)
107
107
  return if pointer_ptr.read_pointer.null?
108
108
 
109
- pointer_ptr.read_pointer.send("read_#{type}".to_sym)
109
+ pointer_ptr.read_pointer.send(:"read_#{type}")
110
110
  end
111
111
 
112
112
  # Convenience function for allocating a pointer to a string (**char),
@@ -141,10 +141,13 @@ module GDAL
141
141
  def _gdal_data_type_to_ffi(data_type)
142
142
  case data_type
143
143
  when :GDT_Byte then :uchar
144
+ when :GDT_Int8 then :int8
144
145
  when :GDT_UInt16 then :uint16
145
146
  when :GDT_Int16, :GDT_CInt16 then :int16
146
147
  when :GDT_UInt32 then :uint32
147
148
  when :GDT_Int32, :GDT_CInt32 then :int32
149
+ when :GDT_UInt64 then :uint64
150
+ when :GDT_Int64 then :int64
148
151
  when :GDT_Float32, :GDT_CFloat32 then :float
149
152
  when :GDT_Float64, :GDT_CFloat64 then :double
150
153
  else
@@ -201,9 +204,9 @@ module GDAL
201
204
  # @return [Number, Array<Number>]
202
205
  def _read_pointer(pointer, data_type, length = 1)
203
206
  if length == 1
204
- pointer.send("read_#{_gdal_data_type_to_ffi(data_type)}")
207
+ pointer.send(:"read_#{_gdal_data_type_to_ffi(data_type)}")
205
208
  else
206
- pointer.send("read_array_of_#{_gdal_data_type_to_ffi(data_type)}", length)
209
+ pointer.send(:"read_array_of_#{_gdal_data_type_to_ffi(data_type)}", length)
207
210
  end
208
211
  end
209
212
 
@@ -217,10 +220,10 @@ module GDAL
217
220
  # with size > 1, the "write_array_of_" method will be called.
218
221
  def _write_pointer(pointer, data_type, data)
219
222
  if data.is_a?(Array) && data.size > 1
220
- pointer.send("write_array_of_#{_gdal_data_type_to_ffi(data_type)}", data)
223
+ pointer.send(:"write_array_of_#{_gdal_data_type_to_ffi(data_type)}", data)
221
224
  else
222
225
  data = data.first if data.is_a?(Array)
223
- pointer.send("write_#{_gdal_data_type_to_ffi(data_type)}", data)
226
+ pointer.send(:"write_#{_gdal_data_type_to_ffi(data_type)}", data)
224
227
  end
225
228
  end
226
229
 
@@ -75,6 +75,12 @@ module GDAL
75
75
  desc
76
76
  end
77
77
 
78
+ # @param description [String]
79
+ # @return [String]
80
+ def description=(description)
81
+ FFI::GDAL::GDAL.GDALSetDescription(@c_pointer, description)
82
+ end
83
+
78
84
  def null?
79
85
  @c_pointer.null?
80
86
  end
@@ -347,14 +347,16 @@ module GDAL
347
347
  # returned.
348
348
  #
349
349
  # @return Float
350
- # @raise GDAL::Error if the underlying call fails.
351
350
  def scale
352
- success = FFI::MemoryPointer.new(:bool)
353
- result = FFI::GDAL::GDAL.GDALGetRasterScale(@c_pointer, success)
354
-
355
- raise GDAL::Error, "GDALGetRasterScale failed" unless success.read_bytes(1).to_bool
351
+ FFI::GDAL::GDAL.GDALGetRasterScale(@c_pointer, nil)
352
+ end
356
353
 
357
- result
354
+ # Check if the scale is set.
355
+ # @return [Boolean]
356
+ def scale?
357
+ success = FFI::MemoryPointer.new(:bool)
358
+ FFI::GDAL::GDAL.GDALGetRasterScale(@c_pointer, success)
359
+ success.read_bytes(1).to_bool
358
360
  end
359
361
 
360
362
  # @param new_scale [Float]
@@ -376,14 +378,16 @@ module GDAL
376
378
  # returned.
377
379
  #
378
380
  # @return Float
379
- # @raise GDAL::Error if the underlying call fails.
380
381
  def offset
381
- success = FFI::MemoryPointer.new(:bool)
382
- result = FFI::GDAL::GDAL.GDALGetRasterOffset(@c_pointer, success)
383
-
384
- raise GDAL::Error, "GDALGetRasterOffset failed" unless success.read_bytes(1).to_bool
382
+ FFI::GDAL::GDAL.GDALGetRasterOffset(@c_pointer, nil)
383
+ end
385
384
 
386
- result
385
+ # Check if the offset is set.
386
+ # @return [Boolean]
387
+ def offset?
388
+ success = FFI::MemoryPointer.new(:bool)
389
+ FFI::GDAL::GDAL.GDALGetRasterOffset(@c_pointer, success)
390
+ success.read_bytes(1).to_bool
387
391
  end
388
392
 
389
393
  # Sets the scaling offset. Very few formats support this method.
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GDAL
4
+ module Utils
5
+ class DEM
6
+ # Ruby wrapper for GDALDEMProcessingOptions C API (options for gdaldem utility).
7
+ #
8
+ # @see GDAL::Utils::DEM
9
+ # @see https://gdal.org/programs/gdaldem.html gdaldem utility documentation.
10
+ class Options
11
+ # @private
12
+ class AutoPointer < ::FFI::AutoPointer
13
+ # @param pointer [FFI::Pointer]
14
+ def self.release(pointer)
15
+ return unless pointer && !pointer.null?
16
+
17
+ ::FFI::GDAL::Utils.GDALDEMProcessingOptionsFree(pointer)
18
+ end
19
+ end
20
+
21
+ # @return [AutoPointer] C pointer to the GDALDEMProcessingOptions.
22
+ attr_reader :c_pointer
23
+
24
+ # @return [Array<String>] The options.
25
+ attr_reader :options
26
+
27
+ # Create a new instance.
28
+ #
29
+ # @see https://gdal.org/programs/gdaldem.html
30
+ # List of available options could be found in gdaldem utility documentation.
31
+ #
32
+ # @example Create a new instance.
33
+ # options = GDAL::Utils::DEM::Options.new(options: ["-of", "GTiff", "-co", "COMPRESS=DEFLATE"])
34
+ #
35
+ # @param options [Array<String>] The options list.
36
+ def initialize(options: [])
37
+ @options = options
38
+ @string_list = ::GDAL::Utils::Helpers::StringList.new(strings: options)
39
+ @c_pointer = AutoPointer.new(options_pointer)
40
+ end
41
+
42
+ private
43
+
44
+ attr_reader :string_list
45
+
46
+ def options_pointer
47
+ ::FFI::GDAL::Utils.GDALDEMProcessingOptionsNew(string_list.c_pointer, nil)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end