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