gdal-helper 0.0.1.1 → 0.0.1.2
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.
- data/examples/basic_example_using_each_line.rb +31 -0
- data/examples/basic_example_using_each_line_with_index.rb +30 -0
- data/examples/ndvi_color.rb +108 -0
- data/lib/gdal_helper.rb +23 -13
- data/lib/version.rb +2 -2
- metadata +6 -3
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
require "rubygems"
|
|
3
|
+
require "pp"
|
|
4
|
+
require "gdal_helper"
|
|
5
|
+
|
|
6
|
+
#basic plan - open image,dim image by 25%, set the projection and geo_trans, then quit, job done.
|
|
7
|
+
# Open a tiff to write to, with default create options (TILED=YES, COMPRESS=LZW) to write to..
|
|
8
|
+
if (ARGV.length != 2)
|
|
9
|
+
puts("Usage: ./basic_example_using_each_line.rb (infile) (outfile)")
|
|
10
|
+
return -1
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
infile = GdalFile.new(ARGV[0])
|
|
14
|
+
outfile = GdalFile.new(ARGV[1], "w", infile.xsize,infile.ysize,infile.number_of_bands,"GTiff", infile.data_type, ["COMPRESS=DEFLATE", "TILED=YES"])
|
|
15
|
+
y = 0
|
|
16
|
+
infile.each_line do |data|
|
|
17
|
+
data.each do |band|
|
|
18
|
+
band.each_index do |x_index|
|
|
19
|
+
band[x_index] = band[x_index] - band[x_index]/4
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
outfile.write_bands(0,y,infile.xsize,1,data)
|
|
23
|
+
y += 1
|
|
24
|
+
end
|
|
25
|
+
# Set the projection
|
|
26
|
+
outfile.set_projection(infile.get_projection)
|
|
27
|
+
# set the geo transform (world file)
|
|
28
|
+
outfile.set_geo_transform(infile.get_geo_transform)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
require "rubygems"
|
|
3
|
+
require "pp"
|
|
4
|
+
require "gdal_helper"
|
|
5
|
+
|
|
6
|
+
#basic plan - open image,dim image by 25%, set the projection and geo_trans, then quit, job done.
|
|
7
|
+
# Open a tiff to write to, with default create options (TILED=YES, COMPRESS=LZW) to write to..
|
|
8
|
+
if (ARGV.length != 2)
|
|
9
|
+
puts("Usage: ./basic_example_using_each_line_with_index.rb (infile) (outfile)")
|
|
10
|
+
return -1
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
infile = GdalFile.new(ARGV[0])
|
|
14
|
+
outfile = GdalFile.new(ARGV[1], "w", infile.xsize,infile.ysize,infile.number_of_bands,"GTiff", infile.data_type, ["COMPRESS=DEFLATE", "TILED=YES"])
|
|
15
|
+
y = 0
|
|
16
|
+
infile.each_line_with_index do |y_index,data|
|
|
17
|
+
data.each do |band|
|
|
18
|
+
band.each_index do |x_index|
|
|
19
|
+
band[x_index] = band[x_index] - band[x_index]/4
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
outfile.write_bands(0,y_index,infile.xsize,1,data)
|
|
23
|
+
end
|
|
24
|
+
# Set the projection
|
|
25
|
+
outfile.set_projection(infile.get_projection)
|
|
26
|
+
# set the geo transform (world file)
|
|
27
|
+
outfile.set_geo_transform(infile.get_geo_transform)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
require "rubygems"
|
|
3
|
+
require "gdal_helper"
|
|
4
|
+
require "pp"
|
|
5
|
+
|
|
6
|
+
##
|
|
7
|
+
# This is a very basic example using the helper library to do some real work - in this case taking a MODIS ndvi product
|
|
8
|
+
# that is scaled from 10,000 to -1000 and creating a nice color presentation of it.
|
|
9
|
+
# This is just an example, so YMMV. Have fun - jc@alaska.edu
|
|
10
|
+
|
|
11
|
+
##
|
|
12
|
+
# Finds the correct item in a colormap for a particular value
|
|
13
|
+
def find_color_range ( value, colormap )
|
|
14
|
+
##
|
|
15
|
+
# Keep last, incase it is needed again - speed up
|
|
16
|
+
if (@last && @last[0] <= value && value <= @last[1])
|
|
17
|
+
return @last
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
colormap.each do |color_set|
|
|
21
|
+
if ( color_set[0] <= value && value <= color_set[1] )
|
|
22
|
+
@last = color_set
|
|
23
|
+
return color_set
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# outside the range of the color map, this is an error..
|
|
28
|
+
raise(ArgumentError, "value requested is not in colormap..", caller)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
##
|
|
33
|
+
# Maps v to a range, given a min and max source and desitancation values.. wow, I can't spell..
|
|
34
|
+
def map_color(color_set, value)
|
|
35
|
+
#give the color table some more reasonable names..
|
|
36
|
+
# [min, max, [min r,g,b], [max r,g,b]]
|
|
37
|
+
min = color_set[0]
|
|
38
|
+
max = color_set[1]
|
|
39
|
+
min_c = color_set[2]
|
|
40
|
+
max_c = color_set[3]
|
|
41
|
+
rgb=[] #requested color
|
|
42
|
+
perc = (value.to_f - min.to_f)/(max - min) #percent between
|
|
43
|
+
0.upto(2) { |zang| rgb[zang] = ((max_c[zang] - min_c[zang]) * perc + min_c[zang] ).to_i }
|
|
44
|
+
rgb
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
##
|
|
48
|
+
# Maps a value to a color set
|
|
49
|
+
def colorize(value, colormap)
|
|
50
|
+
@cache={} if (!@cache)
|
|
51
|
+
return @cache[value] if (@cache[value])
|
|
52
|
+
color_set = find_color_range(value, colormap)
|
|
53
|
+
|
|
54
|
+
rgb = map_color(color_set, value)
|
|
55
|
+
@cache[value]=rgb if (@cache.length < 10000) #cache first x items - deleting from the hash is slow
|
|
56
|
+
rgb
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
##
|
|
60
|
+
# A color map for ndvi, adapted from GRASS. the format is [min value, max value, [starting r,g,b], [ending r,g,b]]
|
|
61
|
+
# this could of course be improved..
|
|
62
|
+
ndvi_colormap = [
|
|
63
|
+
[-1.0000, -0.3000, [255,255,255], [0,0,255]],
|
|
64
|
+
[-0.3000, -0.2000, [0,0,255], [205,193, 173]],
|
|
65
|
+
[-0.2000, 0.0000, [205,193, 173], [150,150,150]],
|
|
66
|
+
[0.0000, 0.1000,[150,150,150], [120,100,51]],
|
|
67
|
+
[0.1000, 0.3000,[120,100,51], [120, 200, 100]],
|
|
68
|
+
[0.3000, 0.4000,[120,200,100],[28, 144, 3]],
|
|
69
|
+
[0.4000, 0.6000,[28, 144, 3],[ 6, 55, 0]],
|
|
70
|
+
[0.6000, 0.8000,[ 6, 55, 0],[10, 30, 25]],
|
|
71
|
+
[0.8000, 1.0000,[10, 30, 25],[ 6, 27, 7]]
|
|
72
|
+
]
|
|
73
|
+
|
|
74
|
+
if (ARGV.length != 2)
|
|
75
|
+
puts("Usage: ./ndvi_color.rb (infile) (outfile)")
|
|
76
|
+
return -1
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
#input file
|
|
80
|
+
infile = GdalFile.new(ARGV[0])
|
|
81
|
+
#output file
|
|
82
|
+
outfile = GdalFile.new(ARGV[1], "w", infile.xsize,infile.ysize,3,"GTiff", String, ["COMPRESS=DEFLATE", "TILED=YES"])
|
|
83
|
+
#set the projection related details on the output file
|
|
84
|
+
outfile.set_projection(infile.get_projection)
|
|
85
|
+
outfile.set_geo_transform(infile.get_geo_transform)
|
|
86
|
+
|
|
87
|
+
# Loop though each line, colorizing the data
|
|
88
|
+
infile.each_line_with_index do |y_index, data|
|
|
89
|
+
out_data = [[],[],[]] #rbg array..
|
|
90
|
+
|
|
91
|
+
# print some status details..
|
|
92
|
+
if (y_index%100 == 0)
|
|
93
|
+
STDOUT.write(".")
|
|
94
|
+
STDOUT.flush
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# loop though each sample, colorzing them.
|
|
98
|
+
data[0].each_index do |x_index|
|
|
99
|
+
# take each value, map it to a rgb, then put this in the bands to be output
|
|
100
|
+
rgb = colorize(data[0][x_index].to_f*0.0001, ndvi_colormap)
|
|
101
|
+
out_data[0][x_index] = rgb[0]
|
|
102
|
+
out_data[1][x_index] = rgb[1]
|
|
103
|
+
out_data[2][x_index] = rgb[2]
|
|
104
|
+
end
|
|
105
|
+
outfile.write_bands(0,y_index, infile.xsize, 1, out_data)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
STDOUT.write("Done!\n")
|
data/lib/gdal_helper.rb
CHANGED
|
@@ -302,16 +302,16 @@ end
|
|
|
302
302
|
class GdalFile < GdalStuff
|
|
303
303
|
def initialize ( name, mode="r", xsize=nil, ysize=nil,bands=3, driver="GTiff", data_type=String, options=['TILED=YES','COMPRESS=DEFLATE'] )
|
|
304
304
|
if ( mode == "r" )
|
|
305
|
-
@
|
|
305
|
+
@gdalfile = Gdal::Gdal.open(name)
|
|
306
306
|
else
|
|
307
307
|
if ( mode == "w")
|
|
308
308
|
if (File.exists?(name))
|
|
309
|
-
@
|
|
309
|
+
@gdalfile = Gdal::Gdal.open(name,Gdal::Gdalconst::GA_UPDATE )
|
|
310
310
|
else
|
|
311
311
|
driver = Gdal::Gdal.get_driver_by_name(driver)
|
|
312
312
|
#puts(driver.class)
|
|
313
313
|
#puts("Creating create(#{name}, #{xsize}, #{ysize}, #{bands}, #{data_type_to_gdal(data_type).to_s})")
|
|
314
|
-
@
|
|
314
|
+
@gdalfile = driver.create(name, xsize, ysize, bands, data_type_to_gdal(data_type), options)
|
|
315
315
|
end
|
|
316
316
|
else
|
|
317
317
|
raise ArgumentError, "mode of \"#{mode}\" is not useful (not r|w) not sure what to do here folks", caller
|
|
@@ -320,7 +320,7 @@ class GdalFile < GdalStuff
|
|
|
320
320
|
|
|
321
321
|
@bands=[]
|
|
322
322
|
#1 is not a mistake - the raster bands start at 1 no 0. just a fyi.
|
|
323
|
-
1.upto(@
|
|
323
|
+
1.upto(@gdalfile.RasterCount).each {|x| @bands << GdalBand.new(@gdalfile.get_raster_band(x))}
|
|
324
324
|
end
|
|
325
325
|
|
|
326
326
|
###
|
|
@@ -351,20 +351,20 @@ class GdalFile < GdalStuff
|
|
|
351
351
|
|
|
352
352
|
#returns basic size info as a hash
|
|
353
353
|
def size()
|
|
354
|
-
{ "x"=> @
|
|
355
|
-
"y" => @
|
|
354
|
+
{ "x"=> @gdalfile.RasterXSize,
|
|
355
|
+
"y" => @gdalfile.RasterYSize,
|
|
356
356
|
"bands" => @bands.length,
|
|
357
357
|
"data_type" => @bands[0].data_type()}
|
|
358
358
|
end
|
|
359
359
|
|
|
360
360
|
#x dimention size
|
|
361
361
|
def xsize()
|
|
362
|
-
@
|
|
362
|
+
@gdalfile.RasterXSize
|
|
363
363
|
end
|
|
364
364
|
|
|
365
365
|
#y dim size
|
|
366
366
|
def ysize()
|
|
367
|
-
@
|
|
367
|
+
@gdalfile.RasterYSize
|
|
368
368
|
end
|
|
369
369
|
|
|
370
370
|
#number of bands
|
|
@@ -384,29 +384,39 @@ class GdalFile < GdalStuff
|
|
|
384
384
|
|
|
385
385
|
# gets the projection
|
|
386
386
|
def get_projection
|
|
387
|
-
@
|
|
387
|
+
@gdalfile.get_projection
|
|
388
388
|
end
|
|
389
389
|
|
|
390
390
|
#sets the projection
|
|
391
391
|
def set_projection(proj_str)
|
|
392
|
-
@
|
|
392
|
+
@gdalfile.set_projection(proj_str)
|
|
393
393
|
end
|
|
394
394
|
|
|
395
395
|
#looks up the projection in the epsg database, give it a number like 102006.
|
|
396
396
|
def set_projection_epsg(epsg)
|
|
397
397
|
srs = Gdal::Osr::SpatialReference.new()
|
|
398
398
|
srs.import_from_epsg(epsg)
|
|
399
|
-
@
|
|
399
|
+
@gdalfile.set_projection(srs.export_to_wkt)
|
|
400
400
|
end
|
|
401
401
|
|
|
402
402
|
#sets the geo_transform, the wld file generally.
|
|
403
403
|
def set_geo_transform(srs)
|
|
404
|
-
@
|
|
404
|
+
@gdalfile.set_geo_transform(srs)
|
|
405
405
|
end
|
|
406
406
|
|
|
407
407
|
#gets the geo transform (wld file traditionally)
|
|
408
408
|
def get_geo_transform()
|
|
409
|
-
@
|
|
409
|
+
@gdalfile.get_geo_transform
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
#iterator over each line..
|
|
413
|
+
def each_line( )
|
|
414
|
+
0.upto(ysize-1){|y| yield(read_bands(0,y,xsize,1))}
|
|
415
|
+
end
|
|
416
|
+
|
|
417
|
+
#iterator over each line, with index
|
|
418
|
+
def each_line_with_index( )
|
|
419
|
+
0.upto(ysize-1){|y| yield(y,read_bands(0,y,xsize,1))}
|
|
410
420
|
end
|
|
411
421
|
|
|
412
422
|
end
|
data/lib/version.rb
CHANGED
metadata
CHANGED
|
@@ -6,8 +6,8 @@ version: !ruby/object:Gem::Version
|
|
|
6
6
|
- 0
|
|
7
7
|
- 0
|
|
8
8
|
- 1
|
|
9
|
-
-
|
|
10
|
-
version: 0.0.1.
|
|
9
|
+
- 2
|
|
10
|
+
version: 0.0.1.2
|
|
11
11
|
platform: ruby
|
|
12
12
|
authors:
|
|
13
13
|
- JC
|
|
@@ -15,7 +15,7 @@ autorequire:
|
|
|
15
15
|
bindir: bin
|
|
16
16
|
cert_chain: []
|
|
17
17
|
|
|
18
|
-
date: 2010-04-
|
|
18
|
+
date: 2010-04-21 00:00:00 -08:00
|
|
19
19
|
default_executable:
|
|
20
20
|
dependencies: []
|
|
21
21
|
|
|
@@ -31,8 +31,11 @@ files:
|
|
|
31
31
|
- lib/version.rb
|
|
32
32
|
- lib/gdal_helper.rb
|
|
33
33
|
- test/ruby_gem_test.rb
|
|
34
|
+
- examples/basic_example_using_each_line_with_index.rb
|
|
34
35
|
- examples/basic_example.rb
|
|
35
36
|
- examples/print_info_example.rb
|
|
37
|
+
- examples/ndvi_color.rb
|
|
38
|
+
- examples/basic_example_using_each_line.rb
|
|
36
39
|
- examples/gdal_helper_test.rb
|
|
37
40
|
has_rdoc: true
|
|
38
41
|
homepage: http://www.gina.alaska.edu
|