Skip to content

Commit

Permalink
Merge pull request #68 from fpl/new_fix_issue_53
Browse files Browse the repository at this point in the history
Closes #53 with simple tests (this obsoletes PR #57 and PR #65)
  • Loading branch information
shawnlaffan authored Jun 12, 2024
2 parents 241daae + fe8c8d0 commit c782ae7
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 8 deletions.
16 changes: 8 additions & 8 deletions lib/Geo/GDAL/FFI.pm
Original file line number Diff line number Diff line change
Expand Up @@ -538,9 +538,9 @@ $ffi->attach('GDALInitGCPs' => [qw/int opaque/] => 'void');
$ffi->attach('GDALDeinitGCPs' => [qw/int opaque/] => 'void');
$ffi->attach('GDALDuplicateGCPs' => [qw/int opaque/] => 'opaque');
$ffi->attach('GDALGCPsToGeoTransform' => [qw/int opaque double* int/] => 'int');
$ffi->attach('GDALInvGeoTransform' => [qw/double* double*/] => 'int');
$ffi->attach('GDALApplyGeoTransform' => [qw/double* double double double* double*/] => 'void');
$ffi->attach('GDALComposeGeoTransforms' => [qw/double* double* double*/] => 'void');
$ffi->attach('GDALInvGeoTransform' => [qw/double[] double[]/] => 'int');
$ffi->attach('GDALApplyGeoTransform' => [qw/double[6] double double double* double*/] => 'void');
$ffi->attach('GDALComposeGeoTransforms' => [qw/double[6] double[6] double[6]/] => 'void');
$ffi->attach('GDALGetMetadataDomainList' => [qw/opaque/] => 'opaque');
$ffi->attach('GDALGetMetadata' => [qw/opaque string/] => 'opaque');
$ffi->attach('GDALSetMetadata' => [qw/opaque opaque string/] => 'int');
Expand Down Expand Up @@ -1511,11 +1511,11 @@ $ffi->attach('OCTGetSourceCS' => [qw/opaque/] => 'opaque');
$ffi->attach('OCTGetTargetCS' => [qw/opaque/] => 'opaque');
$ffi->attach('OCTGetInverse' => [qw/opaque/] => 'opaque');
$ffi->attach('OCTDestroyCoordinateTransformation' => [qw/opaque/] => 'void');
$ffi->attach('OCTTransform' => [qw/opaque int double* double* double*/] => 'int');
$ffi->attach('OCTTransformEx' => [qw/opaque int double* double* double* int*/] => 'int');
$ffi->attach('OCTTransform4D' => [qw/opaque int double* double* double* double* int*/] => 'int');
$ffi->attach('OCTTransform4DWithErrorCodes' => [qw/opaque int double* double* double* double* int*/] => 'int');
$ffi->attach('OCTTransformBounds' => [qw/opaque double double double double double* double* double* double* int/] => 'int');
$ffi->attach('OCTTransform' => [qw/opaque int double[] double[] double[]/] => 'int');
$ffi->attach('OCTTransformEx' => [qw/opaque int double[] double[] double[] int[]/] => 'int');
$ffi->attach('OCTTransform4D' => [qw/opaque int double[] double[] double[] double[] int[]/] => 'int');
$ffi->attach('OCTTransform4DWithErrorCodes' => [qw/opaque int double[] double[] double[] double[] int[]/] => 'int');
$ffi->attach('OCTTransformBounds' => [qw/opaque double double double double double[] double[] double[] double[] int/] => 'int');
# from apps/gdal_utils.h
$ffi->attach('GDALInfoOptionsNew' => [qw/opaque opaque/] => 'opaque');
$ffi->attach('GDALInfoOptionsFree' => [qw/opaque/] => 'void');
Expand Down
5 changes: 5 additions & 0 deletions t/00.t
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,11 @@ if(1){
is($p, $ogc_wkt, "Set/get projection string");
my $transform = [10,2,0,20,0,3];
$ds->SetGeoTransform($transform);
my $inv = [0,0,0,0,0,0];
ok(Geo::GDAL::FFI::GDALInvGeoTransform($transform, $inv) && "@$inv" eq "-5 0.5 0 -6.66666666666667 0 0.333333333333333", "Invert geotransform");
my ($x, $y);
Geo::GDAL::FFI::GDALApplyGeoTransform($transform,5,5,\$x,\$y);
ok($x == 20 && $y == 35, "Applied geotransform to pixel coords");
my $t = $ds->GetGeoTransform;
is_deeply($t, $transform, "Set/get geotransform");

Expand Down
61 changes: 61 additions & 0 deletions t/transform.t
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
use v5.10;
use strict;
use warnings;
use Carp;
use Geo::GDAL::FFI;
use Test::More;

# test about SRS transformations API by using a simple extent (4 points) in UTM33 -> WGS84

if(1) {
my $source_srs = Geo::GDAL::FFI::SpatialReference->new( EPSG => 4326 );
my $target_srs = Geo::GDAL::FFI::SpatialReference->new( EPSG => 32633 );
my $ct = Geo::GDAL::FFI::OCTNewCoordinateTransformation($$source_srs, $$target_srs);

my @extent = (16.509888, 41.006911, 17.084248, 41.370581);

my @ul = ($extent[0], $extent[1]);
my @lr = ($extent[2], $extent[3]);
my @ur = ($lr[0],$ul[1]);
my @ll = ($ul[0],$lr[1]);
my @result = qw/3358768.81711923 3391240.32068776 3348976.84626544 3401215.87353221 2019470.50927319 2094945.30821076 2088830.64307375 2025411.23009774/;

my @x = ($ul[0], $lr[0], $ur[0], $ll[0]);
my @y = ($ul[1], $lr[1], $ur[1], $ll[1]);
my $z = undef;
my $res = Geo::GDAL::FFI::OCTTransform($ct, 4, \@x, \@y, \@$z);
is($res, 1, "Coordinate transformation 3D worked");
is_deeply([@x, @y], \@result, "Checking resulting coordinates");

@x = ($ul[0], $lr[0], $ur[0], $ll[0]);
@y = ($ul[1], $lr[1], $ur[1], $ll[1]);
$z = undef;
my @ps = (0,0,0,0);
$res = Geo::GDAL::FFI::OCTTransformEx($ct, 4, \@x, \@y, \@$z, \@ps);
is($res, 1, "Coordinate transformation 3D with pabSuccess worked");
is_deeply([@x, @y], \@result, "Checking resulting coordinates");
is(scalar @ps, 4, "Resulting pabSuccess is an array of size 4");
is_deeply(\@ps, [1, 1, 1, 1], "Resulting pabSuccess is TRUE x 4" );

@x = ($ul[0], $lr[0], $ur[0], $ll[0]);
@y = ($ul[1], $lr[1], $ur[1], $ll[1]);
$z = undef;
my $t = undef;
@ps = (0,0,0,0);
$res = Geo::GDAL::FFI::OCTTransform4D($ct, 4, \@x, \@y, \@$z, \@$t, \@ps);
is($res, 1, "Coordinate transformation 4D worked");
is_deeply([@x, @y, @ps], [@result, 1, 1, 1, 1], "Checking resulting coordinates");

@x = ($ul[0], $lr[0], $ur[0], $ll[0]);
@y = ($ul[1], $lr[1], $ur[1], $ll[1]);
$z = undef;
$t = undef;
@ps = (0,0,0,0);
$res = Geo::GDAL::FFI::OCTTransform4DWithErrorCodes($ct, 4, \@x, \@y, \@$z, \@$t, \@ps);
is($res, 1, "Coordinate transformation 4D worked");
is_deeply([@x, @y], \@result, "Checking resulting coordinates");
is(scalar @ps, 4, "Resulting pabSuccess is an array of size 4");
is_deeply(\@ps, [0, 0, 0, 0], "Resulting pabSuccess is SUCCESS(i.e. 0) x 4" );
}

done_testing();

0 comments on commit c782ae7

Please sign in to comment.