[gdal-dev] FW: Problem with GDAL perl 1.5 bindings
Ari Jolma
ari.jolma at tkk.fi
Thu Jan 31 03:48:18 EST 2008
Ethan,
This is because of something, which is a good thing. You (now in 1.5)
get a reference to the dataset you create by getting its raster band.
Geo::GDAL does not destroy the dataset while there is a reference to it.
You either need to use the non-referencing version of GetRasterBand,
which is _GetRasterBand or get rid of the reference by destroying the
raster variable $b.
Best regards,
Ari
Ethan Alpert kirjoitti:
>
> Prior to 1.5 I’d been using the trunk version from 11/06/2007. Looking
> at gdal_wrap.cpp I see that there were two versions checked in 1.3.31
> and 1.3.30. One of these checks breaks a piece of code that worked
> fine in version 1.3.29
>
> The problem relates to clean up when an object is dereferenced in perl.
>
> For many releases now if I created and wrote an image I would have to
> Call FlushCache **and** undef the variable referencing the GDALdataset
> inorder for all the data I wrote to actually end up in the file. This
> no longer works. Now I must exit my perl script completely for the all
> the data to be completely written.
>
> Below is an example of converting to grayscale. This works great if at
> the end I’m done. But this is not the case. Later in the script I call
> gdal_rasterize and the resulting file ends up not having a
> geotransform and is 3x too big. If I exit my app and call
> gdal_rasterize manually everything works correctly. This is what led
> me to believe there’s been a change in the perl binding that relate to
> cleaning up and finalizing the file that now doesn’t execute on
> derference but only when the perl script exits.
>
> On 11/06/2007 my code worked. Today with the stock 1.5 it doesn’t. So
> my question is there some function to call to force the file to be
> completely written? If not is there a way to revert to the prior
> functionality. .
>
> $gtiff_driver = Geo::GDAL::GetDriverByName('GTiff');
>
> $fil = Geo::GDAL::Open("$tmp_dir/$$.tif");
>
> $xsize = $fil->{RasterXSize};
>
> $ysize = $fil->{RasterYSize};
>
> $tot = $xsize;
>
> $width = $xsize;
>
> $bandr = $fil->GetRasterBand(1);
>
> $bandg = $fil->GetRasterBand(2);
>
> $bandb = $fil->GetRasterBand(3);
>
> $output_ds= $gtiff_driver->Create("$tmp_dir/$$\_bw.tif",
> $fil->{RasterXSize}, $fil->{RasterYSize}, 1, $Geo::GDAL::Const::GDT_Byte);
>
> $output_ds->SetGeoTransform($fil->GetGeoTransform);
>
> $output_ds->SetProjection($fil->GetProjection);
>
> $b = $output_ds->GetRasterBand(1);
>
> for($k = 0; $k < $fil->{RasterYSize}; $k++) {
>
> $scanliner = $bandr->ReadRaster(0,$k,$fil->{RasterXSize},1);
>
> $scanlineb = $bandb->ReadRaster(0,$k,$fil->{RasterXSize},1);
>
> $scanlineg = $bandg->ReadRaster(0,$k,$fil->{RasterXSize},1);
>
> @datar = unpack("C[$tot]",$scanliner);
>
> @datag = unpack("C[$tot]",$scanlineg);
>
> @datab = unpack("C[$tot]",$scanlineb);
>
> @datagrey = ();
>
> $min = 300;
>
> $max = -1;
>
> for ($i = 0; $i < scalar @datar; $i++) {
>
> $t = (.3 * $datar[$i] + .59 * $datag[$i] + .11 * $datab[$i]) + .000001;
>
> push @datagrey, int ($t+.5);
>
> }
>
> $ot = pack("c[$tot]", at datagrey);
>
> $b->WriteRaster(0,$k,$width,1,$ot);
>
> }
>
> $output_ds->FlushCache;
>
> undef $output_ds;
>
> later I call:
>
> system "gdal_rasterize -i -l $$ -b 1 -burn 0 $tmp_dir/$$.shp
> $tmp_dir/$$\_bw.tif ";
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> gdal-dev mailing list
> gdal-dev at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/gdal-dev
--
Prof. Ari Jolma
Geoinformatiikka / Geoinformatics
Teknillinen Korkeakoulu / Helsinki University of Technology
tel: +358 9 451 3886 address: POBox 1200, 02015 TKK, Finland
Email: ari.jolma at tkk.fi URL: http://www.tkk.fi/~jolma
More information about the gdal-dev
mailing list