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.
- checksums.yaml +4 -4
- data/History.md +40 -0
- data/bitbucket-pipelines.yml +16 -0
- data/lib/ffi/gdal/version.rb +1 -1
- data/lib/ffi/gdal/warp_options.rb +18 -4
- data/lib/ffi/gdal/warper.rb +17 -1
- data/lib/ffi/gdal.rb +1 -1
- data/lib/gdal/color_entry_mixins/extensions.rb +0 -14
- data/lib/gdal/color_table_mixins/extensions.rb +0 -14
- data/lib/gdal/dataset_mixins/algorithm_methods.rb +2 -2
- data/lib/gdal/dataset_mixins/extensions.rb +3 -43
- data/lib/gdal/dataset_mixins/warp_methods.rb +50 -11
- data/lib/gdal/geo_transform_mixins/extensions.rb +0 -17
- data/lib/gdal/grid.rb +2 -1
- data/lib/gdal/gridder/point_extracting.rb +1 -2
- data/lib/gdal/gridder.rb +7 -2
- data/lib/gdal/options.rb +14 -13
- data/lib/gdal/raster_attribute_table_mixins/extensions.rb +0 -15
- data/lib/gdal/raster_band.rb +5 -3
- data/lib/gdal/raster_band_classifier.rb +5 -3
- data/lib/gdal/raster_band_mixins/extensions.rb +0 -35
- data/lib/gdal/raster_band_mixins/io_extensions.rb +4 -3
- data/lib/gdal/warp_options.rb +99 -35
- data/lib/gdal.rb +1 -0
- data/lib/ogr/data_source_extensions.rb +0 -19
- data/lib/ogr/envelope_extensions.rb +0 -22
- data/lib/ogr/feature_definition_extensions.rb +0 -18
- data/lib/ogr/feature_extensions.rb +0 -27
- data/lib/ogr/field_definition.rb +0 -3
- data/lib/ogr/geometry.rb +0 -1
- data/lib/ogr/geometry_field_definition.rb +0 -4
- data/lib/ogr/geometry_mixins/extensions.rb +0 -29
- data/lib/ogr/geometry_types/curve.rb +1 -1
- data/lib/ogr/layer.rb +3 -1
- data/lib/ogr/layer_mixins/extensions.rb +1 -25
- data/lib/ogr/spatial_reference.rb +10 -2
- data/lib/ogr/spatial_reference_extensions.rb +0 -26
- data/lib/ogr/style_table_extensions.rb +0 -10
- data/spec/integration/gdal/raster_band_info_spec.rb +27 -5
- data/spec/integration/ogr/layer_spec.rb +0 -6
- data/spec/support/images/123.tiff +0 -0
- data/spec/unit/ffi/gdal_spec.rb +1 -0
- data/spec/unit/gdal/dataset_mixins/warp_methods_spec.rb +52 -0
- data/spec/unit/gdal/geo_transform_spec.rb +0 -13
- data/spec/unit/gdal/grid_spec.rb +8 -0
- data/spec/unit/gdal/gridder_spec.rb +40 -0
- data/spec/unit/gdal/options_spec.rb +26 -1
- data/spec/unit/gdal/warp_options_spec.rb +336 -0
- data/spec/unit/ogr/feature_definition_spec.rb +0 -19
- data/spec/unit/ogr/feature_extensions_spec.rb +1 -1
- data/spec/unit/ogr/field_definition_spec.rb +0 -19
- data/spec/unit/ogr/geometry_field_definition_spec.rb +0 -16
- data/spec/unit/ogr/style_table_spec.rb +0 -26
- metadata +10 -5
- data/lib/ogr/field_definition_extensions.rb +0 -22
- data/lib/ogr/geometry_field_definition_extensions.rb +0 -19
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'gdal'
|
3
|
+
|
4
|
+
RSpec.describe GDAL::Dataset do
|
5
|
+
let(:source_file_path) do
|
6
|
+
File.expand_path('../../../support/images/osgeo/geotiff/GeogToWGS84GeoKey/GeogToWGS84GeoKey5.tif', __dir__)
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:output_dir) { Dir.mktmpdir(File.basename(__FILE__, '.rb')) }
|
10
|
+
let(:output_file) { File.join(output_dir, 'reprojected_image.tif') }
|
11
|
+
|
12
|
+
after { FileUtils.rm_rf(output_dir) if Dir.exist?(output_dir) }
|
13
|
+
|
14
|
+
subject { described_class.open(source_file_path, 'r', false) }
|
15
|
+
|
16
|
+
describe '#reproject_image' do
|
17
|
+
let(:dest_dataset) do
|
18
|
+
dest_width = subject.raster_x_size / 4
|
19
|
+
dest_height = subject.raster_y_size / 4
|
20
|
+
dataset = GDAL::Driver.by_name('GTiff').create_dataset(output_file, dest_width, dest_height,
|
21
|
+
data_type: subject.raster_band(1).data_type)
|
22
|
+
dataset.geo_transform = subject.geo_transform.dup
|
23
|
+
dataset.projection = OGR::SpatialReference.new_from_epsg(3857).to_wkt
|
24
|
+
dataset
|
25
|
+
end
|
26
|
+
|
27
|
+
after { dest_dataset.close }
|
28
|
+
|
29
|
+
it 'creates a valid dataset' do
|
30
|
+
subject.reproject_image(dest_dataset, :GRA_CubicSpline)
|
31
|
+
|
32
|
+
dest_dataset.flush_cache
|
33
|
+
expect(dest_dataset.projection).to match(/AUTHORITY\[\"EPSG\",\"3857\"\]/)
|
34
|
+
expect(dest_dataset.raster_count).to eq(subject.raster_count)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '#create_and_reproject_image' do
|
39
|
+
let(:output_projection) { OGR::SpatialReference.new_from_epsg(3857).to_wkt }
|
40
|
+
|
41
|
+
it 'creates a valid dataset' do
|
42
|
+
subject.create_and_reproject_image(output_file, :GRA_NearestNeighbor, OGR::SpatialReference.new_from_epsg(3857).to_wkt, GDAL::Driver.by_name('GTiff'))
|
43
|
+
|
44
|
+
dest_dataset = GDAL::Dataset.open(output_file, 'r')
|
45
|
+
expect(dest_dataset.projection).to match(/AUTHORITY\[\"EPSG\",\"3857\"\]/)
|
46
|
+
expect(dest_dataset.raster_count).to eq(subject.raster_count)
|
47
|
+
|
48
|
+
dest_driver = dest_dataset.driver
|
49
|
+
expect(dest_driver.long_name).to eq 'GeoTIFF'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -259,18 +259,5 @@ RSpec.describe GDAL::GeoTransform do
|
|
259
259
|
expect(result).to eq pixel: -9000, line: -19_000
|
260
260
|
end
|
261
261
|
end
|
262
|
-
|
263
|
-
describe '#as_json' do
|
264
|
-
it 'returns the attributes as a Hash' do
|
265
|
-
expect(subject.as_json).to eq(
|
266
|
-
x_origin: 0.0,
|
267
|
-
x_rotation: 0.0,
|
268
|
-
pixel_width: 0.0,
|
269
|
-
y_origin: 0.0,
|
270
|
-
y_rotation: 0.0,
|
271
|
-
pixel_height: 0.0
|
272
|
-
)
|
273
|
-
end
|
274
|
-
end
|
275
262
|
end
|
276
263
|
end
|
data/spec/unit/gdal/grid_spec.rb
CHANGED
@@ -12,6 +12,14 @@ RSpec.describe GDAL::Grid do
|
|
12
12
|
it { is_expected.to respond_to :algorithm_type }
|
13
13
|
end
|
14
14
|
|
15
|
+
describe '#create' do
|
16
|
+
context 'no points to grid' do
|
17
|
+
it 'raises a GDAL::NoValuesToGrid' do
|
18
|
+
expect { subject.create([], {}, nil) }.to raise_exception GDAL::NoValuesToGrid
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
15
23
|
describe '#make_points_pointer' do
|
16
24
|
context 'array has values' do
|
17
25
|
let(:points) { [1, 2, 3, 4] }
|
@@ -137,4 +137,44 @@ RSpec.describe GDAL::Gridder do
|
|
137
137
|
end
|
138
138
|
end
|
139
139
|
end
|
140
|
+
|
141
|
+
describe '#build_block_count' do
|
142
|
+
it 'builds block sizes for both x and y' do
|
143
|
+
raster_width = 4
|
144
|
+
block_x_size = 2
|
145
|
+
raster_height = 5
|
146
|
+
block_y_size = 3
|
147
|
+
|
148
|
+
expect(subject).to receive(:build_block_size).with(raster_width, block_x_size).
|
149
|
+
and_call_original
|
150
|
+
expect(subject).to receive(:build_block_size).with(raster_height, block_y_size).
|
151
|
+
and_call_original
|
152
|
+
|
153
|
+
subject.send(:build_block_count, block_x_size, block_y_size, raster_width, raster_height)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
describe '#build_block_size' do
|
158
|
+
context 'calculation should not be evenly divisible' do
|
159
|
+
it 'returns the floor of the count' do
|
160
|
+
raster_width = 4
|
161
|
+
block_x_size = 2
|
162
|
+
|
163
|
+
result = subject.send(:build_block_size, raster_width, block_x_size)
|
164
|
+
|
165
|
+
expect(result).to eq 2
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
context 'calculation should be evenly divisible' do
|
170
|
+
it 'returns the floor of the count' do
|
171
|
+
raster_width = 4
|
172
|
+
block_x_size = 1
|
173
|
+
|
174
|
+
result = subject.send(:build_block_size, raster_width, block_x_size)
|
175
|
+
|
176
|
+
expect(result).to eq 4
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
140
180
|
end
|
@@ -2,5 +2,30 @@ require 'spec_helper'
|
|
2
2
|
require 'gdal/options'
|
3
3
|
|
4
4
|
RSpec.describe GDAL::Options do
|
5
|
-
|
5
|
+
describe '.to_hash' do
|
6
|
+
subject { described_class.to_hash(pointer) }
|
7
|
+
|
8
|
+
context 'options are set' do
|
9
|
+
let(:pointer) { described_class.pointer(hash) }
|
10
|
+
|
11
|
+
let(:hash) do
|
12
|
+
{
|
13
|
+
one: 'ONE',
|
14
|
+
two: 'TWO'
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'returns the Ruby Hash' do
|
19
|
+
expect(subject).to eq(hash)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'pointer is null' do
|
24
|
+
let(:pointer) { FFI::MemoryPointer.new(:string) }
|
25
|
+
|
26
|
+
it 'returns an empty Hash' do
|
27
|
+
expect(subject).to eq({})
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
6
31
|
end
|
@@ -0,0 +1,336 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'gdal/warp_options'
|
3
|
+
|
4
|
+
RSpec.describe GDAL::WarpOptions do
|
5
|
+
shared_examples 'a WarpOptions object' do
|
6
|
+
it 'inits proper types' do
|
7
|
+
expect(subject.warp_operation_options).to be_a Hash
|
8
|
+
|
9
|
+
expect(subject.source_bands).to be_a Array
|
10
|
+
expect(subject.destination_bands).to be_a Array
|
11
|
+
|
12
|
+
expect(subject.source_no_data_real).to be_a Array
|
13
|
+
expect(subject.source_no_data_imaginary).to be_a Array
|
14
|
+
expect(subject.destination_no_data_real).to be_a Array
|
15
|
+
expect(subject.destination_no_data_imaginary).to be_a Array
|
16
|
+
|
17
|
+
expect(subject.progress).to be_a FFI::Function
|
18
|
+
expect(subject.progress_arg).to be_a FFI::Pointer
|
19
|
+
expect(subject.transformer).to be_a FFI::Function
|
20
|
+
expect(subject.transformer_arg).to be_a FFI::Pointer
|
21
|
+
|
22
|
+
expect(subject.source_per_band_validity_mask_function).to be_a FFI::Pointer
|
23
|
+
expect(subject.source_per_band_validity_mask_function_arg).to be_a FFI::Pointer
|
24
|
+
expect(subject.source_validity_mask_function).to be_a FFI::Function
|
25
|
+
expect(subject.source_validity_mask_function_arg).to be_a FFI::Pointer
|
26
|
+
expect(subject.source_density_mask_function).to be_a FFI::Function
|
27
|
+
expect(subject.source_density_mask_function_arg).to be_a FFI::Pointer
|
28
|
+
|
29
|
+
expect(subject.destination_density_mask_function).to be_a FFI::Function
|
30
|
+
expect(subject.destination_density_mask_function_arg).to be_a FFI::Pointer
|
31
|
+
expect(subject.destination_validity_mask_function).to be_a FFI::Function
|
32
|
+
expect(subject.destination_validity_mask_function_arg).to be_a FFI::Pointer
|
33
|
+
|
34
|
+
expect(subject.pre_warp_chunk_processor).to be_a FFI::Function
|
35
|
+
expect(subject.pre_warp_processor_arg).to be_a FFI::Pointer
|
36
|
+
expect(subject.post_warp_chunk_processor).to be_a FFI::Function
|
37
|
+
expect(subject.post_warp_processor_arg).to be_a FFI::Pointer
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '#initialize' do
|
42
|
+
context 'with no options' do
|
43
|
+
it_behaves_like 'a WarpOptions object'
|
44
|
+
|
45
|
+
it 'inits a FFI::GDAL::WarpOptions struct internally, with nothing set' do
|
46
|
+
expect(subject.warp_operation_options).to eq({})
|
47
|
+
|
48
|
+
expect(subject.warp_memory_limit).to be_zero
|
49
|
+
expect(subject.resample_alg).to eq(:GRA_NearestNeighbor) # 0 enum
|
50
|
+
expect(subject.working_data_type).to eq(:GDT_Unknown) # 0 enum
|
51
|
+
|
52
|
+
expect(subject.source_dataset).to be_nil
|
53
|
+
expect(subject.destination_dataset).to be_nil
|
54
|
+
|
55
|
+
expect(subject.band_count).to be_zero
|
56
|
+
expect(subject.source_bands).to be_empty
|
57
|
+
expect(subject.destination_bands).to be_empty
|
58
|
+
|
59
|
+
expect(subject.source_alpha_band).to be_zero
|
60
|
+
expect(subject.destination_alpha_band).to be_zero
|
61
|
+
|
62
|
+
expect(subject.source_no_data_real).to eq([])
|
63
|
+
expect(subject.source_no_data_imaginary).to eq([])
|
64
|
+
expect(subject.destination_no_data_real).to eq([])
|
65
|
+
expect(subject.destination_no_data_imaginary).to eq([])
|
66
|
+
|
67
|
+
expect(subject.progress).to_not be_null
|
68
|
+
expect(subject.progress_arg).to be_null
|
69
|
+
|
70
|
+
expect(subject.transformer).to be_null
|
71
|
+
expect(subject.transformer_arg).to be_null
|
72
|
+
|
73
|
+
expect(subject.source_per_band_validity_mask_function).to be_null
|
74
|
+
expect(subject.source_per_band_validity_mask_function_arg).to be_null
|
75
|
+
|
76
|
+
expect(subject.source_validity_mask_function).to be_null
|
77
|
+
expect(subject.source_validity_mask_function_arg).to be_null
|
78
|
+
|
79
|
+
expect(subject.source_density_mask_function).to be_null
|
80
|
+
expect(subject.source_density_mask_function_arg).to be_null
|
81
|
+
|
82
|
+
expect(subject.destination_density_mask_function).to be_null
|
83
|
+
expect(subject.destination_density_mask_function_arg).to be_null
|
84
|
+
|
85
|
+
expect(subject.destination_validity_mask_function).to be_null
|
86
|
+
expect(subject.destination_validity_mask_function_arg).to be_null
|
87
|
+
|
88
|
+
expect(subject.pre_warp_chunk_processor).to be_null
|
89
|
+
expect(subject.pre_warp_processor_arg).to be_null
|
90
|
+
expect(subject.post_warp_chunk_processor).to be_null
|
91
|
+
expect(subject.post_warp_processor_arg).to be_null
|
92
|
+
|
93
|
+
expect(subject.cutline).to be_nil
|
94
|
+
expect(subject.cutline_blend_distance).to eq(0.0)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context 'passing in options that are also accessor methods' do
|
99
|
+
let(:warp_operation_options) do
|
100
|
+
{
|
101
|
+
init_dest: 'NODATA',
|
102
|
+
write_flush: 'YES',
|
103
|
+
skip_nosource: 'NO',
|
104
|
+
sample_grid: 'YES'
|
105
|
+
}
|
106
|
+
end
|
107
|
+
|
108
|
+
let(:memory_driver) { GDAL::Driver.by_name('MEM') }
|
109
|
+
let(:source_dataset) { memory_driver.create_dataset 'source', 10, 20 }
|
110
|
+
let(:dest_dataset) { memory_driver.create_dataset 'dest', 20, 30 }
|
111
|
+
let(:cutline) { OGR::LineString.new }
|
112
|
+
let(:spb_validity_mask_function1) { proc { true } }
|
113
|
+
let(:spb_validity_mask_function2) { proc { false } }
|
114
|
+
|
115
|
+
after do
|
116
|
+
source_dataset.close
|
117
|
+
dest_dataset.close
|
118
|
+
end
|
119
|
+
|
120
|
+
subject do
|
121
|
+
described_class.new warp_operation_options: warp_operation_options,
|
122
|
+
source_dataset: source_dataset,
|
123
|
+
destination_dataset: dest_dataset,
|
124
|
+
source_bands: [1, 2, 3],
|
125
|
+
destination_bands: [2, 4, 6],
|
126
|
+
cutline: cutline,
|
127
|
+
source_no_data_real: [123.456, 78.9, -999.9],
|
128
|
+
source_no_data_imaginary: [1.2, 3.4, -5.6],
|
129
|
+
destination_no_data_real: [11.1, 22.2, 33.3],
|
130
|
+
destination_no_data_imaginary: [-44.4, -55.5, -66.6],
|
131
|
+
source_per_band_validity_mask_function: [
|
132
|
+
spb_validity_mask_function1,
|
133
|
+
spb_validity_mask_function2
|
134
|
+
]
|
135
|
+
end
|
136
|
+
|
137
|
+
it_behaves_like 'a WarpOptions object'
|
138
|
+
|
139
|
+
it 'sets warp_operation_options' do
|
140
|
+
expect(subject.warp_operation_options).to eq(warp_operation_options)
|
141
|
+
end
|
142
|
+
|
143
|
+
it' sets source_dataset and the internal pointer' do
|
144
|
+
expect(subject.source_dataset).to eq(source_dataset)
|
145
|
+
expect(subject.c_struct[:source_dataset]).to eq(source_dataset.c_pointer)
|
146
|
+
end
|
147
|
+
|
148
|
+
it' sets destination_dataset' do
|
149
|
+
expect(subject.destination_dataset).to eq(dest_dataset)
|
150
|
+
expect(subject.c_struct[:destination_dataset]).to eq(dest_dataset.c_pointer)
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'sets source_bands' do
|
154
|
+
expect(subject.source_bands).to eq([1, 2, 3])
|
155
|
+
end
|
156
|
+
|
157
|
+
it 'sets destination_bands' do
|
158
|
+
expect(subject.destination_bands).to eq([2, 4, 6])
|
159
|
+
end
|
160
|
+
|
161
|
+
it 'sets band_count and the internal to 3' do
|
162
|
+
expect(subject.band_count).to eq 3
|
163
|
+
expect(subject.c_struct[:band_count]).to eq 3
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'sets cutline and its internal pointer' do
|
167
|
+
expect(subject.cutline).to eq(cutline)
|
168
|
+
expect(subject.c_struct[:cutline]).to eq(cutline.c_pointer)
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'sets source_no_data_real' do
|
172
|
+
expect(subject.source_no_data_real).to eq([123.456, 78.9, -999.9])
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'sets source_no_data_imaginary' do
|
176
|
+
expect(subject.source_no_data_imaginary).to eq([1.2, 3.4, -5.6])
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'sets destination_no_data_real' do
|
180
|
+
expect(subject.destination_no_data_real).to eq([11.1, 22.2, 33.3])
|
181
|
+
end
|
182
|
+
|
183
|
+
it 'sets destination_no_data_imaginary' do
|
184
|
+
expect(subject.destination_no_data_imaginary).to eq([-44.4, -55.5, -66.6])
|
185
|
+
end
|
186
|
+
|
187
|
+
it 'sets source_per_band_validity_mask_function' do
|
188
|
+
function_ptr = subject.source_per_band_validity_mask_function
|
189
|
+
expect(function_ptr).to be_a(FFI::Pointer)
|
190
|
+
|
191
|
+
function = function_ptr.read_pointer
|
192
|
+
expect(function).to_not be_null
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
context 'passing in options that are NOT accessor methods' do
|
197
|
+
def make_int_pointer(int)
|
198
|
+
i = FFI::MemoryPointer.new(:int)
|
199
|
+
i.write_int(int)
|
200
|
+
i
|
201
|
+
end
|
202
|
+
|
203
|
+
let(:progress) { proc { true } }
|
204
|
+
let(:test_mask_function) { proc { true } }
|
205
|
+
|
206
|
+
let(:source_per_band_validity_mask_function_arg) { make_int_pointer(5) }
|
207
|
+
let(:source_validity_mask_function_arg) { make_int_pointer(3) }
|
208
|
+
let(:source_density_mask_function_arg) { make_int_pointer(2) }
|
209
|
+
let(:destination_validity_mask_function_arg) { make_int_pointer(4) }
|
210
|
+
let(:destination_density_mask_function_arg) { make_int_pointer(11) }
|
211
|
+
let(:pre_warp_processor_arg) { make_int_pointer(7) }
|
212
|
+
let(:post_warp_processor_arg) { make_int_pointer(9) }
|
213
|
+
|
214
|
+
subject do
|
215
|
+
described_class.new warp_memory_limit: 123,
|
216
|
+
resample_alg: :GRA_Lanczos,
|
217
|
+
working_data_type: :GDT_CInt32,
|
218
|
+
band_count: 3,
|
219
|
+
source_alpha_band: 1,
|
220
|
+
destination_alpha_band: 5,
|
221
|
+
progress: progress,
|
222
|
+
progress_arg: FFI::CPL::Progress::ScaledProgress,
|
223
|
+
source_per_band_validity_mask_function_arg: source_per_band_validity_mask_function_arg,
|
224
|
+
source_validity_mask_function: test_mask_function,
|
225
|
+
source_validity_mask_function_arg: source_validity_mask_function_arg,
|
226
|
+
source_density_mask_function: test_mask_function,
|
227
|
+
source_density_mask_function_arg: source_density_mask_function_arg,
|
228
|
+
destination_validity_mask_function: test_mask_function,
|
229
|
+
destination_validity_mask_function_arg: destination_validity_mask_function_arg,
|
230
|
+
destination_density_mask_function: test_mask_function,
|
231
|
+
destination_density_mask_function_arg: destination_density_mask_function_arg,
|
232
|
+
pre_warp_chunk_processor: proc { :CE_Warning },
|
233
|
+
pre_warp_processor_arg: pre_warp_processor_arg,
|
234
|
+
post_warp_chunk_processor: proc { :CE_Failure },
|
235
|
+
post_warp_processor_arg: post_warp_processor_arg,
|
236
|
+
cutline_blend_distance: 3.3
|
237
|
+
end
|
238
|
+
|
239
|
+
it_behaves_like 'a WarpOptions object'
|
240
|
+
|
241
|
+
it 'sets warp_memory_limit' do
|
242
|
+
expect(subject.warp_memory_limit).to eq(123)
|
243
|
+
end
|
244
|
+
|
245
|
+
it 'sets resample_alg' do
|
246
|
+
expect(subject.resample_alg).to eq(:GRA_Lanczos)
|
247
|
+
end
|
248
|
+
|
249
|
+
it 'sets working_data_type' do
|
250
|
+
expect(subject.working_data_type).to eq(:GDT_CInt32)
|
251
|
+
end
|
252
|
+
|
253
|
+
it 'sets band_count' do
|
254
|
+
expect(subject.band_count).to eq(3)
|
255
|
+
end
|
256
|
+
|
257
|
+
it 'sets source_alpha_band' do
|
258
|
+
expect(subject.source_alpha_band).to eq(1)
|
259
|
+
end
|
260
|
+
|
261
|
+
it 'sets destination_alpha_band' do
|
262
|
+
expect(subject.destination_alpha_band).to eq(5)
|
263
|
+
end
|
264
|
+
|
265
|
+
it 'sets progress_arg' do
|
266
|
+
expect(subject.progress_arg).to eq(FFI::CPL::Progress::ScaledProgress)
|
267
|
+
end
|
268
|
+
|
269
|
+
it 'sets source_per_band_validity_mask_function_arg' do
|
270
|
+
pointer = subject.source_per_band_validity_mask_function_arg
|
271
|
+
pointer.autorelease = false
|
272
|
+
expect(pointer.read_int).to eq 5
|
273
|
+
end
|
274
|
+
|
275
|
+
it 'sets source_validity_mask_function' do
|
276
|
+
expect(subject.source_validity_mask_function).to_not be_null
|
277
|
+
end
|
278
|
+
|
279
|
+
it 'sets source_validity_mask_function_arg' do
|
280
|
+
pointer = subject.source_validity_mask_function_arg
|
281
|
+
pointer.autorelease = false
|
282
|
+
expect(pointer.read_int).to eq 3
|
283
|
+
end
|
284
|
+
|
285
|
+
it 'sets source_density_mask_function' do
|
286
|
+
expect(subject.source_density_mask_function).to_not be_null
|
287
|
+
end
|
288
|
+
|
289
|
+
it 'sets source_density_mask_function_arg' do
|
290
|
+
pointer = subject.source_density_mask_function_arg
|
291
|
+
pointer.autorelease = false
|
292
|
+
expect(pointer.read_int).to eq 2
|
293
|
+
end
|
294
|
+
|
295
|
+
it 'sets destination_validity_mask_function' do
|
296
|
+
expect(subject.destination_validity_mask_function).to_not be_null
|
297
|
+
end
|
298
|
+
|
299
|
+
it 'sets destination_validity_mask_function_arg' do
|
300
|
+
pointer = subject.destination_validity_mask_function_arg
|
301
|
+
pointer.autorelease = false
|
302
|
+
expect(pointer.read_int).to eq 4
|
303
|
+
end
|
304
|
+
|
305
|
+
it 'sets destination_density_mask_function' do
|
306
|
+
expect(subject.destination_density_mask_function).to_not be_null
|
307
|
+
end
|
308
|
+
|
309
|
+
it 'sets destination_density_mask_function_arg' do
|
310
|
+
pointer = subject.destination_density_mask_function_arg
|
311
|
+
pointer.autorelease = false
|
312
|
+
expect(pointer.read_int).to eq 11
|
313
|
+
end
|
314
|
+
|
315
|
+
it 'sets pre_warp_chunk_processor' do
|
316
|
+
expect(subject.pre_warp_chunk_processor.call(nil, nil)).to eq(:CE_Warning)
|
317
|
+
end
|
318
|
+
|
319
|
+
it 'sets pre_warp_chunk_processor_arg' do
|
320
|
+
expect(subject.pre_warp_processor_arg).to_not be_null
|
321
|
+
end
|
322
|
+
|
323
|
+
it 'sets post_warp_chunk_processor' do
|
324
|
+
expect(subject.post_warp_chunk_processor.call(nil, nil)).to eq(:CE_Failure)
|
325
|
+
end
|
326
|
+
|
327
|
+
it 'sets post_warp_chunk_processor_arg' do
|
328
|
+
expect(subject.post_warp_processor_arg).to_not be_null
|
329
|
+
end
|
330
|
+
|
331
|
+
it 'sets cutline_blend_distance' do
|
332
|
+
expect(subject.cutline_blend_distance).to eq(3.3)
|
333
|
+
end
|
334
|
+
end
|
335
|
+
end
|
336
|
+
end
|
@@ -291,23 +291,4 @@ RSpec.describe OGR::FeatureDefinition do
|
|
291
291
|
end
|
292
292
|
end
|
293
293
|
end
|
294
|
-
|
295
|
-
describe '#as_json' do
|
296
|
-
it 'returns a Hash of all attributes and values' do
|
297
|
-
expect(subject.as_json).to eq(field_count: 0,
|
298
|
-
field_definitions: [],
|
299
|
-
geometry_field_count: 1,
|
300
|
-
geometry_type: :wkbMultiPolygon,
|
301
|
-
is_geometry_ignored: false,
|
302
|
-
is_style_ignored: false,
|
303
|
-
name: 'spec feature definition')
|
304
|
-
end
|
305
|
-
end
|
306
|
-
|
307
|
-
describe '#to_json' do
|
308
|
-
it 'is a String' do
|
309
|
-
expect(subject.to_json).to be_a String
|
310
|
-
expect(subject.to_json).to_not be_empty
|
311
|
-
end
|
312
|
-
end
|
313
294
|
end
|
@@ -6,7 +6,7 @@ RSpec.describe OGR::Feature do
|
|
6
6
|
|
7
7
|
let(:feature_definition) do
|
8
8
|
fd = OGR::FeatureDefinition.new('test FD')
|
9
|
-
fd.add_field_definition(integer_field_def)
|
9
|
+
fd.add_field_definition(integer_field_def) # 0
|
10
10
|
|
11
11
|
gfd = fd.geometry_field_definition(0)
|
12
12
|
gfd.type = :wkbPoint
|
@@ -113,23 +113,4 @@ RSpec.describe OGR::FieldDefinition do
|
|
113
113
|
expect(subject).to be_ignored
|
114
114
|
end
|
115
115
|
end
|
116
|
-
|
117
|
-
describe '#as_json' do
|
118
|
-
it 'returns a Hash of attributes' do
|
119
|
-
expect(subject.as_json).to eq(
|
120
|
-
is_ignored: false,
|
121
|
-
justification: :OJUndefined,
|
122
|
-
name: 'test field',
|
123
|
-
precision: 0,
|
124
|
-
type: :OFTInteger,
|
125
|
-
width: 0
|
126
|
-
)
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
describe '#to_json' do
|
131
|
-
it 'returns a string' do
|
132
|
-
expect(subject.to_json).to be_a String
|
133
|
-
end
|
134
|
-
end
|
135
116
|
end
|
@@ -68,20 +68,4 @@ RSpec.describe OGR::GeometryFieldDefinition do
|
|
68
68
|
end
|
69
69
|
end
|
70
70
|
end
|
71
|
-
|
72
|
-
describe '#as_json' do
|
73
|
-
it 'returns a Hash of attributes' do
|
74
|
-
expect(subject.as_json). to eq(
|
75
|
-
is_ignored: false,
|
76
|
-
name: 'test gfld',
|
77
|
-
spatial_reference: nil,
|
78
|
-
type: :wkbUnknown
|
79
|
-
)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
describe '#to_json' do
|
84
|
-
subject { geometry_field_definition.to_json }
|
85
|
-
it { is_expected.to be_a String }
|
86
|
-
end
|
87
71
|
end
|
@@ -103,30 +103,4 @@ RSpec.describe OGR::StyleTable do
|
|
103
103
|
expect(subject.styles).to eq('style1' => '12345', 'style2' => '67890')
|
104
104
|
end
|
105
105
|
end
|
106
|
-
|
107
|
-
describe '#as_json' do
|
108
|
-
subject do
|
109
|
-
st = described_class.new
|
110
|
-
st.add_style('style1', '12345')
|
111
|
-
st.add_style('style2', '67890')
|
112
|
-
st
|
113
|
-
end
|
114
|
-
|
115
|
-
it 'returns the styles as a Hash' do
|
116
|
-
expect(subject.as_json).to eq('style1' => '12345', 'style2' => '67890')
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
describe '#to_json' do
|
121
|
-
subject do
|
122
|
-
st = described_class.new
|
123
|
-
st.add_style('style1', '12345')
|
124
|
-
st.add_style('style2', '67890')
|
125
|
-
st
|
126
|
-
end
|
127
|
-
|
128
|
-
it 'returns the styles' do
|
129
|
-
expect(subject.to_json).to eq('{"style1":"12345","style2":"67890"}')
|
130
|
-
end
|
131
|
-
end
|
132
106
|
end
|