Geo::GDAL::FFI - A foreign function interface to GDAL
Version 0.04
This is an example of creating a vector dataset.
use Geo::GDAL::FFI; my $gdal = Geo::GDAL::FFI->new(); my $sr = Geo::GDAL::FFI::SpatialReference->new(EPSG => 3067); my $layer = $gdal ->GetDriver('ESRI Shapefile') ->Create('test.shp') ->CreateLayer({ Name => 'test', SpatialReference => $sr, GeometryType => 'Point', Fields => [ { Name => 'name', Type => 'String' } ] }); my $f = Geo::GDAL::FFI::Feature->new($layer->Defn); $f->SetField(name => 'a'); my $g = Geo::GDAL::FFI::Geometry->new('Point'); $g->SetPoint(1, 2); $f->SetGeomField($g); $layer->CreateFeature($f);
This is an example of reading a vector dataset.
use Geo::GDAL::FFI; my $gdal = Geo::GDAL::FFI->new(); my $layer = $gdal->Open('test.shp')->GetLayer; $layer->ResetReading; while (my $feature = $layer->GetNextFeature) { my $value = $feature->GetField('name'); my $geom = $feature->GetGeomField; say $value, ' ', $geom->AsText; }
This is an example of creating a raster dataset.
use Geo::GDAL::FFI; my $gdal = Geo::GDAL::FFI->new(); my $tiff = $gdal->GetDriver('GTiff')->Create('test.tiff', 3, 2); my $ogc_wkt = 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS84",6378137,298.257223563,'. 'AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,'. 'AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,'. 'AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]'; $tiff->SetProjectionString($ogc_wkt); my $transform = [10,2,0,20,0,3]; $tiff->SetGeoTransform($transform); my $data = [[0,1,2],[3,4,5]]; $tiff->GetBand->Write($data);
This is an example of reading a raster dataset. Note that using PDL and MCE::Shared can greatly reduce the time needed to process large raster datasets.
use Geo::GDAL::FFI; my $gdal = Geo::GDAL::FFI->new(); my $band = $gdal->Open($ARGV[0])->GetBand; my ($w_band, $h_band) = $band->GetSize; my ($w_block, $h_block) = $band->GetBlockSize; my $nodata = $band->GetNoDataValue; my ($xoff, $yoff) = (0,0); my ($min, $max); while (1) { if ($xoff >= $w_band) { $xoff = 0; $yoff += $h_block; last if $yoff >= $h_band; } my $w_real = $w_band - $xoff; $w_real = $w_block if $w_real > $w_block; my $h_real = $h_band - $yoff; $h_real = $h_block if $h_real > $h_block; my $data = $band->Read($xoff, $yoff, $w_real, $h_real); for my $y (0..$#$data) { my $row = $data->[$y]; for my $x (0..$#$row) { my $value = $row->[$x]; next if defined $nodata && $value == $nodata; $min = $value if !defined $min || $value < $min; $max = $value if !defined $max || $value > $max; } } $xoff += $w_block; } say "min = $min, max = $max";
This is a foreign function interface to the GDAL geospatial data access library.
The progress function argument used in many methods should be a reference to a subroutine. The subroutine is called with three arguments ($fraction, $msg, $data), where $fraction is a number, $msg is a string, and $data is a pointer that is given as the progress data argument.
($fraction, $msg, $data)
$fraction
$msg
$data
my $gdal = Geo::GDAL::FFI->new;
Create a new Geo::GDAL::FFI object. All GDAL functions that are available (the C API is used) are attached to this class. The other classes in this distribution are there to provide an easier to use object oriented Perl API.
my @caps = $gdal->Capabilities;
Returns the list of capabilities (strings) a GDAL major object (Driver, Dataset, Band, or Layer in Geo::GDAL::FFI) can have.
my @flags = $gdal->OpenFlags;
Returns the list of opening flags to be used in the Open method.
my @types = $gdal->DataTypes;
Returns the list of raster cell data types to be used in e.g. the CreateDataset method of the Driver class.
my @types = $gdal->FieldTypes;
Returns the list of field types.
my @types = $gdal->FieldSubTypes;
Returns the list of field subtypes.
my @justifications = $gdal->Justifications;
Returns the list of field justifications.
my @interpretations = $gdal->ColorInterpretations;
Returns the list of color interpretations.
my @types = $gdal->GeometryTypes;
Returns the list of geometry types.
my $info = $gdal->GetVersionInfo;
Returns the version information from the underlying GDAL library.
my @drivers = $gdal->GetDrivers;
Returns a list of all available driver objects.
my @driver = $gdal->GetDriver($name);
Returns the specific driver object.
my $dataset = $gdal->Open($name, {Flags => [qw/READONLY/], ...});
Open a dataset. $name is the name of the dataset. Named arguments are the following.
Flags
Optional, default is a reference to an empty array. Note that some drivers can open both raster and vector datasets.
AllowedDrivers
Optional, default is all drivers. Use a reference to an array of driver names to limit which drivers to test.
SiblingFiles
Optional, default is to probe the file system. You may use a reference to an array of auxiliary file names.
Options
Optional, a reference to an array of driver specific open options. Consult the main GDAL documentation for open options.
This software is released under the Artistic License. See perlartistic.
Ari Jolma - Ari.Jolma at gmail.com
Geo::GDAL::FFI::Object
Geo::GDAL::FFI::Driver
Geo::GDAL::FFI::SpatialReference
Geo::GDAL::FFI::Dataset
Geo::GDAL::FFI::Band
Geo::GDAL::FFI::FeatureDefn
Geo::GDAL::FFI::FieldDefn
Geo::GDAL::FFI::GeomFieldDefn
Geo::GDAL::FFI::Layer
Geo::GDAL::FFI::Feature
Geo::GDAL::FFI::Geometry
Alien::gdal, FFI::Platypus, http://www.gdal.org
To install Geo::GDAL::FFI, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Geo::GDAL::FFI
CPAN shell
perl -MCPAN -e shell install Geo::GDAL::FFI
For more information on module installation, please visit the detailed CPAN module installation guide.