1use strict;
2use warnings;
3use Scalar::Util 'blessed';
4use Test::More qw(no_plan);
5BEGIN { use_ok('Geo::GDAL') };
6
7# package Geo::GDAL::Band
8# sub AttributeTable
9# sub CategoryNames
10# sub Checksum
11# sub ColorInterpretation
12# sub ColorInterpretations
13# sub ColorTable
14# sub ComputeBandStats
15# sub ComputeRasterMinMax
16# sub ComputeStatistics
17# sub Contours
18# sub CreateMaskBand
19# sub DataType
20# sub Domains
21# sub Fill
22# sub FillNodata
23# sub FlushCache
24# sub GetBandNumber
25# sub GetBlockSize
26# sub GetColorTable
27# sub GetDataset
28# sub GetDefaultHistogram
29# sub GetHistogram
30# sub GetMaskBand
31# sub GetMaskFlags
32# sub GetMaximum
33# sub GetMinimum
34# sub GetOverview
35# sub GetOverviewCount
36# sub GetStatistics
37# sub HasArbitraryOverviews
38# sub MaskFlags
39# sub NoDataValue
40# sub PackCharacter
41# sub ReadRaster
42# sub ReadTile
43# sub RegenerateOverview
44# sub RegenerateOverviews
45# sub ScaleAndOffset
46# sub SetColorTable
47# sub SetDefaultHistogram
48# sub SetStatistics
49# sub Size
50# sub Unit
51# sub WriteRaster
52# sub WriteTile
53
54
55my $dataset = Geo::GDAL::Driver('GTiff')->Create(Name => '/vsimem/test.gtiff', Width => 4, Height => 6);
56my $band = $dataset->Band;
57my @list;
58
59SKIP: {
60    eval {
61        $band->SetCategoryNames('a','b');
62    };
63    skip "Setting category names in geotiffs not supported." unless $@ eq '';
64    $band->CategoryNames('a','b',1);
65    @list = $band->CategoryNames;
66    ok(($list[0] eq 'a' and $list[1] eq 'b'), "CategoryNames");
67}
68
69@list = $band->GetBlockSize;
70ok(($list[0] == 4 and $list[1] == 6), "GetBlockSize");
71
72@list = $band->Size;
73ok(($list[0] == 4 and $list[1] == 6), "Size");
74
75my $ds = $band->GetDataset;
76ok((defined($ds) and blessed($ds) and $ds->isa('Geo::GDAL::Dataset')), "GetDataset");
77
78$band->Unit('metri');
79$ds = $band->Unit();
80ok($ds eq 'metri', "Unit");
81
82$band->ScaleAndOffset(0.1, 5);
83@list = $band->ScaleAndOffset();
84ok((sprintf("%.1f", $list[0]) eq '0.1' and $list[1] == 5), "ScaleAndOffset");
85
86my $nr = $band->GetBandNumber;
87ok($nr == 1, "GetBandNumber");
88
89my $rat = Geo::GDAL::RasterAttributeTable->new;
90$band->AttributeTable($rat);
91$rat = $band->AttributeTable();
92ok((defined($rat) and blessed($rat) and $rat->isa('Geo::GDAL::RasterAttributeTable')), "RasterAttributeTable");
93
94my $c = $band->ColorInterpretation;
95my %c = map {$_=>1} Geo::GDAL::Band::ColorInterpretations;
96ok($c{$c}, "Get ColorInterpretation");
97$c = 'BlueBand'; # (keys %c)[0]; setting RedBand leads to core dump in geotiff.cpp:4288 #6306
98$band->ColorInterpretation($c);
99ok($band->ColorInterpretation eq $c, "Set ColorInterpretation");
100
101@list = $band->Domains;
102ok(@list > 1, "Domains");
103
104$c = Geo::GDAL::ColorTable->new;
105$c->ColorEntry(0, 100, 50, 150, 300);
106@list = $c->ColorTable;
107ok($list[0][0] == 100, "Colortable");
108$band->SetColorTable($c);
109$c = $band->GetColorTable();
110ok((defined($c) and blessed($c) and $c->isa('Geo::GDAL::ColorTable')), "Get ColorTable");
111@list = $c->ColorTable;
112ok($list[0][0] == 100, "Set and Get Colortable");
113
114$dataset = Geo::GDAL::Driver('MEM')->Create(Width => 4, Height => 4);
115$dataset->AddBand('Int32');
116$band = $dataset->Band(2);
117$band->	Fill(123);
118my $data = $band->ReadTile;
119ok($data->[0][0] == 123, "Fill with integer");
120for my $row (@$data) {
121#    print "@$row\n";
122}
123$dataset->AddBand('Float64');
124$band = $dataset->Band(3);
125$band->	Fill(123.45);
126$data = $band->ReadTile;
127ok(sprintf("%.2f", $data->[0][0]) eq '123.45', "Fill with real");
128for my $row (@$data) {
129#    print "@$row\n";
130}
131#$dataset->AddBand('CFloat64');
132#$band = $dataset->Band(4);
133#$band->Fill(123.45, 10);
134#$data = $band->ReadTile;
135#for my $row (@$data) {
136#    print "@$row\n";
137#}
138
139#use Statistics::Descriptive;
140#my $stat = Statistics::Descriptive::Full->new();
141$band = $dataset->Band(3);
142for my $y (0..3) {
143    for my $x (0..3) {
144        $data->[$y][$x] = rand 10;
145        #$stat->add_data($data->[$y][$x]);
146    }
147}
148$band->WriteTile($data);
149for my $row (@$data) {
150    #print "@$row\n";
151}
152
153my $x;
154my ($min, $max, $mean, $stddev);
155
156#print $stat->mean()," ",$stat->standard_deviation(),"\n";
157
158@list = $band->ComputeRasterMinMax;
159ok(@list == 2, "ComputeRasterMinMax");
160
161$x = $band->GetMinimum;
162ok(!defined($x), "GetMinimum");
163@list = $band->GetMinimum;
164ok(@list == 2, "GetMinimum");
165
166$x = $band->GetMaximum;
167ok(!defined($x), "GetMaximum");
168@list = $band->GetMaximum;
169ok(@list == 2, "GetMaximum");
170
171@list = $band->ComputeBandStats;
172ok(@list == 2, "ComputeBandStats");
173
174$band->ComputeStatistics(1);
175$x = $band->GetMaximum;
176ok(defined($x), "GetMaximum");
177
178@list = $band->GetStatistics(1,0);
179ok(@list == 4, "GetStatistics");
180
181$band->SetMetadataItem('STATISTICS_APPROXIMATE',undef);
182$band->SetStatistics(0, 1, 2, 3);
183@list = $band->GetStatistics(0,0);
184ok($list[3] == 3, "SetStatistics");
185
186@list = $band->ComputeBandStats;
187ok(@list == 2, "ComputeBandStats");
188
189my $foo;
190my $n = 0;
191@list = $band->ComputeStatistics(0, sub {$foo = $_[2] unless $foo; $n++; 1}, 'foo');
192ok(@list == 4, "ComputeStatistics");
193ok(($n > 0 and $foo eq 'foo'), "ComputeStatistics callback");
194
195Geo::GDAL::VSIF::Unlink('/vsimem/test.gtiff');
196$dataset = Geo::GDAL::Driver('GTiff')->Create(Name => '/vsimem/test.gtiff', Width => 4, Height => 6);
197$band = $dataset->Band;
198$c = $band->Checksum;
199ok($c == 0, "Checksum");
200
201$c = $band->NoDataValue;
202ok(!defined($c), "Get NoDataValue");
203$band->NoDataValue(10);
204$c = $band->NoDataValue;
205ok($c == 10, "Set NoDataValue");
206
207# set one pixel no data
208$data = $band->ReadTile;
209$data->[2][2] = 10;
210$band->WriteTile($data);
211
212my @f = $band->MaskFlags;
213ok(@f > 0, "MaskFlags");
214
215@f = $band->GetMaskFlags;
216ok($f[0] eq 'NoData', "GetMaskFlags");
217
218# fill the one pixel
219$band->FillNodata();
220$data = $band->ReadTile;
221ok($data->[2][2] == 0, "FillNodata, got $data->[2][2]");
222
223$band->CreateMaskBand('PerDataset');
224@f = $band->GetMaskFlags;
225ok($f[0] eq 'PerDataset', "CreateMaskBand");
226
227#@list = Geo::GDAL::VSIF::ReadDir('/vsimem/');
228#print "files @list\n"; # includes .msk
229
230# $m is not valid here any more, how to test?
231
232Geo::GDAL::VSIF::Unlink('/vsimem/test.gtiff');
233$dataset = Geo::GDAL::Driver('GTiff')->Create(Name => '/vsimem/test.gtiff', Bands => 2);
234$dataset->BuildOverviews('average', [2,4]);
235
236my $band1 = $dataset->Band(1);
237my $band2 = $dataset->Band(2);
238
239$band1->RegenerateOverviews([$band2]); #scalar resampling, subref callback, scalar callback_data
240$band1->RegenerateOverview($band2); #scalar resampling, subref callback, scalar callback_data
241
242$c = $band1->GetOverviewCount;
243ok($c == 2, "GetOverviewCount, got $c");
244my $o = $band1->GetOverview(1);
245ok(defined($o), "GetOverview");
246my $b = $band1->HasArbitraryOverviews;
247ok(!$b, "HasArbitraryOverviews");
248
249Geo::GDAL::VSIF::Unlink('/vsimem/test.gtiff');
250$dataset = Geo::GDAL::Driver('GTiff')->Create(Name => '/vsimem/test.gtiff', Width => 256, Type => 'Float64');
251$band = $dataset->Band;
252
253$data = $band->ReadTile;
254for my $y (0..@$data-1) {
255    for my $x (0..@{$data->[$y]}-1) {
256        $data->[$y][$x] = rand 10;
257        if (defined $min) {
258            $min = $data->[$y][$x] if $data->[$y][$x] < $min;
259        } else {
260            $min = $data->[$y][$x];
261        }
262        if (defined $max) {
263            $max = $data->[$y][$x] if $data->[$y][$x] > $max;
264        } else {
265            $max = $data->[$y][$x];
266        }
267    }
268}
269$band->WriteTile($data);
270
271my $h = $band->GetHistogram(Max => 10.0, Buckets => 11);
272my $sum = 0;
273for (@$h) {
274    $sum += $_;
275}
276ok($sum == 256*256, "GetHistogram");
277ok(@$h == 11, "GetHistogram");
278my $histogram;
279($min, $max, $histogram) = $band->GetDefaultHistogram;
280ok(ref($histogram) eq 'ARRAY', "GetDefaultHistogram");
281eval {
282    $band->SetDefaultHistogram($min, $max, $histogram);
283};
284ok(!$@, "SetDefaultHistogram");
285
286my @h = ('12345678987654321','9223372036854775806');
287$band->SetDefaultHistogram(0, 100, \@h);
288my @hist = $band->GetDefaultHistogram(0);
289ok($hist[0] == 0, "DefaultHistogram");
290ok($hist[1] == 100, "DefaultHistogram");
291ok($hist[2][0] eq $h[0], "DefaultHistogram");
292ok($hist[2][1] eq $h[1], "DefaultHistogram");
293
294my $buf = $band->ReadRaster();
295my $pc = $band->PackCharacter;
296my @data = unpack("$pc*", $buf);
297$n = @data;
298ok($n == 256*256, "ReadRaster");
299
300$buf = pack("$pc*", @data);
301eval {
302    $band->WriteRaster(XOff => 0, yoff => 0, buf => $buf);
303};
304ok(!$@, "WriteRaster");
305
306__END__
307
308
309public Geo::OGR::Layer 	Contours (scalar DataSource, hashref LayerConstructor, scalar ContourInterval, scalar ContourBase, arrayref FixedLevels, scalar NoDataValue, scalar IDField, scalar ElevField, subref callback, scalar callback_data)
310
311