ffi-gdal 1.0.0.beta1 → 1.0.0.beta3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +32 -0
- data/LICENSE.txt +1 -1
- data/TODO.md +0 -2
- data/examples/extract_and_colorize.rb +81 -0
- data/{testing_ogr.rb → examples/geometries.rb} +4 -16
- data/{testing_layer_to_layer.rb → examples/ogr_layer_to_layer.rb} +1 -1
- data/examples/testing_gdal.rb +46 -0
- data/lib/ext/error_symbols.rb +1 -0
- data/lib/ffi/cpl/conv_h.rb +15 -15
- data/lib/ffi/cpl/error_h.rb +13 -13
- data/lib/ffi/cpl/string_h.rb +10 -10
- data/lib/ffi/cpl/vsi_h.rb +23 -23
- data/lib/ffi/gdal.rb +1 -1
- data/lib/ffi/gdal/grid_h.rb +3 -3
- data/lib/ffi/gdal/version.rb +1 -1
- data/lib/ffi/ogr/api_h.rb +3 -3
- data/lib/gdal/dataset.rb +5 -4
- data/lib/gdal/dataset_extensions.rb +2 -2
- data/lib/gdal/raster_band.rb +1 -0
- data/lib/gdal/raster_band_extensions.rb +5 -5
- data/lib/ogr/geometry.rb +1 -0
- data/spec/unit/gdal/color_table_extensions_spec.rb +60 -0
- data/spec/unit/gdal/data_type_spec.rb +79 -0
- data/spec/unit/gdal/dataset_spec.rb +98 -0
- metadata +12 -11
- data/linkies.rb +0 -35
- data/readie.rb +0 -90
- data/testing_gdal.rb +0 -168
- data/testing_gdalwarp.rb +0 -91
- data/testing_ndvi.rb +0 -76
- data/testing_nir.rb +0 -77
- data/things.rb +0 -84
data/lib/ffi/gdal.rb
CHANGED
@@ -8,7 +8,7 @@ module FFI
|
|
8
8
|
old_attach_function(*args)
|
9
9
|
rescue FFI::NotFoundError
|
10
10
|
@unsupported_gdal_functions ||= []
|
11
|
-
warn "
|
11
|
+
warn "ffi-gdal warning: function '#{args.first}' is not available in this build of GDAL/OGR (v#{FFI::GDAL.GDALVersionInfo('RELEASE_NAME')})"
|
12
12
|
@unsupported_gdal_functions << args.first
|
13
13
|
end
|
14
14
|
|
data/lib/ffi/gdal/grid_h.rb
CHANGED
@@ -14,9 +14,9 @@ module FFI
|
|
14
14
|
attach_function :GDALGridInverseDistanceToAPower,
|
15
15
|
%i[pointer GUInt32 pointer pointer pointer double double pointer pointer],
|
16
16
|
CPLErr
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
attach_function :GDALGridInverseDistanceToAPointerNoSearch,
|
18
|
+
%i[pointer GUInt32 pointer pointer pointer double double pointer pointer],
|
19
|
+
CPLErr
|
20
20
|
|
21
21
|
attach_function :GDALGridMovingAverage,
|
22
22
|
%i[pointer GUInt32 pointer pointer pointer double double pointer pointer],
|
data/lib/ffi/gdal/version.rb
CHANGED
data/lib/ffi/ogr/api_h.rb
CHANGED
@@ -267,9 +267,9 @@ module FFI
|
|
267
267
|
attach_function :OGR_FD_DeleteFieldDefn,
|
268
268
|
%i[OGRFeatureDefnH int],
|
269
269
|
OGRErr
|
270
|
-
|
271
|
-
|
272
|
-
|
270
|
+
attach_function :OGR_FD_ReorderFieldDefns,
|
271
|
+
%i[OGRFeatureDefnH pointer],
|
272
|
+
OGRErr
|
273
273
|
attach_function :OGR_FD_GetGeomType, %i[OGRFeatureDefnH], OGRwkbGeometryType
|
274
274
|
attach_function :OGR_FD_SetGeomType,
|
275
275
|
[:OGRFeatureDefnH, OGRwkbGeometryType],
|
data/lib/gdal/dataset.rb
CHANGED
@@ -71,7 +71,7 @@ module GDAL
|
|
71
71
|
|
72
72
|
flag = FFI::GDAL.GDALGetAccess(@dataset_pointer)
|
73
73
|
|
74
|
-
FFI::GDAL
|
74
|
+
FFI::GDAL::GDALAccess[flag]
|
75
75
|
end
|
76
76
|
|
77
77
|
# @return [GDAL::Driver] The driver to be used for working with this
|
@@ -148,11 +148,12 @@ module GDAL
|
|
148
148
|
raster_band(raster_count)
|
149
149
|
end
|
150
150
|
|
151
|
-
# Adds a mask band to the dataset
|
151
|
+
# Adds a mask band to the dataset.
|
152
152
|
#
|
153
|
+
# @param flags [Fixnum] Any of of the GDAL::RasterBand flags.
|
153
154
|
# @return [Boolean]
|
154
|
-
def create_mask_band
|
155
|
-
cpl_err = FFI::GDAL.GDALCreateDatasetMaskBand(@dataset_pointer,
|
155
|
+
def create_mask_band(flags)
|
156
|
+
cpl_err = FFI::GDAL.GDALCreateDatasetMaskBand(@dataset_pointer, flags)
|
156
157
|
|
157
158
|
cpl_err.to_bool
|
158
159
|
end
|
@@ -472,13 +472,13 @@ module GDAL
|
|
472
472
|
# @param ndvi [NArray]
|
473
473
|
# @return [NArray]
|
474
474
|
def calculate_ndvi_byte(ndvi)
|
475
|
-
(ndvi + 1) * (
|
475
|
+
(ndvi + 1) * (255.0 / 2)
|
476
476
|
end
|
477
477
|
|
478
478
|
# @param ndvi [NArray]
|
479
479
|
# @return [NArray]
|
480
480
|
def calculate_ndvi_uint16(ndvi)
|
481
|
-
(ndvi + 1) * (
|
481
|
+
(ndvi + 1) * (65535.0 / 2)
|
482
482
|
end
|
483
483
|
|
484
484
|
# Sets any negative values in the NArray to 0.
|
data/lib/gdal/raster_band.rb
CHANGED
@@ -85,6 +85,7 @@ module GDAL
|
|
85
85
|
FFI::GDAL.GDALGetRasterColorInterpretation(@raster_band_pointer)
|
86
86
|
end
|
87
87
|
|
88
|
+
# @param new_color_interp [FFI::GDAL::GDALColorInterp]
|
88
89
|
# @return [Boolean]
|
89
90
|
def color_interpretation=(new_color_interp)
|
90
91
|
cpl_err = FFI::GDAL.GDALSetRasterColorInterpretation(@raster_band_pointer,
|
@@ -110,17 +110,17 @@ module GDAL
|
|
110
110
|
raise "Can't colorize a #{data_type} band--must be :GDT_Byte or :GDT_UInt16"
|
111
111
|
end
|
112
112
|
|
113
|
-
self.color_interpretation
|
113
|
+
self.color_interpretation ||= :GCI_PaletteIndex
|
114
114
|
table.add_color_entry(0, 0, 0, 0, 255)
|
115
|
-
bin_count =
|
115
|
+
bin_count = color_entry_index_count / colors.size.to_f
|
116
116
|
|
117
117
|
1.upto(color_entry_index_count - 1) do |color_entry_index|
|
118
|
-
color_number = (color_entry_index / bin_count
|
118
|
+
color_number = (color_entry_index / bin_count).to_i
|
119
119
|
|
120
120
|
color = colors[color_number]
|
121
|
-
|
121
|
+
rgb_array = hex_to_rgb(color) unless color.is_a?(Array)
|
122
122
|
table.add_color_entry(color_entry_index,
|
123
|
-
|
123
|
+
rgb_array[0], rgb_array[1], rgb_array[2], 255)
|
124
124
|
end
|
125
125
|
|
126
126
|
self.color_table = table
|
data/lib/ogr/geometry.rb
CHANGED
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe GDAL::ColorTable do
|
5
|
+
subject do
|
6
|
+
described_class.create(:GPI_RGB)
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '#color_entries_for' do
|
10
|
+
context 'no colors' do
|
11
|
+
it 'returns an empty array' do
|
12
|
+
expect(subject.color_entries_for(1)).to be_empty
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'colors' do
|
17
|
+
it 'returns all of the color values ColorEntrys for the color number' do
|
18
|
+
subject.add_color_entry(0, 1, 2, 3, 4)
|
19
|
+
subject.add_color_entry(1, 10, 20, 30, 40)
|
20
|
+
expect(subject.color_entries_for(1)).to eq([1, 10])
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#color_entries' do
|
26
|
+
context 'no colors' do
|
27
|
+
it 'returns an empty array' do
|
28
|
+
expect(subject.color_entries).to be_empty
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'colors' do
|
33
|
+
it 'returns an array of the ColorEntrys' do
|
34
|
+
subject.add_color_entry(0, 1, 2, 3, 4)
|
35
|
+
subject.add_color_entry(1, 10, 20, 30, 40)
|
36
|
+
|
37
|
+
expect(subject.color_entries.size).to eq 2
|
38
|
+
expect(subject.color_entries.first).to be_a GDAL::ColorEntry
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe '#color_entries_as_rgb' do
|
44
|
+
context 'no colors' do
|
45
|
+
it 'returns an empty array' do
|
46
|
+
expect(subject.color_entries_as_rgb).to be_empty
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'colors' do
|
51
|
+
it 'returns an array of the ColorEntrys' do
|
52
|
+
subject.add_color_entry(0, 1, 2, 3, 4)
|
53
|
+
subject.add_color_entry(1, 10, 20, 30, 40)
|
54
|
+
|
55
|
+
expect(subject.color_entries_as_rgb.size).to eq 2
|
56
|
+
expect(subject.color_entries_as_rgb.first).to be_a GDAL::ColorEntry
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GDAL::DataType do
|
4
|
+
describe '.size' do
|
5
|
+
context 'with valid data type' do
|
6
|
+
it 'returns the size' do
|
7
|
+
expect(described_class.size(:GDT_Byte)).to eq 8
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
context 'with invalid data type' do
|
12
|
+
it 'raises an ArgumentError' do
|
13
|
+
expect {
|
14
|
+
described_class.size(:Bob)
|
15
|
+
}.to raise_exception(ArgumentError)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '.complex?' do
|
21
|
+
context 'with valid, complex data type' do
|
22
|
+
it 'returns true' do
|
23
|
+
expect(described_class.complex?(:GDT_CFloat64)).to eq true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'with valid, simple data type' do
|
28
|
+
it 'returns true' do
|
29
|
+
expect(described_class.complex?(:GDT_Float64)).to eq false
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'with invalid data type' do
|
34
|
+
it 'raises an ArgumentError' do
|
35
|
+
expect {
|
36
|
+
described_class.complex?(:Bob)
|
37
|
+
}.to raise_exception(ArgumentError)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '.name' do
|
43
|
+
context 'with valid data type' do
|
44
|
+
it 'returns the name' do
|
45
|
+
expect(described_class.name(:GDT_Byte)).to eq 'Byte'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context 'with invalid data type' do
|
50
|
+
it 'raises an ArgumentError' do
|
51
|
+
skip 'Figure out why this causes a segfault'
|
52
|
+
|
53
|
+
expect {
|
54
|
+
described_class.name(:Bob)
|
55
|
+
}.to raise_exception(ArgumentError)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe '.by_name' do
|
61
|
+
context 'with valid data type name' do
|
62
|
+
it 'returns the data type' do
|
63
|
+
skip 'Figure out why this causes a segfault'
|
64
|
+
|
65
|
+
expect(described_class.by_name('Byte')).to eq :GDT_Byte
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'with invalid data type name' do
|
70
|
+
it 'raises an ArgumentError' do
|
71
|
+
skip 'Figure out why this causes a segfault'
|
72
|
+
|
73
|
+
expect {
|
74
|
+
described_class.by_name('Bob')
|
75
|
+
}.to raise_exception(ArgumentError)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GDAL::Dataset do
|
4
|
+
let(:file_path) do
|
5
|
+
File.expand_path('../../support/images/osgeo/geotiff/GeogToWGS84GeoKey/GeogToWGS84GeoKey5.tif', __dir__)
|
6
|
+
end
|
7
|
+
|
8
|
+
subject do
|
9
|
+
described_class.open(file_path, 'r')
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '#access_flag' do
|
13
|
+
it 'returns the flag that was used to open the dataset' do
|
14
|
+
expect(subject.access_flag).to eq :GA_ReadOnly
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#driver' do
|
19
|
+
it 'returns the driver that was used to open the dataset' do
|
20
|
+
expect(subject.driver).to be_a GDAL::Driver
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#file_list' do
|
25
|
+
it 'returns an array that includes the file that represents the dataset' do
|
26
|
+
expect(subject.file_list).to be_an Array
|
27
|
+
expect(subject.file_list).to include(file_path)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#flush_cache' do
|
32
|
+
it 'returns nil' do
|
33
|
+
expect(subject.flush_cache).to be_nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#raster_x_size' do
|
38
|
+
it 'returns a Fixnum' do
|
39
|
+
expect(subject.raster_x_size).to eq 101
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe '#raster_y_size' do
|
44
|
+
it 'returns a Fixnum' do
|
45
|
+
expect(subject.raster_y_size).to eq 101
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '#raster_count' do
|
50
|
+
it 'returns a Fixnum' do
|
51
|
+
expect(subject.raster_count).to eq 1
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe '#raster_band' do
|
56
|
+
it 'returns a GDAL::RasterBand' do
|
57
|
+
expect(subject.raster_band(1)).to be_a GDAL::RasterBand
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe '#add_band' do
|
62
|
+
it 'raises a GDAL::CPLErrFailure' do
|
63
|
+
skip 'Figure out why this causes a segfault'
|
64
|
+
|
65
|
+
expect {
|
66
|
+
subject.add_band(:GDT_Byte)
|
67
|
+
}.to raise_exception(GDAL::CPLErrFailure)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe '#create_mask_band' do
|
72
|
+
context 'no flags given' do
|
73
|
+
it 'returns true' do
|
74
|
+
expect(subject.create_mask_band(0)).to eq true
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe '#projection' do
|
80
|
+
it 'returns the projection string' do
|
81
|
+
expect(subject.projection).to eq %(GEOGCS[\"unknown\",DATUM[\"unknown\",SPHEROID[\"Bessel 1841\",6377397.155,299.1528128000008,AUTHORITY[\"EPSG\",\"7004\"]],TOWGS84[598.1,73.7,418.2,0.202,0.045,-2.455,6.7]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]])
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe '#projection=' do
|
86
|
+
it 'returns the new projection' do
|
87
|
+
proj = subject.projection
|
88
|
+
expect(subject.projection = proj).to eq proj
|
89
|
+
expect(subject.projection).to eq proj
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe '#geo_transform' do
|
94
|
+
it 'returns a GDAL::GeoTransform' do
|
95
|
+
expect(subject.geo_transform).to be_a GDAL::GeoTransform
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ffi-gdal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.beta3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steve Loveless
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|
@@ -137,6 +137,10 @@ files:
|
|
137
137
|
- README.md
|
138
138
|
- Rakefile
|
139
139
|
- TODO.md
|
140
|
+
- examples/extract_and_colorize.rb
|
141
|
+
- examples/geometries.rb
|
142
|
+
- examples/ogr_layer_to_layer.rb
|
143
|
+
- examples/testing_gdal.rb
|
140
144
|
- ffi-gdal.gemspec
|
141
145
|
- lib/ext/error_symbols.rb
|
142
146
|
- lib/ext/float_ext.rb
|
@@ -235,8 +239,6 @@ files:
|
|
235
239
|
- lib/ogr/spatial_reference_extensions.rb
|
236
240
|
- lib/ogr/style_table.rb
|
237
241
|
- lib/ogr/style_table_extensions.rb
|
238
|
-
- linkies.rb
|
239
|
-
- readie.rb
|
240
242
|
- spec/ffi-gdal_spec.rb
|
241
243
|
- spec/integration/color_table_info_spec.rb
|
242
244
|
- spec/integration/dataset_info_spec.rb
|
@@ -259,18 +261,14 @@ files:
|
|
259
261
|
- spec/support/worldfiles/SR_50M/SR_50M.tfw
|
260
262
|
- spec/support/worldfiles/SR_50M/SR_50M.tif
|
261
263
|
- spec/unit/ext/error_symbols_spec.rb
|
264
|
+
- spec/unit/gdal/color_table_extensions_spec.rb
|
262
265
|
- spec/unit/gdal/color_table_spec.rb
|
266
|
+
- spec/unit/gdal/data_type_spec.rb
|
267
|
+
- spec/unit/gdal/dataset_spec.rb
|
263
268
|
- spec/unit/ogr/layer_spec.rb
|
264
269
|
- spec/unit/ogr/linear_ring_spec.rb
|
265
270
|
- spec/unit/ogr/point_spec.rb
|
266
271
|
- spec/unit/version_info_spec.rb
|
267
|
-
- testing_gdal.rb
|
268
|
-
- testing_gdalwarp.rb
|
269
|
-
- testing_layer_to_layer.rb
|
270
|
-
- testing_ndvi.rb
|
271
|
-
- testing_nir.rb
|
272
|
-
- testing_ogr.rb
|
273
|
-
- things.rb
|
274
272
|
homepage: https://github.com/turboladen/ffi-gdal
|
275
273
|
licenses:
|
276
274
|
- MIT
|
@@ -318,7 +316,10 @@ test_files:
|
|
318
316
|
- spec/support/worldfiles/SR_50M/SR_50M.tfw
|
319
317
|
- spec/support/worldfiles/SR_50M/SR_50M.tif
|
320
318
|
- spec/unit/ext/error_symbols_spec.rb
|
319
|
+
- spec/unit/gdal/color_table_extensions_spec.rb
|
321
320
|
- spec/unit/gdal/color_table_spec.rb
|
321
|
+
- spec/unit/gdal/data_type_spec.rb
|
322
|
+
- spec/unit/gdal/dataset_spec.rb
|
322
323
|
- spec/unit/ogr/layer_spec.rb
|
323
324
|
- spec/unit/ogr/linear_ring_spec.rb
|
324
325
|
- spec/unit/ogr/point_spec.rb
|
data/linkies.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'nokogiri'
|
2
|
-
require 'open-uri'
|
3
|
-
|
4
|
-
abort("Usage: extract_links URL DEST_DIR") if ARGV.size != 2
|
5
|
-
|
6
|
-
args = ARGV.dup
|
7
|
-
url = args[0]
|
8
|
-
dest_dir = args[1]
|
9
|
-
|
10
|
-
doc = Nokogiri::HTML(open(url))
|
11
|
-
|
12
|
-
hrefs = doc.css("a").map do |link|
|
13
|
-
if (href = link.attr("href")) && !href.empty?
|
14
|
-
URI::join(url, href)
|
15
|
-
end
|
16
|
-
end.compact.uniq
|
17
|
-
|
18
|
-
Dir.mkdir(dest_dir) unless File.exist?(dest_dir)
|
19
|
-
Dir.chdir(dest_dir)
|
20
|
-
|
21
|
-
hrefs.each_with_index do |href, i|
|
22
|
-
filename = href.path.split('/').last
|
23
|
-
print "Downloading (#{i + 1}/#{hrefs.size}) #{filename}...\r"
|
24
|
-
|
25
|
-
begin
|
26
|
-
File.write(filename, open(href).read)
|
27
|
-
rescue OpenURI::HTTPError => ex
|
28
|
-
puts "Sonofa!"
|
29
|
-
raise
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
puts "\nAll done!"
|
34
|
-
|
35
|
-
# puts(hrefs.join("\n"))
|