1package Geo::GDAL::FFI;
2
3use v5.10;
4use strict;
5use warnings;
6use Carp;
7use PDL::Types ();
8use Config ();  #  needed to silence some FFI::Platypus warnings
9use FFI::Platypus;
10use FFI::Platypus::Buffer;
11require Exporter;
12require B;
13
14use Geo::GDAL::FFI::VSI;
15use Geo::GDAL::FFI::VSI::File;
16use Geo::GDAL::FFI::SpatialReference;
17use Geo::GDAL::FFI::Object;
18use Geo::GDAL::FFI::Driver;
19use Geo::GDAL::FFI::Dataset;
20use Geo::GDAL::FFI::Band;
21use Geo::GDAL::FFI::Layer;
22use Geo::GDAL::FFI::FeatureDefn;
23use Geo::GDAL::FFI::FieldDefn;
24use Geo::GDAL::FFI::GeomFieldDefn;
25use Geo::GDAL::FFI::Feature;
26use Geo::GDAL::FFI::Geometry;
27
28our $VERSION = 0.0900;
29our $DEBUG = 0;
30
31our @ISA = qw(Exporter);
32our @EXPORT_OK = qw(@errors GetVersionInfo SetErrorHandling UnsetErrorHandling
33    Capabilities OpenFlags DataTypes ResamplingMethods
34    FieldTypes FieldSubtypes Justifications ColorInterpretations
35    GeometryTypes GeometryFormats GridAlgorithms
36    GetDriver GetDrivers IdentifyDriver Open
37    HaveGEOS SetConfigOption GetConfigOption
38    FindFile PushFinderLocation PopFinderLocation FinderClean);
39our %EXPORT_TAGS = (all => \@EXPORT_OK);
40
41our $None = 0;
42our $Debug = 1;
43our $Warning = 2;
44our $Failure = 3;
45our $Fatal = 4;
46
47our %ogr_errors = (
48    1 => 'NOT_ENOUGH_DATA',
49    2 => 'NOT_ENOUGH_MEMORY',
50    3 => 'UNSUPPORTED_GEOMETRY_TYPE',
51    4 => 'UNSUPPORTED_OPERATION',
52    5 => 'CORRUPT_DATA',
53    6 => 'FAILURE',
54    7 => 'UNSUPPORTED_SRS',
55    8 => 'INVALID_HANDLE',
56    9 => 'NON_EXISTING_FEATURE',
57    );
58
59our $Read = 0;
60our $Write = 1;
61
62our @errors;
63our %immutable;
64my  %parent_ref_hash;
65
66my $instance;
67
68sub SetErrorHandling {
69    return unless $instance;
70    return if exists $instance->{CPLErrorHandler};
71    $instance->{CPLErrorHandler} = $instance->{ffi}->closure(
72        sub {
73            my ($err_cat, $err_num, $msg) = @_;
74            if ($err_cat == $None) {
75            } elsif ($err_cat == $Debug) {
76                if ($DEBUG) {
77                    print STDERR $msg;
78                }
79            } elsif ($err_cat == $Warning) {
80                warn $msg;
81            } else {
82                push @errors, $msg;
83            }
84        });
85    CPLPushErrorHandler($instance->{CPLErrorHandler});
86}
87
88sub UnsetErrorHandling {
89    return unless $instance;
90    return unless exists $instance->{CPLErrorHandler};
91    CPLPopErrorHandler($instance->{CPLErrorHandler});
92    delete $instance->{CPLErrorHandler};
93}
94
95sub error_msg {
96    my $args = shift;
97    return unless @errors || $args;
98    unless (@errors) {
99        return $ogr_errors{$args->{OGRError}} if $args->{OGRError};
100        return "Unknown error.";
101    }
102    my $msg = join("\n", @errors);
103    @errors = ();
104    return $msg;
105}
106
107#  internal methods
108sub _register_parent_ref {
109    my ($gdal_handle, $parent) = @_;
110    #  ensure $gdal_handle is not blessed?
111    confess "gdal handle is undefined"
112      if !defined $gdal_handle;
113    confess "Parent ref is undefined"
114      if !$parent;
115    $parent_ref_hash{$gdal_handle} = $parent;
116}
117
118sub _deregister_parent_ref {
119    my ($gdal_handle) = @_;
120    #  we get undef vals in global cleanup
121    return if !$gdal_handle;
122    delete $parent_ref_hash{$gdal_handle};
123}
124
125sub _get_parent_ref {
126    my ($gdal_handle) = @_;
127    warn "Attempting to access non-existent parent"
128      if !$parent_ref_hash{$gdal_handle};
129    return $parent_ref_hash{$gdal_handle}
130}
131
132
133our %capabilities = (
134    OPEN => 1,
135    CREATE => 2,
136    CREATECOPY => 3,
137    VIRTUALIO => 4,
138    RASTER => 5,
139    VECTOR => 6,
140    GNM => 7,
141    NOTNULL_FIELDS => 8,
142    DEFAULT_FIELDS => 9,
143    NOTNULL_GEOMFIELDS => 10,
144    NONSPATIAL => 11,
145    FEATURE_STYLES => 12,
146    );
147
148sub Capabilities {
149    return sort {$capabilities{$a} <=> $capabilities{$b}} keys %capabilities;
150}
151
152our %open_flags = (
153    READONLY => 0x00,
154    UPDATE   => 0x01,
155    ALL      => 0x00,
156    RASTER   => 0x02,
157    VECTOR   => 0x04,
158    GNM      => 0x08,
159    SHARED   => 0x20,
160    VERBOSE_ERROR =>  0x40,
161    INTERNAL      =>  0x80,
162    ARRAY_BLOCK_ACCESS   =>    0x100,
163    HASHSET_BLOCK_ACCESS =>    0x200,
164    );
165
166sub OpenFlags {
167    return sort {$open_flags{$a} <=> $open_flags{$b}} keys %open_flags;
168}
169
170our %data_types = (
171    Unknown => 0,
172    Byte => 1,
173    UInt16 => 2,
174    Int16 => 3,
175    UInt32 => 4,
176    Int32 => 5,
177    Float32 => 6,
178    Float64 => 7,
179    CInt16 => 8,
180    CInt32 => 9,
181    CFloat32 => 10,
182    CFloat64 => 11
183    );
184our %data_types_reverse = reverse %data_types;
185
186sub DataTypes {
187    return sort {$data_types{$a} <=> $data_types{$b}} keys %data_types;
188}
189
190our %rat_field_type = (
191    Integer => 0,
192    Real => 1,
193    String => 2
194    );
195
196our %rat_field_usage = (
197    Generic => 0,
198    PixelCount => 1,
199    Name => 2,
200    Min => 3,
201    Max => 4,
202    MinMax => 5,
203    Red => 6,
204    Green => 7,
205    Blue => 8,
206    Alpha => 9,
207    RedMin => 10,
208    GreenMin => 11,
209    BlueMin => 12,
210    AlphaMin => 13,
211    RedMax => 14,
212    GreenMax => 15,
213    BlueMax => 16,
214    AlphaMax => 17,
215    );
216
217our %rat_table_type = (
218    THEMATIC => 0,
219    ATHEMATIC => 1
220    );
221
222our %resampling = (
223    NearestNeighbour => 0,
224    Bilinear => 1,
225    Cubic => 2,
226    CubicSpline => 3,
227    ORA_Lanczos => 4,
228    Average => 5,
229    Mode => 6,
230    Gauss => 7
231    );
232
233sub ResamplingMethods {
234    return sort {$resampling{$a} <=> $resampling{$b}} keys %resampling;
235}
236
237our %data_type2pdl_data_type = (
238    Byte => $PDL::Types::PDL_B,
239    Int16 => $PDL::Types::PDL_S,
240    UInt16 => $PDL::Types::PDL_US,
241    Int32 => $PDL::Types::PDL_L,
242    Float32 => $PDL::Types::PDL_F,
243    Float64 => $PDL::Types::PDL_D,
244    );
245our %pdl_data_type2data_type = reverse %data_type2pdl_data_type;
246
247our %field_types = (
248    Integer => 0,
249    IntegerList => 1,
250    Real => 2,
251    RealList => 3,
252    String => 4,
253    StringList => 5,
254    #WideString => 6,     # do not use
255    #WideStringList => 7, # do not use
256    Binary => 8,
257    Date => 9,
258    Time => 10,
259    DateTime => 11,
260    Integer64 => 12,
261    Integer64List => 13,
262    );
263our %field_types_reverse = reverse %field_types;
264
265sub FieldTypes {
266    return sort {$field_types{$a} <=> $field_types{$b}} keys %field_types;
267}
268
269our %field_subtypes = (
270    None => 0,
271    Boolean => 1,
272    Int16 => 2,
273    Float32 => 3
274    );
275our %field_subtypes_reverse = reverse %field_subtypes;
276
277sub FieldSubtypes {
278    return sort {$field_subtypes{$a} <=> $field_subtypes{$b}} keys %field_subtypes;
279}
280
281our %justification = (
282    Undefined => 0,
283    Left => 1,
284    Right => 2
285    );
286our %justification_reverse = reverse %justification;
287
288sub Justifications {
289    return sort {$justification{$a} <=> $justification{$b}} keys %justification;
290}
291
292our %color_interpretations = (
293    Undefined => 0,
294    GrayIndex => 1,
295    PaletteIndex => 2,
296    RedBand => 3,
297    GreenBand => 4,
298    BlueBand => 5,
299    AlphaBand => 6,
300    HueBand => 7,
301    SaturationBand => 8,
302    LightnessBand => 9,
303    CyanBand => 10,
304    MagentaBand => 11,
305    YellowBand => 12,
306    BlackBand => 13,
307    YCbCr_YBand => 14,
308    YCbCr_CbBand => 15,
309    YCbCr_CrBand => 16,
310    );
311our %color_interpretations_reverse = reverse %color_interpretations;
312
313sub ColorInterpretations {
314    return sort {$color_interpretations{$a} <=> $color_interpretations{$b}} keys %color_interpretations;
315}
316
317our %geometry_types = (
318    Unknown => 0,
319    Point => 1,
320    LineString => 2,
321    Polygon => 3,
322    MultiPoint => 4,
323    MultiLineString => 5,
324    MultiPolygon => 6,
325    GeometryCollection => 7,
326    CircularString => 8,
327    CompoundCurve => 9,
328    CurvePolygon => 10,
329    MultiCurve => 11,
330    MultiSurface => 12,
331    Curve => 13,
332    Surface => 14,
333    PolyhedralSurface => 15,
334    TIN => 16,
335    Triangle => 17,
336    None => 100,
337    LinearRing => 101,
338    CircularStringZ => 1008,
339    CompoundCurveZ => 1009,
340    CurvePolygonZ => 1010,
341    MultiCurveZ => 1011,
342    MultiSurfaceZ => 1012,
343    CurveZ => 1013,
344    SurfaceZ => 1014,
345    PolyhedralSurfaceZ => 1015,
346    TINZ => 1016,
347    TriangleZ => 1017,
348    PointM => 2001,
349    LineStringM => 2002,
350    PolygonM => 2003,
351    MultiPointM => 2004,
352    MultiLineStringM => 2005,
353    MultiPolygonM => 2006,
354    GeometryCollectionM => 2007,
355    CircularStringM => 2008,
356    CompoundCurveM => 2009,
357    CurvePolygonM => 2010,
358    MultiCurveM => 2011,
359    MultiSurfaceM => 2012,
360    CurveM => 2013,
361    SurfaceM => 2014,
362    PolyhedralSurfaceM => 2015,
363    TINM => 2016,
364    TriangleM => 2017,
365    PointZM => 3001,
366    LineStringZM => 3002,
367    PolygonZM => 3003,
368    MultiPointZM => 3004,
369    MultiLineStringZM => 3005,
370    MultiPolygonZM => 3006,
371    GeometryCollectionZM => 3007,
372    CircularStringZM => 3008,
373    CompoundCurveZM => 3009,
374    CurvePolygonZM => 3010,
375    MultiCurveZM => 3011,
376    MultiSurfaceZM => 3012,
377    CurveZM => 3013,
378    SurfaceZM => 3014,
379    PolyhedralSurfaceZM => 3015,
380    TINZM => 3016,
381    TriangleZM => 3017,
382    Point25D => 0x80000001,
383    LineString25D => 0x80000002,
384    Polygon25D => 0x80000003,
385    MultiPoint25D => 0x80000004,
386    MultiLineString25D => 0x80000005,
387    MultiPolygon25D => 0x80000006,
388    GeometryCollection25D => 0x80000007
389    );
390our %geometry_types_reverse = reverse %geometry_types;
391
392sub GeometryTypes {
393    return sort {$geometry_types{$a} <=> $geometry_types{$b}} keys %geometry_types;
394}
395
396our %geometry_formats = (
397    WKT => 1,
398    );
399
400sub GeometryFormats {
401    return sort {$geometry_formats{$a} <=> $geometry_formats{$b}} keys %geometry_formats;
402}
403
404our %grid_algorithms = (
405    InverseDistanceToAPower => 1,
406    MovingAverage => 2,
407    NearestNeighbor => 3,
408    MetricMinimum => 4,
409    MetricMaximum => 5,
410    MetricRange => 6,
411    MetricCount => 7,
412    MetricAverageDistance => 8,
413    MetricAverageDistancePts => 9,
414    Linear => 10,
415    InverseDistanceToAPowerNearestNeighbor => 11
416    );
417
418sub GridAlgorithms {
419    return sort {$grid_algorithms{$a} <=> $grid_algorithms{$b}} keys %grid_algorithms;
420}
421
422sub isint {
423    my $value = shift;
424    my $b_obj = B::svref_2object(\$value);
425    my $flags = $b_obj->FLAGS;
426    return 1 if $flags & B::SVp_IOK() && !($flags & B::SVp_NOK()) && !($flags & B::SVp_POK());
427}
428
429sub new {
430    my $class = shift;
431
432    return $instance if $instance;
433
434    my $ffi = FFI::Platypus->new;
435    $ffi->load_custom_type('::StringPointer' => 'string_pointer');
436    $ffi->lib(['/usr/local/lib/libgdal.so']);
437
438    $ffi->type('(pointer,size_t,size_t,opaque)->size_t' => 'VSIWriteFunction');
439    $ffi->type('(int,int,string)->void' => 'CPLErrorHandler');
440    $ffi->type('(double,string,pointer)->int' => 'GDALProgressFunc');
441    $ffi->type('(pointer,int, pointer,int,int,unsigned int,unsigned int,int,int)->int' => 'GDALDerivedPixelFunc');
442    $ffi->type('(pointer,int,int,pointer,pointer,pointer,pointer)->int' => 'GDALTransformerFunc');
443    $ffi->type('(double,int,pointer,pointer,pointer)->int' => 'GDALContourWriter');
444
445    # from port/*.h
446    eval{$ffi->attach(VSIMalloc => [qw/uint/] => 'opaque');};
447    croak "Can't attach to GDAL methods. Does Alien::gdal provide GDAL dynamic libs?" unless $class->can('VSIMalloc');
448    eval{$ffi->attach(VSIFree => ['opaque'] => 'void');};
449    eval{$ffi->attach(CPLError => [qw/int int string/] => 'void');};
450    eval{$ffi->attach(VSIFOpenL => [qw/string string/] => 'opaque');};
451    eval{$ffi->attach(VSIFOpenExL => [qw/string string int/] => 'opaque');};
452    eval{$ffi->attach(VSIFCloseL => ['opaque'] => 'int');};
453    eval{$ffi->attach(VSIFWriteL => [qw/opaque uint uint opaque/] => 'uint');};
454    eval{$ffi->attach(VSIFReadL => [qw/opaque uint uint opaque/] => 'uint');};
455    eval{$ffi->attach(VSIIngestFile => [qw/opaque string string_pointer uint64* sint64/] => 'int');};
456    eval{$ffi->attach(VSIMkdir => [qw/string sint64/] => 'int');};
457    eval{$ffi->attach(VSIRmdir => [qw/string/] => 'int');};
458    eval{$ffi->attach(VSIReadDirEx => [qw/string int/] => 'opaque');};
459    eval{$ffi->attach(VSIUnlink => [qw/string/] => 'int');};
460    eval{$ffi->attach(VSIRename => [qw/string string/] => 'int');};
461    eval{$ffi->attach(VSIStdoutSetRedirection => ['VSIWriteFunction', 'opaque'] => 'void');};
462    eval{$ffi->attach(CPLPushErrorHandler => ['CPLErrorHandler'] => 'void');};
463    eval{$ffi->attach(CPLPopErrorHandler => ['CPLErrorHandler'] => 'void');};
464    eval{$ffi->attach(CSLDestroy => ['opaque'] => 'void');};
465    eval{$ffi->attach(CSLAddString => ['opaque', 'string'] => 'opaque');};
466    eval{$ffi->attach(CSLCount => ['opaque'] => 'int');};
467    eval{$ffi->attach(CSLGetField => ['opaque', 'int'] => 'string');};
468    eval{$ffi->attach(CPLGetConfigOption => ['string', 'string']  => 'string');};
469    eval{$ffi->attach(CPLSetConfigOption => ['string', 'string']  => 'void');};
470    eval{$ffi->attach(CPLFindFile => ['string', 'string']  => 'string');};
471    eval{$ffi->attach(CPLPushFinderLocation => ['string'] => 'void');};
472    eval{$ffi->attach(CPLPopFinderLocation => [] => 'void');};
473    eval{$ffi->attach(CPLFinderClean => [] => 'void');};
474
475    # from ogr_core.h
476    eval{$ffi->attach( 'OGR_GT_Flatten' => ['unsigned int'] => 'unsigned int');};
477
478# generated with parse_h.pl
479# from gcore/gdal.h
480eval{$ffi->attach('GDALGetDataTypeSize' => ['unsigned int'] => 'int');};
481eval{$ffi->attach('GDALGetDataTypeSizeBits' => ['unsigned int'] => 'int');};
482eval{$ffi->attach('GDALGetDataTypeSizeBytes' => ['unsigned int'] => 'int');};
483eval{$ffi->attach('GDALDataTypeIsComplex' => ['unsigned int'] => 'int');};
484eval{$ffi->attach('GDALDataTypeIsInteger' => ['unsigned int'] => 'int');};
485eval{$ffi->attach('GDALDataTypeIsFloating' => ['unsigned int'] => 'int');};
486eval{$ffi->attach('GDALDataTypeIsSigned' => ['unsigned int'] => 'int');};
487eval{$ffi->attach('GDALGetDataTypeName' => ['unsigned int'] => 'string');};
488eval{$ffi->attach('GDALGetDataTypeByName' => [qw/string/] => 'unsigned int');};
489eval{$ffi->attach('GDALDataTypeUnion' => ['unsigned int','unsigned int'] => 'unsigned int');};
490eval{$ffi->attach('GDALDataTypeUnionWithValue' => ['unsigned int','double','int'] => 'unsigned int');};
491eval{$ffi->attach('GDALFindDataType' => [qw/int int int int/] => 'unsigned int');};
492eval{$ffi->attach('GDALFindDataTypeForValue' => [qw/double int/] => 'unsigned int');};
493eval{$ffi->attach('GDALAdjustValueToDataType' => ['unsigned int','double','int*','int*'] => 'double');};
494eval{$ffi->attach('GDALGetNonComplexDataType' => ['unsigned int'] => 'unsigned int');};
495eval{$ffi->attach('GDALDataTypeIsConversionLossy' => ['unsigned int','unsigned int'] => 'int');};
496eval{$ffi->attach('GDALGetAsyncStatusTypeName' => ['unsigned int'] => 'string');};
497eval{$ffi->attach('GDALGetAsyncStatusTypeByName' => [qw/string/] => 'unsigned int');};
498eval{$ffi->attach('GDALGetColorInterpretationName' => ['unsigned int'] => 'string');};
499eval{$ffi->attach('GDALGetColorInterpretationByName' => [qw/string/] => 'unsigned int');};
500eval{$ffi->attach('GDALGetPaletteInterpretationName' => ['unsigned int'] => 'string');};
501eval{$ffi->attach('GDALAllRegister' => [] => 'void');};
502eval{$ffi->attach('GDALCreate' => ['opaque','string','int','int','int','unsigned int','opaque'] => 'opaque');};
503eval{$ffi->attach('GDALCreateCopy' => [qw/opaque string opaque int opaque GDALProgressFunc opaque/] => 'opaque');};
504eval{$ffi->attach('GDALIdentifyDriver' => [qw/string opaque/] => 'opaque');};
505eval{$ffi->attach('GDALIdentifyDriverEx' => ['string','unsigned int','opaque','opaque'] => 'opaque');};
506eval{$ffi->attach('GDALOpen' => ['string','unsigned int'] => 'opaque');};
507eval{$ffi->attach('GDALOpenShared' => ['string','unsigned int'] => 'opaque');};
508eval{$ffi->attach('GDALOpenEx' => ['string','unsigned int','opaque','opaque','opaque'] => 'opaque');};
509eval{$ffi->attach('GDALDumpOpenDatasets' => [qw/opaque/] => 'int');};
510eval{$ffi->attach('GDALGetDriverByName' => [qw/string/] => 'opaque');};
511eval{$ffi->attach('GDALGetDriverCount' => [] => 'int');};
512eval{$ffi->attach('GDALGetDriver' => [qw/int/] => 'opaque');};
513eval{$ffi->attach('GDALCreateDriver' => [] => 'opaque');};
514eval{$ffi->attach('GDALDestroyDriver' => [qw/opaque/] => 'void');};
515eval{$ffi->attach('GDALRegisterDriver' => [qw/opaque/] => 'int');};
516eval{$ffi->attach('GDALDeregisterDriver' => [qw/opaque/] => 'void');};
517eval{$ffi->attach('GDALDestroyDriverManager' => [] => 'void');};
518eval{$ffi->attach('GDALDestroy' => [] => 'void');};
519eval{$ffi->attach('GDALDeleteDataset' => [qw/opaque string/] => 'int');};
520eval{$ffi->attach('GDALRenameDataset' => [qw/opaque string string/] => 'int');};
521eval{$ffi->attach('GDALCopyDatasetFiles' => [qw/opaque string string/] => 'int');};
522eval{$ffi->attach('GDALValidateCreationOptions' => [qw/opaque opaque/] => 'int');};
523eval{$ffi->attach('GDALGetDriverShortName' => [qw/opaque/] => 'string');};
524eval{$ffi->attach('GDALGetDriverLongName' => [qw/opaque/] => 'string');};
525eval{$ffi->attach('GDALGetDriverHelpTopic' => [qw/opaque/] => 'string');};
526eval{$ffi->attach('GDALGetDriverCreationOptionList' => [qw/opaque/] => 'string');};
527eval{$ffi->attach('GDALInitGCPs' => [qw/int opaque/] => 'void');};
528eval{$ffi->attach('GDALDeinitGCPs' => [qw/int opaque/] => 'void');};
529eval{$ffi->attach('GDALDuplicateGCPs' => [qw/int opaque/] => 'opaque');};
530eval{$ffi->attach('GDALGCPsToGeoTransform' => [qw/int opaque double* int/] => 'int');};
531eval{$ffi->attach('GDALInvGeoTransform' => [qw/double* double*/] => 'int');};
532eval{$ffi->attach('GDALApplyGeoTransform' => [qw/double* double double double* double*/] => 'void');};
533eval{$ffi->attach('GDALComposeGeoTransforms' => [qw/double* double* double*/] => 'void');};
534eval{$ffi->attach('GDALGetMetadataDomainList' => [qw/opaque/] => 'opaque');};
535eval{$ffi->attach('GDALGetMetadata' => [qw/opaque string/] => 'opaque');};
536eval{$ffi->attach('GDALSetMetadata' => [qw/opaque opaque string/] => 'int');};
537eval{$ffi->attach('GDALGetMetadataItem' => [qw/opaque string string/] => 'string');};
538eval{$ffi->attach('GDALSetMetadataItem' => [qw/opaque string string string/] => 'int');};
539eval{$ffi->attach('GDALGetDescription' => [qw/opaque/] => 'string');};
540eval{$ffi->attach('GDALSetDescription' => [qw/opaque string/] => 'void');};
541eval{$ffi->attach('GDALGetDatasetDriver' => [qw/opaque/] => 'opaque');};
542eval{$ffi->attach('GDALGetFileList' => [qw/opaque/] => 'opaque');};
543eval{$ffi->attach('GDALClose' => [qw/opaque/] => 'void');};
544eval{$ffi->attach('GDALGetRasterXSize' => [qw/opaque/] => 'int');};
545eval{$ffi->attach('GDALGetRasterYSize' => [qw/opaque/] => 'int');};
546eval{$ffi->attach('GDALGetRasterCount' => [qw/opaque/] => 'int');};
547eval{$ffi->attach('GDALGetRasterBand' => [qw/opaque int/] => 'opaque');};
548eval{$ffi->attach('GDALAddBand' => ['opaque','unsigned int','opaque'] => 'int');};
549eval{$ffi->attach('GDALBeginAsyncReader' => ['opaque','int','int','int','int','opaque','int','int','unsigned int','int','int*','int','int','int','opaque'] => 'opaque');};
550eval{$ffi->attach('GDALEndAsyncReader' => [qw/opaque opaque/] => 'void');};
551eval{$ffi->attach('GDALDatasetRasterIO' => ['opaque','unsigned int','int','int','int','int','opaque','int','int','unsigned int','int','int*','int','int','int'] => 'int');};
552eval{$ffi->attach('GDALDatasetRasterIOEx' => ['opaque','unsigned int','int','int','int','int','opaque','int','int','unsigned int','int','int*','sint64','sint64','sint64','opaque'] => 'int');};
553eval{$ffi->attach('GDALDatasetAdviseRead' => ['opaque','int','int','int','int','int','int','unsigned int','int','int*','opaque'] => 'int');};
554eval{$ffi->attach('GDALGetProjectionRef' => [qw/opaque/] => 'string');};
555eval{$ffi->attach('GDALGetSpatialRef' => [qw/opaque/] => 'opaque');};
556eval{$ffi->attach('GDALSetProjection' => [qw/opaque string/] => 'int');};
557eval{$ffi->attach('GDALSetSpatialRef' => [qw/opaque opaque/] => 'int');};
558eval{$ffi->attach('GDALGetGeoTransform' => [qw/opaque double[6]/] => 'int');};
559eval{$ffi->attach('GDALSetGeoTransform' => [qw/opaque double[6]/] => 'int');};
560eval{$ffi->attach('GDALGetGCPCount' => [qw/opaque/] => 'int');};
561eval{$ffi->attach('GDALGetGCPProjection' => [qw/opaque/] => 'string');};
562eval{$ffi->attach('GDALGetGCPSpatialRef' => [qw/opaque/] => 'opaque');};
563eval{$ffi->attach('GDALGetGCPs' => [qw/opaque/] => 'opaque');};
564eval{$ffi->attach('GDALSetGCPs' => [qw/opaque int opaque string/] => 'int');};
565eval{$ffi->attach('GDALSetGCPs2' => [qw/opaque int opaque opaque/] => 'int');};
566eval{$ffi->attach('GDALGetInternalHandle' => [qw/opaque string/] => 'opaque');};
567eval{$ffi->attach('GDALReferenceDataset' => [qw/opaque/] => 'int');};
568eval{$ffi->attach('GDALDereferenceDataset' => [qw/opaque/] => 'int');};
569eval{$ffi->attach('GDALReleaseDataset' => [qw/opaque/] => 'int');};
570eval{$ffi->attach('GDALBuildOverviews' => [qw/opaque string int int* int int* GDALProgressFunc opaque/] => 'int');};
571eval{$ffi->attach('GDALGetOpenDatasets' => [qw/uint64* int*/] => 'void');};
572eval{$ffi->attach('GDALGetAccess' => [qw/opaque/] => 'int');};
573eval{$ffi->attach('GDALFlushCache' => [qw/opaque/] => 'void');};
574eval{$ffi->attach('GDALCreateDatasetMaskBand' => [qw/opaque int/] => 'int');};
575eval{$ffi->attach('GDALDatasetCopyWholeRaster' => [qw/opaque opaque opaque GDALProgressFunc opaque/] => 'int');};
576eval{$ffi->attach('GDALRasterBandCopyWholeRaster' => [qw/opaque opaque string_pointer GDALProgressFunc opaque/] => 'int');};
577eval{$ffi->attach('GDALRegenerateOverviews' => [qw/opaque int uint64* string GDALProgressFunc opaque/] => 'int');};
578eval{$ffi->attach('GDALDatasetGetLayerCount' => [qw/opaque/] => 'int');};
579eval{$ffi->attach('GDALDatasetGetLayer' => [qw/opaque int/] => 'opaque');};
580eval{$ffi->attach('GDALDatasetGetLayerByName' => [qw/opaque string/] => 'opaque');};
581eval{$ffi->attach('GDALDatasetDeleteLayer' => [qw/opaque int/] => 'int');};
582eval{$ffi->attach('GDALDatasetCreateLayer' => ['opaque','string','opaque','unsigned int','opaque'] => 'opaque');};
583eval{$ffi->attach('GDALDatasetCopyLayer' => [qw/opaque opaque string opaque/] => 'opaque');};
584eval{$ffi->attach('GDALDatasetResetReading' => [qw/opaque/] => 'void');};
585eval{$ffi->attach('GDALDatasetGetNextFeature' => [qw/opaque uint64* double* GDALProgressFunc opaque/] => 'opaque');};
586eval{$ffi->attach('GDALDatasetTestCapability' => [qw/opaque string/] => 'int');};
587eval{$ffi->attach('GDALDatasetExecuteSQL' => [qw/opaque string opaque string/] => 'opaque');};
588eval{$ffi->attach('GDALDatasetAbortSQL' => [qw/opaque/] => 'int');};
589eval{$ffi->attach('GDALDatasetReleaseResultSet' => [qw/opaque opaque/] => 'void');};
590eval{$ffi->attach('GDALDatasetGetStyleTable' => [qw/opaque/] => 'opaque');};
591eval{$ffi->attach('GDALDatasetSetStyleTableDirectly' => [qw/opaque opaque/] => 'void');};
592eval{$ffi->attach('GDALDatasetSetStyleTable' => [qw/opaque opaque/] => 'void');};
593eval{$ffi->attach('GDALDatasetStartTransaction' => [qw/opaque int/] => 'int');};
594eval{$ffi->attach('GDALDatasetCommitTransaction' => [qw/opaque/] => 'int');};
595eval{$ffi->attach('GDALDatasetRollbackTransaction' => [qw/opaque/] => 'int');};
596eval{$ffi->attach('GDALDatasetClearStatistics' => [qw/opaque/] => 'void');};
597eval{$ffi->attach('GDALGetRasterDataType' => [qw/opaque/] => 'unsigned int');};
598eval{$ffi->attach('GDALGetBlockSize' => [qw/opaque int* int*/] => 'void');};
599eval{$ffi->attach('GDALGetActualBlockSize' => [qw/opaque int int int* int*/] => 'int');};
600eval{$ffi->attach('GDALRasterAdviseRead' => ['opaque','int','int','int','int','int','int','unsigned int','opaque'] => 'int');};
601eval{$ffi->attach('GDALRasterIO' => ['opaque','unsigned int','int','int','int','int','opaque','int','int','unsigned int','int','int'] => 'int');};
602eval{$ffi->attach('GDALRasterIOEx' => ['opaque','unsigned int','int','int','int','int','opaque','int','int','unsigned int','sint64','sint64','opaque'] => 'int');};
603eval{$ffi->attach('GDALReadBlock' => [qw/opaque int int opaque/] => 'int');};
604eval{$ffi->attach('GDALWriteBlock' => [qw/opaque int int opaque/] => 'int');};
605eval{$ffi->attach('GDALGetRasterBandXSize' => [qw/opaque/] => 'int');};
606eval{$ffi->attach('GDALGetRasterBandYSize' => [qw/opaque/] => 'int');};
607eval{$ffi->attach('GDALGetRasterAccess' => [qw/opaque/] => 'unsigned int');};
608eval{$ffi->attach('GDALGetBandNumber' => [qw/opaque/] => 'int');};
609eval{$ffi->attach('GDALGetBandDataset' => [qw/opaque/] => 'opaque');};
610eval{$ffi->attach('GDALGetRasterColorInterpretation' => [qw/opaque/] => 'unsigned int');};
611eval{$ffi->attach('GDALSetRasterColorInterpretation' => ['opaque','unsigned int'] => 'int');};
612eval{$ffi->attach('GDALGetRasterColorTable' => [qw/opaque/] => 'opaque');};
613eval{$ffi->attach('GDALSetRasterColorTable' => [qw/opaque opaque/] => 'int');};
614eval{$ffi->attach('GDALHasArbitraryOverviews' => [qw/opaque/] => 'int');};
615eval{$ffi->attach('GDALGetOverviewCount' => [qw/opaque/] => 'int');};
616eval{$ffi->attach('GDALGetOverview' => [qw/opaque int/] => 'opaque');};
617eval{$ffi->attach('GDALGetRasterNoDataValue' => [qw/opaque int*/] => 'double');};
618eval{$ffi->attach('GDALSetRasterNoDataValue' => [qw/opaque double/] => 'int');};
619eval{$ffi->attach('GDALDeleteRasterNoDataValue' => [qw/opaque/] => 'int');};
620eval{$ffi->attach('GDALGetRasterCategoryNames' => [qw/opaque/] => 'opaque');};
621eval{$ffi->attach('GDALSetRasterCategoryNames' => [qw/opaque opaque/] => 'int');};
622eval{$ffi->attach('GDALGetRasterMinimum' => [qw/opaque int*/] => 'double');};
623eval{$ffi->attach('GDALGetRasterMaximum' => [qw/opaque int*/] => 'double');};
624eval{$ffi->attach('GDALGetRasterStatistics' => [qw/opaque int int double* double* double* double*/] => 'int');};
625eval{$ffi->attach('GDALComputeRasterStatistics' => [qw/opaque int double* double* double* double* GDALProgressFunc opaque/] => 'int');};
626eval{$ffi->attach('GDALSetRasterStatistics' => [qw/opaque double double double double/] => 'int');};
627eval{$ffi->attach('GDALRasterBandAsMDArray' => [qw/opaque/] => 'opaque');};
628eval{$ffi->attach('GDALGetRasterUnitType' => [qw/opaque/] => 'string');};
629eval{$ffi->attach('GDALSetRasterUnitType' => [qw/opaque string/] => 'int');};
630eval{$ffi->attach('GDALGetRasterOffset' => [qw/opaque int*/] => 'double');};
631eval{$ffi->attach('GDALSetRasterOffset' => [qw/opaque double/] => 'int');};
632eval{$ffi->attach('GDALGetRasterScale' => [qw/opaque int*/] => 'double');};
633eval{$ffi->attach('GDALSetRasterScale' => [qw/opaque double/] => 'int');};
634eval{$ffi->attach('GDALComputeRasterMinMax' => [qw/opaque int double/] => 'void');};
635eval{$ffi->attach('GDALFlushRasterCache' => [qw/opaque/] => 'int');};
636eval{$ffi->attach('GDALGetRasterHistogram' => [qw/opaque double double int int* int int GDALProgressFunc opaque/] => 'int');};
637eval{$ffi->attach('GDALGetRasterHistogramEx' => [qw/opaque double double int uint64* int int GDALProgressFunc opaque/] => 'int');};
638eval{$ffi->attach('GDALGetDefaultHistogram' => [qw/opaque double* double* int* int* int GDALProgressFunc opaque/] => 'int');};
639eval{$ffi->attach('GDALGetDefaultHistogramEx' => [qw/opaque double* double* int* uint64* int GDALProgressFunc opaque/] => 'int');};
640eval{$ffi->attach('GDALSetDefaultHistogram' => [qw/opaque double double int int*/] => 'int');};
641eval{$ffi->attach('GDALSetDefaultHistogramEx' => [qw/opaque double double int uint64*/] => 'int');};
642eval{$ffi->attach('GDALGetRandomRasterSample' => [qw/opaque int float*/] => 'int');};
643eval{$ffi->attach('GDALGetRasterSampleOverview' => [qw/opaque int/] => 'opaque');};
644eval{$ffi->attach('GDALGetRasterSampleOverviewEx' => [qw/opaque uint64/] => 'opaque');};
645eval{$ffi->attach('GDALFillRaster' => [qw/opaque double double/] => 'int');};
646eval{$ffi->attach('GDALComputeBandStats' => [qw/opaque int double* double* GDALProgressFunc opaque/] => 'int');};
647eval{$ffi->attach('GDALOverviewMagnitudeCorrection' => [qw/opaque int uint64* GDALProgressFunc opaque/] => 'int');};
648eval{$ffi->attach('GDALGetDefaultRAT' => [qw/opaque/] => 'opaque');};
649eval{$ffi->attach('GDALSetDefaultRAT' => [qw/opaque opaque/] => 'int');};
650eval{$ffi->attach('GDALAddDerivedBandPixelFunc' => [qw/string GDALDerivedPixelFunc/] => 'int');};
651eval{$ffi->attach('GDALGetMaskBand' => [qw/opaque/] => 'opaque');};
652eval{$ffi->attach('GDALGetMaskFlags' => [qw/opaque/] => 'int');};
653eval{$ffi->attach('GDALCreateMaskBand' => [qw/opaque int/] => 'int');};
654eval{$ffi->attach('GDALGetDataCoverageStatus' => [qw/opaque int int int int int double*/] => 'int');};
655eval{$ffi->attach('GDALARGetNextUpdatedRegion' => [qw/opaque double int* int* int* int*/] => 'unsigned int');};
656eval{$ffi->attach('GDALARLockBuffer' => [qw/opaque double/] => 'int');};
657eval{$ffi->attach('GDALARUnlockBuffer' => [qw/opaque/] => 'void');};
658eval{$ffi->attach('GDALGeneralCmdLineProcessor' => [qw/int string_pointer int/] => 'int');};
659eval{$ffi->attach('GDALSwapWords' => [qw/opaque int int int/] => 'void');};
660eval{$ffi->attach('GDALSwapWordsEx' => [qw/opaque int size_t int/] => 'void');};
661eval{$ffi->attach('GDALCopyWords' => ['opaque','unsigned int','int','opaque','unsigned int','int','int'] => 'void');};
662eval{$ffi->attach('GDALCopyWords64' => ['opaque','unsigned int','int','opaque','unsigned int','int','int'] => 'void');};
663eval{$ffi->attach('GDALCopyBits' => [qw/pointer int int pointer int int int int/] => 'void');};
664eval{$ffi->attach('GDALLoadWorldFile' => [qw/string double*/] => 'int');};
665eval{$ffi->attach('GDALReadWorldFile' => [qw/string string double*/] => 'int');};
666eval{$ffi->attach('GDALWriteWorldFile' => [qw/string string double*/] => 'int');};
667eval{$ffi->attach('GDALLoadTabFile' => [qw/string double* string_pointer int* opaque/] => 'int');};
668eval{$ffi->attach('GDALReadTabFile' => [qw/string double* string_pointer int* opaque/] => 'int');};
669eval{$ffi->attach('GDALLoadOziMapFile' => [qw/string double* string_pointer int* opaque/] => 'int');};
670eval{$ffi->attach('GDALReadOziMapFile' => [qw/string double* string_pointer int* opaque/] => 'int');};
671eval{$ffi->attach('GDALDecToDMS' => [qw/double string int/] => 'string');};
672eval{$ffi->attach('GDALPackedDMSToDec' => [qw/double/] => 'double');};
673eval{$ffi->attach('GDALDecToPackedDMS' => [qw/double/] => 'double');};
674eval{$ffi->attach('GDALVersionInfo' => [qw/string/] => 'string');};
675eval{$ffi->attach('GDALCheckVersion' => [qw/int int string/] => 'int');};
676eval{$ffi->attach('GDALExtractRPCInfo' => [qw/opaque opaque/] => 'int');};
677eval{$ffi->attach('GDALCreateColorTable' => ['unsigned int'] => 'opaque');};
678eval{$ffi->attach('GDALDestroyColorTable' => [qw/opaque/] => 'void');};
679eval{$ffi->attach('GDALCloneColorTable' => [qw/opaque/] => 'opaque');};
680eval{$ffi->attach('GDALGetPaletteInterpretation' => [qw/opaque/] => 'unsigned int');};
681eval{$ffi->attach('GDALGetColorEntryCount' => [qw/opaque/] => 'int');};
682eval{$ffi->attach('GDALGetColorEntry' => [qw/opaque int/] => 'short[4]');};
683eval{$ffi->attach('GDALGetColorEntryAsRGB' => [qw/opaque int short[4]/] => 'int');};
684eval{$ffi->attach('GDALSetColorEntry' => [qw/opaque int short[4]/] => 'void');};
685eval{$ffi->attach('GDALCreateColorRamp' => [qw/opaque int short[4] int short[4]/] => 'void');};
686eval{$ffi->attach('GDALCreateRasterAttributeTable' => [] => 'opaque');};
687eval{$ffi->attach('GDALDestroyRasterAttributeTable' => [qw/opaque/] => 'void');};
688eval{$ffi->attach('GDALRATGetColumnCount' => [qw/opaque/] => 'int');};
689eval{$ffi->attach('GDALRATGetNameOfCol' => [qw/opaque int/] => 'string');};
690eval{$ffi->attach('GDALRATGetUsageOfCol' => [qw/opaque int/] => 'unsigned int');};
691eval{$ffi->attach('GDALRATGetTypeOfCol' => [qw/opaque int/] => 'unsigned int');};
692eval{$ffi->attach('GDALRATGetColOfUsage' => ['opaque','unsigned int'] => 'int');};
693eval{$ffi->attach('GDALRATGetRowCount' => [qw/opaque/] => 'int');};
694eval{$ffi->attach('GDALRATGetValueAsString' => [qw/opaque int int/] => 'string');};
695eval{$ffi->attach('GDALRATGetValueAsInt' => [qw/opaque int int/] => 'int');};
696eval{$ffi->attach('GDALRATGetValueAsDouble' => [qw/opaque int int/] => 'double');};
697eval{$ffi->attach('GDALRATSetValueAsString' => [qw/opaque int int string/] => 'void');};
698eval{$ffi->attach('GDALRATSetValueAsInt' => [qw/opaque int int int/] => 'void');};
699eval{$ffi->attach('GDALRATSetValueAsDouble' => [qw/opaque int int double/] => 'void');};
700eval{$ffi->attach('GDALRATChangesAreWrittenToFile' => [qw/opaque/] => 'int');};
701eval{$ffi->attach('GDALRATValuesIOAsDouble' => ['opaque','unsigned int','int','int','int','double*'] => 'int');};
702eval{$ffi->attach('GDALRATValuesIOAsInteger' => ['opaque','unsigned int','int','int','int','int*'] => 'int');};
703eval{$ffi->attach('GDALRATValuesIOAsString' => ['opaque','unsigned int','int','int','int','opaque'] => 'int');};
704eval{$ffi->attach('GDALRATSetRowCount' => [qw/opaque int/] => 'void');};
705eval{$ffi->attach('GDALRATCreateColumn' => ['opaque','string','unsigned int','unsigned int'] => 'int');};
706eval{$ffi->attach('GDALRATSetLinearBinning' => [qw/opaque double double/] => 'int');};
707eval{$ffi->attach('GDALRATGetLinearBinning' => [qw/opaque double* double*/] => 'int');};
708eval{$ffi->attach('GDALRATSetTableType' => ['opaque','unsigned int'] => 'int');};
709eval{$ffi->attach('GDALRATGetTableType' => [qw/opaque/] => 'unsigned int');};
710eval{$ffi->attach('GDALRATInitializeFromColorTable' => [qw/opaque opaque/] => 'int');};
711eval{$ffi->attach('GDALRATTranslateToColorTable' => [qw/opaque int/] => 'opaque');};
712eval{$ffi->attach('GDALRATDumpReadable' => [qw/opaque opaque/] => 'void');};
713eval{$ffi->attach('GDALRATClone' => [qw/opaque/] => 'opaque');};
714eval{$ffi->attach('GDALRATSerializeJSON' => [qw/opaque/] => 'opaque');};
715eval{$ffi->attach('GDALRATGetRowOfValue' => [qw/opaque double/] => 'int');};
716eval{$ffi->attach('GDALRATRemoveStatistics' => [qw/opaque/] => 'void');};
717eval{$ffi->attach('GDALSetCacheMax' => [qw/int/] => 'void');};
718eval{$ffi->attach('GDALGetCacheMax' => [] => 'int');};
719eval{$ffi->attach('GDALGetCacheUsed' => [] => 'int');};
720eval{$ffi->attach('GDALSetCacheMax64' => [qw/sint64/] => 'void');};
721eval{$ffi->attach('GDALGetCacheMax64' => [] => 'sint64');};
722eval{$ffi->attach('GDALGetCacheUsed64' => [] => 'sint64');};
723eval{$ffi->attach('GDALFlushCacheBlock' => [] => 'int');};
724eval{$ffi->attach('GDALDatasetGetVirtualMem' => ['opaque','unsigned int','int','int','int','int','int','int','unsigned int','int','int*','int','sint64','sint64','size_t','size_t','int','opaque'] => 'opaque');};
725eval{$ffi->attach('GDALRasterBandGetVirtualMem' => ['opaque','unsigned int','int','int','int','int','int','int','unsigned int','int','sint64','size_t','size_t','int','opaque'] => 'opaque');};
726eval{$ffi->attach('GDALGetVirtualMemAuto' => ['opaque','unsigned int','int*','sint64*','opaque'] => 'opaque');};
727eval{$ffi->attach('GDALDatasetGetTiledVirtualMem' => ['opaque','unsigned int','int','int','int','int','int','int','unsigned int','int','int*','unsigned int','size_t','int','opaque'] => 'opaque');};
728eval{$ffi->attach('GDALRasterBandGetTiledVirtualMem' => ['opaque','unsigned int','int','int','int','int','int','int','unsigned int','size_t','int','opaque'] => 'opaque');};
729eval{$ffi->attach('GDALCreatePansharpenedVRT' => [qw/string opaque int uint64*/] => 'opaque');};
730eval{$ffi->attach('GDALGetJPEG2000Structure' => [qw/string opaque/] => 'opaque');};
731eval{$ffi->attach('GDALCreateMultiDimensional' => [qw/opaque string opaque opaque/] => 'opaque');};
732eval{$ffi->attach('GDALExtendedDataTypeCreate' => ['unsigned int'] => 'opaque');};
733eval{$ffi->attach('GDALExtendedDataTypeCreateString' => [qw/size_t/] => 'opaque');};
734eval{$ffi->attach('GDALExtendedDataTypeCreateCompound' => [qw/string size_t size_t opaque/] => 'opaque');};
735eval{$ffi->attach('GDALExtendedDataTypeRelease' => [qw/opaque/] => 'void');};
736eval{$ffi->attach('GDALExtendedDataTypeGetName' => [qw/opaque/] => 'string');};
737eval{$ffi->attach('GDALExtendedDataTypeGetClass' => [qw/opaque/] => 'int');};
738eval{$ffi->attach('GDALExtendedDataTypeGetNumericDataType' => [qw/opaque/] => 'unsigned int');};
739eval{$ffi->attach('GDALExtendedDataTypeGetSize' => [qw/opaque/] => 'size_t');};
740eval{$ffi->attach('GDALExtendedDataTypeGetMaxStringLength' => [qw/opaque/] => 'size_t');};
741eval{$ffi->attach('GDALExtendedDataTypeGetComponents' => [qw/opaque size_t/] => 'uint64*');};
742eval{$ffi->attach('GDALExtendedDataTypeFreeComponents' => [qw/uint64* size_t/] => 'void');};
743eval{$ffi->attach('GDALExtendedDataTypeCanConvertTo' => [qw/opaque opaque/] => 'int');};
744eval{$ffi->attach('GDALExtendedDataTypeEquals' => [qw/opaque opaque/] => 'int');};
745eval{$ffi->attach('GDALEDTComponentCreate' => [qw/string size_t opaque/] => 'opaque');};
746eval{$ffi->attach('GDALEDTComponentRelease' => [qw/opaque/] => 'void');};
747eval{$ffi->attach('GDALEDTComponentGetName' => [qw/opaque/] => 'string');};
748eval{$ffi->attach('GDALEDTComponentGetOffset' => [qw/opaque/] => 'size_t');};
749eval{$ffi->attach('GDALEDTComponentGetType' => [qw/opaque/] => 'opaque');};
750eval{$ffi->attach('GDALDatasetGetRootGroup' => [qw/opaque/] => 'opaque');};
751eval{$ffi->attach('GDALGroupRelease' => [qw/opaque/] => 'void');};
752eval{$ffi->attach('GDALGroupGetName' => [qw/opaque/] => 'string');};
753eval{$ffi->attach('GDALGroupGetFullName' => [qw/opaque/] => 'string');};
754eval{$ffi->attach('GDALGroupGetMDArrayNames' => [qw/opaque opaque/] => 'string_pointer');};
755eval{$ffi->attach('GDALGroupOpenMDArray' => [qw/opaque string opaque/] => 'opaque');};
756eval{$ffi->attach('GDALGroupOpenMDArrayFromFullname' => [qw/opaque string opaque/] => 'opaque');};
757eval{$ffi->attach('GDALGroupResolveMDArray' => [qw/opaque string string opaque/] => 'opaque');};
758eval{$ffi->attach('GDALGroupGetGroupNames' => [qw/opaque opaque/] => 'string_pointer');};
759eval{$ffi->attach('GDALGroupOpenGroup' => [qw/opaque string opaque/] => 'opaque');};
760eval{$ffi->attach('GDALGroupOpenGroupFromFullname' => [qw/opaque string opaque/] => 'opaque');};
761eval{$ffi->attach('GDALGroupGetDimensions' => [qw/opaque size_t opaque/] => 'uint64*');};
762eval{$ffi->attach('GDALGroupGetAttribute' => [qw/opaque string/] => 'opaque');};
763eval{$ffi->attach('GDALGroupGetAttributes' => [qw/opaque size_t opaque/] => 'uint64*');};
764eval{$ffi->attach('GDALGroupGetStructuralInfo' => [qw/opaque/] => 'opaque');};
765eval{$ffi->attach('GDALGroupCreateGroup' => [qw/opaque string opaque/] => 'opaque');};
766eval{$ffi->attach('GDALGroupCreateDimension' => [qw/opaque string string string uint64 opaque/] => 'opaque');};
767eval{$ffi->attach('GDALGroupCreateMDArray' => [qw/opaque string size_t uint64* opaque opaque/] => 'opaque');};
768eval{$ffi->attach('GDALGroupCreateAttribute' => [qw/opaque string size_t uint64* opaque opaque/] => 'opaque');};
769eval{$ffi->attach('GDALMDArrayRelease' => [qw/opaque/] => 'void');};
770eval{$ffi->attach('GDALMDArrayGetName' => [qw/opaque/] => 'string');};
771eval{$ffi->attach('GDALMDArrayGetFullName' => [qw/opaque/] => 'string');};
772eval{$ffi->attach('GDALMDArrayGetTotalElementsCount' => [qw/opaque/] => 'uint64');};
773eval{$ffi->attach('GDALMDArrayGetDimensionCount' => [qw/opaque/] => 'size_t');};
774eval{$ffi->attach('GDALMDArrayGetDimensions' => [qw/opaque size_t/] => 'uint64*');};
775eval{$ffi->attach('GDALMDArrayGetDataType' => [qw/opaque/] => 'opaque');};
776eval{$ffi->attach('GDALMDArrayRead' => [qw/opaque uint64* size_t int64 int* opaque opaque opaque size_t/] => 'int');};
777eval{$ffi->attach('GDALMDArrayWrite' => [qw/opaque uint64* size_t int64 int* opaque opaque opaque size_t/] => 'int');};
778eval{$ffi->attach('GDALMDArrayAdviseRead' => [qw/opaque uint64* size_t/] => 'int');};
779eval{$ffi->attach('GDALMDArrayGetAttribute' => [qw/opaque string/] => 'opaque');};
780eval{$ffi->attach('GDALMDArrayGetAttributes' => [qw/opaque size_t opaque/] => 'uint64*');};
781eval{$ffi->attach('GDALMDArrayCreateAttribute' => [qw/opaque string size_t uint64* opaque opaque/] => 'opaque');};
782eval{$ffi->attach('GDALMDArrayGetRawNoDataValue' => [qw/opaque/] => 'opaque');};
783eval{$ffi->attach('GDALMDArrayGetNoDataValueAsDouble' => [qw/opaque int*/] => 'double');};
784eval{$ffi->attach('GDALMDArraySetRawNoDataValue' => [qw/opaque opaque/] => 'int');};
785eval{$ffi->attach('GDALMDArraySetNoDataValueAsDouble' => [qw/opaque double/] => 'int');};
786eval{$ffi->attach('GDALMDArraySetScale' => [qw/opaque double/] => 'int');};
787eval{$ffi->attach('GDALMDArrayGetScale' => [qw/opaque int*/] => 'double');};
788eval{$ffi->attach('GDALMDArraySetOffset' => [qw/opaque double/] => 'int');};
789eval{$ffi->attach('GDALMDArrayGetOffset' => [qw/opaque int*/] => 'double');};
790eval{$ffi->attach('GDALMDArrayGetBlockSize' => [qw/opaque size_t/] => 'uint64');};
791eval{$ffi->attach('GDALMDArraySetUnit' => [qw/opaque string/] => 'int');};
792eval{$ffi->attach('GDALMDArrayGetUnit' => [qw/opaque/] => 'string');};
793eval{$ffi->attach('GDALMDArraySetSpatialRef' => [qw/opaque opaque/] => 'int');};
794eval{$ffi->attach('GDALMDArrayGetSpatialRef' => [qw/opaque/] => 'opaque');};
795eval{$ffi->attach('GDALMDArrayGetProcessingChunkSize' => [qw/opaque size_t size_t/] => 'size_t');};
796eval{$ffi->attach('GDALMDArrayGetStructuralInfo' => [qw/opaque/] => 'opaque');};
797eval{$ffi->attach('GDALMDArrayGetView' => [qw/opaque string/] => 'opaque');};
798eval{$ffi->attach('GDALMDArrayTranspose' => [qw/opaque size_t int*/] => 'opaque');};
799eval{$ffi->attach('GDALMDArrayGetUnscaled' => [qw/opaque/] => 'opaque');};
800eval{$ffi->attach('GDALMDArrayGetMask' => [qw/opaque opaque/] => 'opaque');};
801eval{$ffi->attach('GDALMDArrayAsClassicDataset' => [qw/opaque size_t size_t/] => 'opaque');};
802eval{$ffi->attach('GDALMDArrayGetStatistics' => [qw/opaque opaque int int double* double* double* double* uint64 GDALProgressFunc opaque/] => 'int');};
803eval{$ffi->attach('GDALMDArrayComputeStatistics' => [qw/opaque opaque int double* double* double* double* uint64 GDALProgressFunc opaque/] => 'int');};
804eval{$ffi->attach('GDALAttributeRelease' => [qw/opaque/] => 'void');};
805eval{$ffi->attach('GDALReleaseAttributes' => [qw/uint64* size_t/] => 'void');};
806eval{$ffi->attach('GDALAttributeGetName' => [qw/opaque/] => 'string');};
807eval{$ffi->attach('GDALAttributeGetFullName' => [qw/opaque/] => 'string');};
808eval{$ffi->attach('GDALAttributeGetTotalElementsCount' => [qw/opaque/] => 'uint64');};
809eval{$ffi->attach('GDALAttributeGetDimensionCount' => [qw/opaque/] => 'size_t');};
810eval{$ffi->attach('GDALAttributeGetDimensionsSize' => [qw/opaque size_t/] => 'uint64');};
811eval{$ffi->attach('GDALAttributeGetDataType' => [qw/opaque/] => 'opaque');};
812eval{$ffi->attach('GDALAttributeReadAsRaw' => [qw/opaque size_t/] => 'pointer');};
813eval{$ffi->attach('GDALAttributeFreeRawResult' => [qw/opaque pointer size_t/] => 'void');};
814eval{$ffi->attach('GDALAttributeReadAsString' => [qw/opaque/] => 'string');};
815eval{$ffi->attach('GDALAttributeReadAsInt' => [qw/opaque/] => 'int');};
816eval{$ffi->attach('GDALAttributeReadAsDouble' => [qw/opaque/] => 'double');};
817eval{$ffi->attach('GDALAttributeReadAsStringArray' => [qw/opaque/] => 'string_pointer');};
818eval{$ffi->attach('GDALAttributeReadAsIntArray' => [qw/opaque size_t/] => 'int*');};
819eval{$ffi->attach('GDALAttributeReadAsDoubleArray' => [qw/opaque size_t/] => 'double*');};
820eval{$ffi->attach('GDALAttributeWriteRaw' => [qw/opaque opaque size_t/] => 'int');};
821eval{$ffi->attach('GDALAttributeWriteString' => [qw/opaque string/] => 'int');};
822eval{$ffi->attach('GDALAttributeWriteStringArray' => [qw/opaque opaque/] => 'int');};
823eval{$ffi->attach('GDALAttributeWriteInt' => [qw/opaque int/] => 'int');};
824eval{$ffi->attach('GDALAttributeWriteDouble' => [qw/opaque double/] => 'int');};
825eval{$ffi->attach('GDALAttributeWriteDoubleArray' => [qw/opaque double* size_t/] => 'int');};
826eval{$ffi->attach('GDALDimensionRelease' => [qw/opaque/] => 'void');};
827eval{$ffi->attach('GDALReleaseDimensions' => [qw/uint64* size_t/] => 'void');};
828eval{$ffi->attach('GDALDimensionGetName' => [qw/opaque/] => 'string');};
829eval{$ffi->attach('GDALDimensionGetFullName' => [qw/opaque/] => 'string');};
830eval{$ffi->attach('GDALDimensionGetType' => [qw/opaque/] => 'string');};
831eval{$ffi->attach('GDALDimensionGetDirection' => [qw/opaque/] => 'string');};
832eval{$ffi->attach('GDALDimensionGetSize' => [qw/opaque/] => 'uint64');};
833eval{$ffi->attach('GDALDimensionGetIndexingVariable' => [qw/opaque/] => 'opaque');};
834eval{$ffi->attach('GDALDimensionSetIndexingVariable' => [qw/opaque opaque/] => 'int');};
835# from ogr/ogr_api.h
836eval{$ffi->attach('OGR_G_CreateFromWkb' => [qw/string opaque uint64* int/] => 'int');};
837eval{$ffi->attach('OGR_G_CreateFromWkt' => [qw/string_pointer opaque uint64*/] => 'int');};
838eval{$ffi->attach('OGR_G_CreateFromFgf' => [qw/string opaque uint64* int int*/] => 'int');};
839eval{$ffi->attach('OGR_G_DestroyGeometry' => [qw/opaque/] => 'void');};
840eval{$ffi->attach('OGR_G_CreateGeometry' => ['unsigned int'] => 'opaque');};
841eval{$ffi->attach('OGR_G_ApproximateArcAngles' => [qw/double double double double double double double double double/] => 'opaque');};
842eval{$ffi->attach('OGR_G_ForceToPolygon' => [qw/opaque/] => 'opaque');};
843eval{$ffi->attach('OGR_G_ForceToLineString' => [qw/opaque/] => 'opaque');};
844eval{$ffi->attach('OGR_G_ForceToMultiPolygon' => [qw/opaque/] => 'opaque');};
845eval{$ffi->attach('OGR_G_ForceToMultiPoint' => [qw/opaque/] => 'opaque');};
846eval{$ffi->attach('OGR_G_ForceToMultiLineString' => [qw/opaque/] => 'opaque');};
847eval{$ffi->attach('OGR_G_ForceTo' => ['opaque','unsigned int','string_pointer'] => 'opaque');};
848eval{$ffi->attach('OGR_G_RemoveLowerDimensionSubGeoms' => [qw/opaque/] => 'opaque');};
849eval{$ffi->attach('OGR_G_GetDimension' => [qw/opaque/] => 'int');};
850eval{$ffi->attach('OGR_G_GetCoordinateDimension' => [qw/opaque/] => 'int');};
851eval{$ffi->attach('OGR_G_CoordinateDimension' => [qw/opaque/] => 'int');};
852eval{$ffi->attach('OGR_G_SetCoordinateDimension' => [qw/opaque int/] => 'void');};
853eval{$ffi->attach('OGR_G_Is3D' => [qw/opaque/] => 'int');};
854eval{$ffi->attach('OGR_G_IsMeasured' => [qw/opaque/] => 'int');};
855eval{$ffi->attach('OGR_G_Set3D' => [qw/opaque int/] => 'void');};
856eval{$ffi->attach('OGR_G_SetMeasured' => [qw/opaque int/] => 'void');};
857eval{$ffi->attach('OGR_G_Clone' => [qw/opaque/] => 'opaque');};
858eval{$ffi->attach('OGR_G_GetEnvelope' => [qw/opaque double[4]/] => 'void');};
859eval{$ffi->attach('OGR_G_GetEnvelope3D' => [qw/opaque double[6]/] => 'void');};
860eval{$ffi->attach('OGR_G_ImportFromWkb' => [qw/opaque string int/] => 'int');};
861eval{$ffi->attach('OGR_G_ExportToWkb' => ['opaque','unsigned int','string'] => 'int');};
862eval{$ffi->attach('OGR_G_ExportToIsoWkb' => ['opaque','unsigned int','string'] => 'int');};
863eval{$ffi->attach('OGR_G_WkbSize' => [qw/opaque/] => 'int');};
864eval{$ffi->attach('OGR_G_ImportFromWkt' => [qw/opaque string_pointer/] => 'int');};
865eval{$ffi->attach('OGR_G_ExportToWkt' => [qw/opaque string_pointer/] => 'int');};
866eval{$ffi->attach('OGR_G_ExportToIsoWkt' => [qw/opaque string_pointer/] => 'int');};
867eval{$ffi->attach('OGR_G_GetGeometryType' => [qw/opaque/] => 'unsigned int');};
868eval{$ffi->attach('OGR_G_GetGeometryName' => [qw/opaque/] => 'string');};
869eval{$ffi->attach('OGR_G_DumpReadable' => [qw/opaque opaque string/] => 'void');};
870eval{$ffi->attach('OGR_G_FlattenTo2D' => [qw/opaque/] => 'void');};
871eval{$ffi->attach('OGR_G_CloseRings' => [qw/opaque/] => 'void');};
872eval{$ffi->attach('OGR_G_CreateFromGML' => [qw/string/] => 'opaque');};
873eval{$ffi->attach('OGR_G_ExportToGML' => [qw/opaque/] => 'opaque');};
874eval{$ffi->attach('OGR_G_ExportToGMLEx' => [qw/opaque opaque/] => 'opaque');};
875eval{$ffi->attach('OGR_G_CreateFromGMLTree' => [qw/opaque/] => 'opaque');};
876eval{$ffi->attach('OGR_G_ExportToGMLTree' => [qw/opaque/] => 'opaque');};
877eval{$ffi->attach('OGR_G_ExportEnvelopeToGMLTree' => [qw/opaque/] => 'opaque');};
878eval{$ffi->attach('OGR_G_ExportToKML' => [qw/opaque string/] => 'opaque');};
879eval{$ffi->attach('OGR_G_ExportToJson' => [qw/opaque/] => 'opaque');};
880eval{$ffi->attach('OGR_G_ExportToJsonEx' => [qw/opaque opaque/] => 'opaque');};
881eval{$ffi->attach('OGR_G_CreateGeometryFromJson' => [qw/string/] => 'opaque');};
882eval{$ffi->attach('OGR_G_CreateGeometryFromEsriJson' => [qw/string/] => 'opaque');};
883eval{$ffi->attach('OGR_G_AssignSpatialReference' => [qw/opaque opaque/] => 'void');};
884eval{$ffi->attach('OGR_G_GetSpatialReference' => [qw/opaque/] => 'opaque');};
885eval{$ffi->attach('OGR_G_Transform' => [qw/opaque opaque/] => 'int');};
886eval{$ffi->attach('OGR_G_TransformTo' => [qw/opaque opaque/] => 'int');};
887eval{$ffi->attach('OGR_GeomTransformer_Create' => [qw/opaque opaque/] => 'opaque');};
888eval{$ffi->attach('OGR_GeomTransformer_Transform' => [qw/opaque opaque/] => 'opaque');};
889eval{$ffi->attach('OGR_GeomTransformer_Destroy' => [qw/opaque/] => 'void');};
890eval{$ffi->attach('OGR_G_Simplify' => [qw/opaque double/] => 'opaque');};
891eval{$ffi->attach('OGR_G_SimplifyPreserveTopology' => [qw/opaque double/] => 'opaque');};
892eval{$ffi->attach('OGR_G_DelaunayTriangulation' => [qw/opaque double int/] => 'opaque');};
893eval{$ffi->attach('OGR_G_Segmentize' => [qw/opaque double/] => 'void');};
894eval{$ffi->attach('OGR_G_Intersects' => [qw/opaque opaque/] => 'int');};
895eval{$ffi->attach('OGR_G_Equals' => [qw/opaque opaque/] => 'int');};
896eval{$ffi->attach('OGR_G_Disjoint' => [qw/opaque opaque/] => 'int');};
897eval{$ffi->attach('OGR_G_Touches' => [qw/opaque opaque/] => 'int');};
898eval{$ffi->attach('OGR_G_Crosses' => [qw/opaque opaque/] => 'int');};
899eval{$ffi->attach('OGR_G_Within' => [qw/opaque opaque/] => 'int');};
900eval{$ffi->attach('OGR_G_Contains' => [qw/opaque opaque/] => 'int');};
901eval{$ffi->attach('OGR_G_Overlaps' => [qw/opaque opaque/] => 'int');};
902eval{$ffi->attach('OGR_G_Boundary' => [qw/opaque/] => 'opaque');};
903eval{$ffi->attach('OGR_G_ConvexHull' => [qw/opaque/] => 'opaque');};
904eval{$ffi->attach('OGR_G_Buffer' => [qw/opaque double int/] => 'opaque');};
905eval{$ffi->attach('OGR_G_Intersection' => [qw/opaque opaque/] => 'opaque');};
906eval{$ffi->attach('OGR_G_Union' => [qw/opaque opaque/] => 'opaque');};
907eval{$ffi->attach('OGR_G_UnionCascaded' => [qw/opaque/] => 'opaque');};
908eval{$ffi->attach('OGR_G_PointOnSurface' => [qw/opaque/] => 'opaque');};
909eval{$ffi->attach('OGR_G_Difference' => [qw/opaque opaque/] => 'opaque');};
910eval{$ffi->attach('OGR_G_SymDifference' => [qw/opaque opaque/] => 'opaque');};
911eval{$ffi->attach('OGR_G_Distance' => [qw/opaque opaque/] => 'double');};
912eval{$ffi->attach('OGR_G_Distance3D' => [qw/opaque opaque/] => 'double');};
913eval{$ffi->attach('OGR_G_Length' => [qw/opaque/] => 'double');};
914eval{$ffi->attach('OGR_G_Area' => [qw/opaque/] => 'double');};
915eval{$ffi->attach('OGR_G_Centroid' => [qw/opaque opaque/] => 'int');};
916eval{$ffi->attach('OGR_G_Value' => [qw/opaque double/] => 'opaque');};
917eval{$ffi->attach('OGR_G_Empty' => [qw/opaque/] => 'void');};
918eval{$ffi->attach('OGR_G_IsEmpty' => [qw/opaque/] => 'int');};
919eval{$ffi->attach('OGR_G_IsValid' => [qw/opaque/] => 'int');};
920eval{$ffi->attach('OGR_G_MakeValid' => [qw/opaque/] => 'opaque');};
921eval{$ffi->attach('OGR_G_IsSimple' => [qw/opaque/] => 'int');};
922eval{$ffi->attach('OGR_G_IsRing' => [qw/opaque/] => 'int');};
923eval{$ffi->attach('OGR_G_Polygonize' => [qw/opaque/] => 'opaque');};
924eval{$ffi->attach('OGR_G_Intersect' => [qw/opaque opaque/] => 'int');};
925eval{$ffi->attach('OGR_G_Equal' => [qw/opaque opaque/] => 'int');};
926eval{$ffi->attach('OGR_G_SymmetricDifference' => [qw/opaque opaque/] => 'opaque');};
927eval{$ffi->attach('OGR_G_GetArea' => [qw/opaque/] => 'double');};
928eval{$ffi->attach('OGR_G_GetBoundary' => [qw/opaque/] => 'opaque');};
929eval{$ffi->attach('OGR_G_GetPointCount' => [qw/opaque/] => 'int');};
930eval{$ffi->attach('OGR_G_GetPoints' => [qw/opaque opaque int opaque int opaque int/] => 'int');};
931eval{$ffi->attach('OGR_G_GetPointsZM' => [qw/opaque opaque int opaque int opaque int opaque int/] => 'int');};
932eval{$ffi->attach('OGR_G_GetX' => [qw/opaque int/] => 'double');};
933eval{$ffi->attach('OGR_G_GetY' => [qw/opaque int/] => 'double');};
934eval{$ffi->attach('OGR_G_GetZ' => [qw/opaque int/] => 'double');};
935eval{$ffi->attach('OGR_G_GetM' => [qw/opaque int/] => 'double');};
936eval{$ffi->attach('OGR_G_GetPoint' => [qw/opaque int double* double* double*/] => 'void');};
937eval{$ffi->attach('OGR_G_GetPointZM' => [qw/opaque int double* double* double* double*/] => 'void');};
938eval{$ffi->attach('OGR_G_SetPointCount' => [qw/opaque int/] => 'void');};
939eval{$ffi->attach('OGR_G_SetPoint' => [qw/opaque int double double double/] => 'void');};
940eval{$ffi->attach('OGR_G_SetPoint_2D' => [qw/opaque int double double/] => 'void');};
941eval{$ffi->attach('OGR_G_SetPointM' => [qw/opaque int double double double/] => 'void');};
942eval{$ffi->attach('OGR_G_SetPointZM' => [qw/opaque int double double double double/] => 'void');};
943eval{$ffi->attach('OGR_G_AddPoint' => [qw/opaque double double double/] => 'void');};
944eval{$ffi->attach('OGR_G_AddPoint_2D' => [qw/opaque double double/] => 'void');};
945eval{$ffi->attach('OGR_G_AddPointM' => [qw/opaque double double double/] => 'void');};
946eval{$ffi->attach('OGR_G_AddPointZM' => [qw/opaque double double double double/] => 'void');};
947eval{$ffi->attach('OGR_G_SetPoints' => [qw/opaque int opaque int opaque int opaque int/] => 'void');};
948eval{$ffi->attach('OGR_G_SetPointsZM' => [qw/opaque int opaque int opaque int opaque int opaque int/] => 'void');};
949eval{$ffi->attach('OGR_G_SwapXY' => [qw/opaque/] => 'void');};
950eval{$ffi->attach('OGR_G_GetGeometryCount' => [qw/opaque/] => 'int');};
951eval{$ffi->attach('OGR_G_GetGeometryRef' => [qw/opaque int/] => 'opaque');};
952eval{$ffi->attach('OGR_G_AddGeometry' => [qw/opaque opaque/] => 'int');};
953eval{$ffi->attach('OGR_G_AddGeometryDirectly' => [qw/opaque opaque/] => 'int');};
954eval{$ffi->attach('OGR_G_RemoveGeometry' => [qw/opaque int int/] => 'int');};
955eval{$ffi->attach('OGR_G_HasCurveGeometry' => [qw/opaque int/] => 'int');};
956eval{$ffi->attach('OGR_G_GetLinearGeometry' => [qw/opaque double string_pointer/] => 'opaque');};
957eval{$ffi->attach('OGR_G_GetCurveGeometry' => [qw/opaque string_pointer/] => 'opaque');};
958eval{$ffi->attach('OGRBuildPolygonFromEdges' => [qw/opaque int int double int*/] => 'opaque');};
959eval{$ffi->attach('OGRSetGenerate_DB2_V72_BYTE_ORDER' => [qw/int/] => 'int');};
960eval{$ffi->attach('OGRGetGenerate_DB2_V72_BYTE_ORDER' => [] => 'int');};
961eval{$ffi->attach('OGRSetNonLinearGeometriesEnabledFlag' => [qw/int/] => 'void');};
962eval{$ffi->attach('OGRGetNonLinearGeometriesEnabledFlag' => [] => 'int');};
963eval{$ffi->attach('OGR_Fld_Create' => ['string','unsigned int'] => 'opaque');};
964eval{$ffi->attach('OGR_Fld_Destroy' => [qw/opaque/] => 'void');};
965eval{$ffi->attach('OGR_Fld_SetName' => [qw/opaque string/] => 'void');};
966eval{$ffi->attach('OGR_Fld_GetNameRef' => [qw/opaque/] => 'string');};
967eval{$ffi->attach('OGR_Fld_SetAlternativeName' => [qw/opaque string/] => 'void');};
968eval{$ffi->attach('OGR_Fld_GetAlternativeNameRef' => [qw/opaque/] => 'string');};
969eval{$ffi->attach('OGR_Fld_GetType' => [qw/opaque/] => 'unsigned int');};
970eval{$ffi->attach('OGR_Fld_SetType' => ['opaque','unsigned int'] => 'void');};
971eval{$ffi->attach('OGR_Fld_GetSubType' => [qw/opaque/] => 'unsigned int');};
972eval{$ffi->attach('OGR_Fld_SetSubType' => ['opaque','unsigned int'] => 'void');};
973eval{$ffi->attach('OGR_Fld_GetJustify' => [qw/opaque/] => 'unsigned int');};
974eval{$ffi->attach('OGR_Fld_SetJustify' => ['opaque','unsigned int'] => 'void');};
975eval{$ffi->attach('OGR_Fld_GetWidth' => [qw/opaque/] => 'int');};
976eval{$ffi->attach('OGR_Fld_SetWidth' => [qw/opaque int/] => 'void');};
977eval{$ffi->attach('OGR_Fld_GetPrecision' => [qw/opaque/] => 'int');};
978eval{$ffi->attach('OGR_Fld_SetPrecision' => [qw/opaque int/] => 'void');};
979eval{$ffi->attach('OGR_Fld_Set' => ['opaque','string','unsigned int','int','int','unsigned int'] => 'void');};
980eval{$ffi->attach('OGR_Fld_IsIgnored' => [qw/opaque/] => 'int');};
981eval{$ffi->attach('OGR_Fld_SetIgnored' => [qw/opaque int/] => 'void');};
982eval{$ffi->attach('OGR_Fld_IsNullable' => [qw/opaque/] => 'int');};
983eval{$ffi->attach('OGR_Fld_SetNullable' => [qw/opaque int/] => 'void');};
984eval{$ffi->attach('OGR_Fld_IsUnique' => [qw/opaque/] => 'int');};
985eval{$ffi->attach('OGR_Fld_SetUnique' => [qw/opaque int/] => 'void');};
986eval{$ffi->attach('OGR_Fld_GetDefault' => [qw/opaque/] => 'string');};
987eval{$ffi->attach('OGR_Fld_SetDefault' => [qw/opaque string/] => 'void');};
988eval{$ffi->attach('OGR_Fld_IsDefaultDriverSpecific' => [qw/opaque/] => 'int');};
989eval{$ffi->attach('OGR_GetFieldTypeName' => ['unsigned int'] => 'string');};
990eval{$ffi->attach('OGR_GetFieldSubTypeName' => ['unsigned int'] => 'string');};
991eval{$ffi->attach('OGR_AreTypeSubTypeCompatible' => ['unsigned int','unsigned int'] => 'int');};
992eval{$ffi->attach('OGR_GFld_Create' => ['string','unsigned int'] => 'opaque');};
993eval{$ffi->attach('OGR_GFld_Destroy' => [qw/opaque/] => 'void');};
994eval{$ffi->attach('OGR_GFld_SetName' => [qw/opaque string/] => 'void');};
995eval{$ffi->attach('OGR_GFld_GetNameRef' => [qw/opaque/] => 'string');};
996eval{$ffi->attach('OGR_GFld_GetType' => [qw/opaque/] => 'unsigned int');};
997eval{$ffi->attach('OGR_GFld_SetType' => ['opaque','unsigned int'] => 'void');};
998eval{$ffi->attach('OGR_GFld_GetSpatialRef' => [qw/opaque/] => 'opaque');};
999eval{$ffi->attach('OGR_GFld_SetSpatialRef' => [qw/opaque opaque/] => 'void');};
1000eval{$ffi->attach('OGR_GFld_IsNullable' => [qw/opaque/] => 'int');};
1001eval{$ffi->attach('OGR_GFld_SetNullable' => [qw/opaque int/] => 'void');};
1002eval{$ffi->attach('OGR_GFld_IsIgnored' => [qw/opaque/] => 'int');};
1003eval{$ffi->attach('OGR_GFld_SetIgnored' => [qw/opaque int/] => 'void');};
1004eval{$ffi->attach('OGR_FD_Create' => [qw/string/] => 'opaque');};
1005eval{$ffi->attach('OGR_FD_Destroy' => [qw/opaque/] => 'void');};
1006eval{$ffi->attach('OGR_FD_Release' => [qw/opaque/] => 'void');};
1007eval{$ffi->attach('OGR_FD_GetName' => [qw/opaque/] => 'string');};
1008eval{$ffi->attach('OGR_FD_GetFieldCount' => [qw/opaque/] => 'int');};
1009eval{$ffi->attach('OGR_FD_GetFieldDefn' => [qw/opaque int/] => 'opaque');};
1010eval{$ffi->attach('OGR_FD_GetFieldIndex' => [qw/opaque string/] => 'int');};
1011eval{$ffi->attach('OGR_FD_AddFieldDefn' => [qw/opaque opaque/] => 'void');};
1012eval{$ffi->attach('OGR_FD_DeleteFieldDefn' => [qw/opaque int/] => 'int');};
1013eval{$ffi->attach('OGR_FD_ReorderFieldDefns' => [qw/opaque int*/] => 'int');};
1014eval{$ffi->attach('OGR_FD_GetGeomType' => [qw/opaque/] => 'unsigned int');};
1015eval{$ffi->attach('OGR_FD_SetGeomType' => ['opaque','unsigned int'] => 'void');};
1016eval{$ffi->attach('OGR_FD_IsGeometryIgnored' => [qw/opaque/] => 'int');};
1017eval{$ffi->attach('OGR_FD_SetGeometryIgnored' => [qw/opaque int/] => 'void');};
1018eval{$ffi->attach('OGR_FD_IsStyleIgnored' => [qw/opaque/] => 'int');};
1019eval{$ffi->attach('OGR_FD_SetStyleIgnored' => [qw/opaque int/] => 'void');};
1020eval{$ffi->attach('OGR_FD_Reference' => [qw/opaque/] => 'int');};
1021eval{$ffi->attach('OGR_FD_Dereference' => [qw/opaque/] => 'int');};
1022eval{$ffi->attach('OGR_FD_GetReferenceCount' => [qw/opaque/] => 'int');};
1023eval{$ffi->attach('OGR_FD_GetGeomFieldCount' => [qw/opaque/] => 'int');};
1024eval{$ffi->attach('OGR_FD_GetGeomFieldDefn' => [qw/opaque int/] => 'opaque');};
1025eval{$ffi->attach('OGR_FD_GetGeomFieldIndex' => [qw/opaque string/] => 'int');};
1026eval{$ffi->attach('OGR_FD_AddGeomFieldDefn' => [qw/opaque opaque/] => 'void');};
1027eval{$ffi->attach('OGR_FD_DeleteGeomFieldDefn' => [qw/opaque int/] => 'int');};
1028eval{$ffi->attach('OGR_FD_IsSame' => [qw/opaque opaque/] => 'int');};
1029eval{$ffi->attach('OGR_F_Create' => [qw/opaque/] => 'opaque');};
1030eval{$ffi->attach('OGR_F_Destroy' => [qw/opaque/] => 'void');};
1031eval{$ffi->attach('OGR_F_GetDefnRef' => [qw/opaque/] => 'opaque');};
1032eval{$ffi->attach('OGR_F_SetGeometryDirectly' => [qw/opaque opaque/] => 'int');};
1033eval{$ffi->attach('OGR_F_SetGeometry' => [qw/opaque opaque/] => 'int');};
1034eval{$ffi->attach('OGR_F_GetGeometryRef' => [qw/opaque/] => 'opaque');};
1035eval{$ffi->attach('OGR_F_StealGeometry' => [qw/opaque/] => 'opaque');};
1036eval{$ffi->attach('OGR_F_Clone' => [qw/opaque/] => 'opaque');};
1037eval{$ffi->attach('OGR_F_Equal' => [qw/opaque opaque/] => 'int');};
1038eval{$ffi->attach('OGR_F_GetFieldCount' => [qw/opaque/] => 'int');};
1039eval{$ffi->attach('OGR_F_GetFieldDefnRef' => [qw/opaque int/] => 'opaque');};
1040eval{$ffi->attach('OGR_F_GetFieldIndex' => [qw/opaque string/] => 'int');};
1041eval{$ffi->attach('OGR_F_IsFieldSet' => [qw/opaque int/] => 'int');};
1042eval{$ffi->attach('OGR_F_UnsetField' => [qw/opaque int/] => 'void');};
1043eval{$ffi->attach('OGR_F_IsFieldNull' => [qw/opaque int/] => 'int');};
1044eval{$ffi->attach('OGR_F_IsFieldSetAndNotNull' => [qw/opaque int/] => 'int');};
1045eval{$ffi->attach('OGR_F_SetFieldNull' => [qw/opaque int/] => 'void');};
1046eval{$ffi->attach('OGR_F_GetRawFieldRef' => [qw/opaque int/] => 'opaque');};
1047eval{$ffi->attach('OGR_RawField_IsUnset' => [qw/opaque/] => 'int');};
1048eval{$ffi->attach('OGR_RawField_IsNull' => [qw/opaque/] => 'int');};
1049eval{$ffi->attach('OGR_RawField_SetUnset' => [qw/opaque/] => 'void');};
1050eval{$ffi->attach('OGR_RawField_SetNull' => [qw/opaque/] => 'void');};
1051eval{$ffi->attach('OGR_F_GetFieldAsInteger' => [qw/opaque int/] => 'int');};
1052eval{$ffi->attach('OGR_F_GetFieldAsInteger64' => [qw/opaque int/] => 'sint64');};
1053eval{$ffi->attach('OGR_F_GetFieldAsDouble' => [qw/opaque int/] => 'double');};
1054eval{$ffi->attach('OGR_F_GetFieldAsString' => [qw/opaque int/] => 'string');};
1055eval{$ffi->attach('OGR_F_GetFieldAsIntegerList' => [qw/opaque int int*/] => 'pointer');};
1056eval{$ffi->attach('OGR_F_GetFieldAsInteger64List' => [qw/opaque int int*/] => 'pointer');};
1057eval{$ffi->attach('OGR_F_GetFieldAsDoubleList' => [qw/opaque int int*/] => 'pointer');};
1058eval{$ffi->attach('OGR_F_GetFieldAsStringList' => [qw/opaque int/] => 'opaque');};
1059eval{$ffi->attach('OGR_F_GetFieldAsBinary' => [qw/opaque int int*/] => 'pointer');};
1060eval{$ffi->attach('OGR_F_GetFieldAsDateTime' => [qw/opaque int int* int* int* int* int* int* int*/] => 'int');};
1061eval{$ffi->attach('OGR_F_GetFieldAsDateTimeEx' => [qw/opaque int int* int* int* int* int* float* int*/] => 'int');};
1062eval{$ffi->attach('OGR_F_SetFieldInteger' => [qw/opaque int int/] => 'void');};
1063eval{$ffi->attach('OGR_F_SetFieldInteger64' => [qw/opaque int sint64/] => 'void');};
1064eval{$ffi->attach('OGR_F_SetFieldDouble' => [qw/opaque int double/] => 'void');};
1065eval{$ffi->attach('OGR_F_SetFieldString' => [qw/opaque int string/] => 'void');};
1066eval{$ffi->attach('OGR_F_SetFieldIntegerList' => [qw/opaque int int int[]/] => 'void');};
1067eval{$ffi->attach('OGR_F_SetFieldInteger64List' => [qw/opaque int int sint64[]/] => 'void');};
1068eval{$ffi->attach('OGR_F_SetFieldDoubleList' => [qw/opaque int int double[]/] => 'void');};
1069eval{$ffi->attach('OGR_F_SetFieldStringList' => [qw/opaque int opaque/] => 'void');};
1070eval{$ffi->attach('OGR_F_SetFieldRaw' => [qw/opaque int opaque/] => 'void');};
1071eval{$ffi->attach('OGR_F_SetFieldBinary' => [qw/opaque int int opaque/] => 'void');};
1072eval{$ffi->attach('OGR_F_SetFieldDateTime' => [qw/opaque int int int int int int int int/] => 'void');};
1073eval{$ffi->attach('OGR_F_SetFieldDateTimeEx' => [qw/opaque int int int int int int float int/] => 'void');};
1074eval{$ffi->attach('OGR_F_GetGeomFieldCount' => [qw/opaque/] => 'int');};
1075eval{$ffi->attach('OGR_F_GetGeomFieldDefnRef' => [qw/opaque int/] => 'opaque');};
1076eval{$ffi->attach('OGR_F_GetGeomFieldIndex' => [qw/opaque string/] => 'int');};
1077eval{$ffi->attach('OGR_F_GetGeomFieldRef' => [qw/opaque int/] => 'opaque');};
1078eval{$ffi->attach('OGR_F_SetGeomFieldDirectly' => [qw/opaque int opaque/] => 'int');};
1079eval{$ffi->attach('OGR_F_SetGeomField' => [qw/opaque int opaque/] => 'int');};
1080eval{$ffi->attach('OGR_F_GetFID' => [qw/opaque/] => 'sint64');};
1081eval{$ffi->attach('OGR_F_SetFID' => [qw/opaque sint64/] => 'int');};
1082eval{$ffi->attach('OGR_F_DumpReadable' => [qw/opaque opaque/] => 'void');};
1083eval{$ffi->attach('OGR_F_SetFrom' => [qw/opaque opaque int/] => 'int');};
1084eval{$ffi->attach('OGR_F_SetFromWithMap' => [qw/opaque opaque int int*/] => 'int');};
1085eval{$ffi->attach('OGR_F_GetStyleString' => [qw/opaque/] => 'string');};
1086eval{$ffi->attach('OGR_F_SetStyleString' => [qw/opaque string/] => 'void');};
1087eval{$ffi->attach('OGR_F_SetStyleStringDirectly' => [qw/opaque string/] => 'void');};
1088eval{$ffi->attach('OGR_F_GetStyleTable' => [qw/opaque/] => 'opaque');};
1089eval{$ffi->attach('OGR_F_SetStyleTableDirectly' => [qw/opaque opaque/] => 'void');};
1090eval{$ffi->attach('OGR_F_SetStyleTable' => [qw/opaque opaque/] => 'void');};
1091eval{$ffi->attach('OGR_F_GetNativeData' => [qw/opaque/] => 'string');};
1092eval{$ffi->attach('OGR_F_SetNativeData' => [qw/opaque string/] => 'void');};
1093eval{$ffi->attach('OGR_F_GetNativeMediaType' => [qw/opaque/] => 'string');};
1094eval{$ffi->attach('OGR_F_SetNativeMediaType' => [qw/opaque string/] => 'void');};
1095eval{$ffi->attach('OGR_F_FillUnsetWithDefault' => [qw/opaque int string_pointer/] => 'void');};
1096eval{$ffi->attach('OGR_F_Validate' => [qw/opaque int int/] => 'int');};
1097eval{$ffi->attach('OGR_L_GetName' => [qw/opaque/] => 'string');};
1098eval{$ffi->attach('OGR_L_GetGeomType' => [qw/opaque/] => 'unsigned int');};
1099eval{$ffi->attach('OGR_L_GetSpatialFilter' => [qw/opaque/] => 'opaque');};
1100eval{$ffi->attach('OGR_L_SetSpatialFilter' => [qw/opaque opaque/] => 'void');};
1101eval{$ffi->attach('OGR_L_SetSpatialFilterRect' => [qw/opaque double double double double/] => 'void');};
1102eval{$ffi->attach('OGR_L_SetSpatialFilterEx' => [qw/opaque int opaque/] => 'void');};
1103eval{$ffi->attach('OGR_L_SetSpatialFilterRectEx' => [qw/opaque int double double double double/] => 'void');};
1104eval{$ffi->attach('OGR_L_SetAttributeFilter' => [qw/opaque string/] => 'int');};
1105eval{$ffi->attach('OGR_L_ResetReading' => [qw/opaque/] => 'void');};
1106eval{$ffi->attach('OGR_L_GetNextFeature' => [qw/opaque/] => 'opaque');};
1107eval{$ffi->attach('OGR_L_SetNextByIndex' => [qw/opaque sint64/] => 'int');};
1108eval{$ffi->attach('OGR_L_GetFeature' => [qw/opaque sint64/] => 'opaque');};
1109eval{$ffi->attach('OGR_L_SetFeature' => [qw/opaque opaque/] => 'int');};
1110eval{$ffi->attach('OGR_L_CreateFeature' => [qw/opaque opaque/] => 'int');};
1111eval{$ffi->attach('OGR_L_DeleteFeature' => [qw/opaque sint64/] => 'int');};
1112eval{$ffi->attach('OGR_L_GetLayerDefn' => [qw/opaque/] => 'opaque');};
1113eval{$ffi->attach('OGR_L_GetSpatialRef' => [qw/opaque/] => 'opaque');};
1114eval{$ffi->attach('OGR_L_FindFieldIndex' => [qw/opaque string int/] => 'int');};
1115eval{$ffi->attach('OGR_L_GetFeatureCount' => [qw/opaque int/] => 'sint64');};
1116eval{$ffi->attach('OGR_L_GetExtent' => [qw/opaque double[4] int/] => 'int');};
1117eval{$ffi->attach('OGR_L_GetExtentEx' => [qw/opaque int double[4] int/] => 'int');};
1118eval{$ffi->attach('OGR_L_TestCapability' => [qw/opaque string/] => 'int');};
1119eval{$ffi->attach('OGR_L_CreateField' => [qw/opaque opaque int/] => 'int');};
1120eval{$ffi->attach('OGR_L_CreateGeomField' => [qw/opaque opaque int/] => 'int');};
1121eval{$ffi->attach('OGR_L_DeleteField' => [qw/opaque int/] => 'int');};
1122eval{$ffi->attach('OGR_L_ReorderFields' => [qw/opaque int*/] => 'int');};
1123eval{$ffi->attach('OGR_L_ReorderField' => [qw/opaque int int/] => 'int');};
1124eval{$ffi->attach('OGR_L_AlterFieldDefn' => [qw/opaque int opaque int/] => 'int');};
1125eval{$ffi->attach('OGR_L_StartTransaction' => [qw/opaque/] => 'int');};
1126eval{$ffi->attach('OGR_L_CommitTransaction' => [qw/opaque/] => 'int');};
1127eval{$ffi->attach('OGR_L_RollbackTransaction' => [qw/opaque/] => 'int');};
1128eval{$ffi->attach('OGR_L_Reference' => [qw/opaque/] => 'int');};
1129eval{$ffi->attach('OGR_L_Dereference' => [qw/opaque/] => 'int');};
1130eval{$ffi->attach('OGR_L_GetRefCount' => [qw/opaque/] => 'int');};
1131eval{$ffi->attach('OGR_L_SyncToDisk' => [qw/opaque/] => 'int');};
1132eval{$ffi->attach('OGR_L_GetFeaturesRead' => [qw/opaque/] => 'sint64');};
1133eval{$ffi->attach('OGR_L_GetFIDColumn' => [qw/opaque/] => 'string');};
1134eval{$ffi->attach('OGR_L_GetGeometryColumn' => [qw/opaque/] => 'string');};
1135eval{$ffi->attach('OGR_L_GetStyleTable' => [qw/opaque/] => 'opaque');};
1136eval{$ffi->attach('OGR_L_SetStyleTableDirectly' => [qw/opaque opaque/] => 'void');};
1137eval{$ffi->attach('OGR_L_SetStyleTable' => [qw/opaque opaque/] => 'void');};
1138eval{$ffi->attach('OGR_L_SetIgnoredFields' => [qw/opaque string/] => 'int');};
1139eval{$ffi->attach('OGR_L_Intersection' => [qw/opaque opaque opaque opaque GDALProgressFunc opaque/] => 'int');};
1140eval{$ffi->attach('OGR_L_Union' => [qw/opaque opaque opaque opaque GDALProgressFunc opaque/] => 'int');};
1141eval{$ffi->attach('OGR_L_SymDifference' => [qw/opaque opaque opaque opaque GDALProgressFunc opaque/] => 'int');};
1142eval{$ffi->attach('OGR_L_Identity' => [qw/opaque opaque opaque opaque GDALProgressFunc opaque/] => 'int');};
1143eval{$ffi->attach('OGR_L_Update' => [qw/opaque opaque opaque opaque GDALProgressFunc opaque/] => 'int');};
1144eval{$ffi->attach('OGR_L_Clip' => [qw/opaque opaque opaque opaque GDALProgressFunc opaque/] => 'int');};
1145eval{$ffi->attach('OGR_L_Erase' => [qw/opaque opaque opaque opaque GDALProgressFunc opaque/] => 'int');};
1146eval{$ffi->attach('OGR_DS_Destroy' => [qw/opaque/] => 'void');};
1147eval{$ffi->attach('OGR_DS_GetName' => [qw/opaque/] => 'string');};
1148eval{$ffi->attach('OGR_DS_GetLayerCount' => [qw/opaque/] => 'int');};
1149eval{$ffi->attach('OGR_DS_GetLayer' => [qw/opaque int/] => 'opaque');};
1150eval{$ffi->attach('OGR_DS_GetLayerByName' => [qw/opaque string/] => 'opaque');};
1151eval{$ffi->attach('OGR_DS_DeleteLayer' => [qw/opaque int/] => 'int');};
1152eval{$ffi->attach('OGR_DS_GetDriver' => [qw/opaque/] => 'opaque');};
1153eval{$ffi->attach('OGR_DS_CreateLayer' => ['opaque','string','opaque','unsigned int','opaque'] => 'opaque');};
1154eval{$ffi->attach('OGR_DS_CopyLayer' => [qw/opaque opaque string opaque/] => 'opaque');};
1155eval{$ffi->attach('OGR_DS_TestCapability' => [qw/opaque string/] => 'int');};
1156eval{$ffi->attach('OGR_DS_ExecuteSQL' => [qw/opaque string opaque string/] => 'opaque');};
1157eval{$ffi->attach('OGR_DS_ReleaseResultSet' => [qw/opaque opaque/] => 'void');};
1158eval{$ffi->attach('OGR_DS_Reference' => [qw/opaque/] => 'int');};
1159eval{$ffi->attach('OGR_DS_Dereference' => [qw/opaque/] => 'int');};
1160eval{$ffi->attach('OGR_DS_GetRefCount' => [qw/opaque/] => 'int');};
1161eval{$ffi->attach('OGR_DS_GetSummaryRefCount' => [qw/opaque/] => 'int');};
1162eval{$ffi->attach('OGR_DS_SyncToDisk' => [qw/opaque/] => 'int');};
1163eval{$ffi->attach('OGR_DS_GetStyleTable' => [qw/opaque/] => 'opaque');};
1164eval{$ffi->attach('OGR_DS_SetStyleTableDirectly' => [qw/opaque opaque/] => 'void');};
1165eval{$ffi->attach('OGR_DS_SetStyleTable' => [qw/opaque opaque/] => 'void');};
1166eval{$ffi->attach('OGR_Dr_GetName' => [qw/opaque/] => 'string');};
1167eval{$ffi->attach('OGR_Dr_Open' => [qw/opaque string int/] => 'opaque');};
1168eval{$ffi->attach('OGR_Dr_TestCapability' => [qw/opaque string/] => 'int');};
1169eval{$ffi->attach('OGR_Dr_CreateDataSource' => [qw/opaque string string_pointer/] => 'opaque');};
1170eval{$ffi->attach('OGR_Dr_CopyDataSource' => [qw/opaque opaque string string_pointer/] => 'opaque');};
1171eval{$ffi->attach('OGR_Dr_DeleteDataSource' => [qw/opaque string/] => 'int');};
1172eval{$ffi->attach('OGROpen' => [qw/string int uint64*/] => 'opaque');};
1173eval{$ffi->attach('OGROpenShared' => [qw/string int uint64*/] => 'opaque');};
1174eval{$ffi->attach('OGRReleaseDataSource' => [qw/opaque/] => 'int');};
1175eval{$ffi->attach('OGRRegisterDriver' => [qw/opaque/] => 'void');};
1176eval{$ffi->attach('OGRDeregisterDriver' => [qw/opaque/] => 'void');};
1177eval{$ffi->attach('OGRGetDriverCount' => [] => 'int');};
1178eval{$ffi->attach('OGRGetDriver' => [qw/int/] => 'opaque');};
1179eval{$ffi->attach('OGRGetDriverByName' => [qw/string/] => 'opaque');};
1180eval{$ffi->attach('OGRGetOpenDSCount' => [] => 'int');};
1181eval{$ffi->attach('OGRGetOpenDS' => [qw/int/] => 'opaque');};
1182eval{$ffi->attach('OGRRegisterAll' => [] => 'void');};
1183eval{$ffi->attach('OGRCleanupAll' => [] => 'void');};
1184eval{$ffi->attach('OGR_SM_Create' => [qw/opaque/] => 'opaque');};
1185eval{$ffi->attach('OGR_SM_Destroy' => [qw/opaque/] => 'void');};
1186eval{$ffi->attach('OGR_SM_InitFromFeature' => [qw/opaque opaque/] => 'string');};
1187eval{$ffi->attach('OGR_SM_InitStyleString' => [qw/opaque string/] => 'int');};
1188eval{$ffi->attach('OGR_SM_GetPartCount' => [qw/opaque string/] => 'int');};
1189eval{$ffi->attach('OGR_SM_GetPart' => [qw/opaque int string/] => 'opaque');};
1190eval{$ffi->attach('OGR_SM_AddPart' => [qw/opaque opaque/] => 'int');};
1191eval{$ffi->attach('OGR_SM_AddStyle' => [qw/opaque string string/] => 'int');};
1192eval{$ffi->attach('OGR_ST_Create' => ['unsigned int'] => 'opaque');};
1193eval{$ffi->attach('OGR_ST_Destroy' => [qw/opaque/] => 'void');};
1194eval{$ffi->attach('OGR_ST_GetType' => [qw/opaque/] => 'unsigned int');};
1195eval{$ffi->attach('OGR_ST_GetUnit' => [qw/opaque/] => 'unsigned int');};
1196eval{$ffi->attach('OGR_ST_SetUnit' => ['opaque','unsigned int','double'] => 'void');};
1197eval{$ffi->attach('OGR_ST_GetParamStr' => [qw/opaque int int*/] => 'string');};
1198eval{$ffi->attach('OGR_ST_GetParamNum' => [qw/opaque int int*/] => 'int');};
1199eval{$ffi->attach('OGR_ST_GetParamDbl' => [qw/opaque int int*/] => 'double');};
1200eval{$ffi->attach('OGR_ST_SetParamStr' => [qw/opaque int string/] => 'void');};
1201eval{$ffi->attach('OGR_ST_SetParamNum' => [qw/opaque int int/] => 'void');};
1202eval{$ffi->attach('OGR_ST_SetParamDbl' => [qw/opaque int double/] => 'void');};
1203eval{$ffi->attach('OGR_ST_GetStyleString' => [qw/opaque/] => 'string');};
1204eval{$ffi->attach('OGR_ST_GetRGBFromString' => [qw/opaque string int* int* int* int*/] => 'int');};
1205eval{$ffi->attach('OGR_STBL_Create' => [] => 'opaque');};
1206eval{$ffi->attach('OGR_STBL_Destroy' => [qw/opaque/] => 'void');};
1207eval{$ffi->attach('OGR_STBL_AddStyle' => [qw/opaque string string/] => 'int');};
1208eval{$ffi->attach('OGR_STBL_SaveStyleTable' => [qw/opaque string/] => 'int');};
1209eval{$ffi->attach('OGR_STBL_LoadStyleTable' => [qw/opaque string/] => 'int');};
1210eval{$ffi->attach('OGR_STBL_Find' => [qw/opaque string/] => 'string');};
1211eval{$ffi->attach('OGR_STBL_ResetStyleStringReading' => [qw/opaque/] => 'void');};
1212eval{$ffi->attach('OGR_STBL_GetNextStyle' => [qw/opaque/] => 'string');};
1213eval{$ffi->attach('OGR_STBL_GetLastStyleName' => [qw/opaque/] => 'string');};
1214# from ogr/ogr_srs_api.h
1215eval{$ffi->attach('OSRAxisEnumToName' => ['unsigned int'] => 'string');};
1216eval{$ffi->attach('OSRSetPROJSearchPaths' => [qw/string_pointer/] => 'void');};
1217eval{$ffi->attach('OSRGetPROJSearchPaths' => [] => 'string_pointer');};
1218eval{$ffi->attach('OSRGetPROJVersion' => [qw/int* int* int*/] => 'void');};
1219eval{$ffi->attach('OSRNewSpatialReference' => [qw/string/] => 'opaque');};
1220eval{$ffi->attach('OSRCloneGeogCS' => [qw/opaque/] => 'opaque');};
1221eval{$ffi->attach('OSRClone' => [qw/opaque/] => 'opaque');};
1222eval{$ffi->attach('OSRDestroySpatialReference' => [qw/opaque/] => 'void');};
1223eval{$ffi->attach('OSRReference' => [qw/opaque/] => 'int');};
1224eval{$ffi->attach('OSRDereference' => [qw/opaque/] => 'int');};
1225eval{$ffi->attach('OSRRelease' => [qw/opaque/] => 'void');};
1226eval{$ffi->attach('OSRValidate' => [qw/opaque/] => 'int');};
1227eval{$ffi->attach('OSRImportFromEPSG' => [qw/opaque int/] => 'int');};
1228eval{$ffi->attach('OSRImportFromEPSGA' => [qw/opaque int/] => 'int');};
1229eval{$ffi->attach('OSRImportFromWkt' => [qw/opaque string_pointer/] => 'int');};
1230eval{$ffi->attach('OSRImportFromProj4' => [qw/opaque string/] => 'int');};
1231eval{$ffi->attach('OSRImportFromESRI' => [qw/opaque string_pointer/] => 'int');};
1232eval{$ffi->attach('OSRImportFromPCI' => [qw/opaque string string double*/] => 'int');};
1233eval{$ffi->attach('OSRImportFromUSGS' => [qw/opaque long long double* long/] => 'int');};
1234eval{$ffi->attach('OSRImportFromXML' => [qw/opaque string/] => 'int');};
1235eval{$ffi->attach('OSRImportFromDict' => [qw/opaque string string/] => 'int');};
1236eval{$ffi->attach('OSRImportFromPanorama' => [qw/opaque long long long double*/] => 'int');};
1237eval{$ffi->attach('OSRImportFromOzi' => [qw/opaque string_pointer/] => 'int');};
1238eval{$ffi->attach('OSRImportFromMICoordSys' => [qw/opaque string/] => 'int');};
1239eval{$ffi->attach('OSRImportFromERM' => [qw/opaque string string string/] => 'int');};
1240eval{$ffi->attach('OSRImportFromUrl' => [qw/opaque string/] => 'int');};
1241eval{$ffi->attach('OSRExportToWkt' => [qw/opaque string_pointer/] => 'int');};
1242eval{$ffi->attach('OSRExportToWktEx' => [qw/opaque string_pointer string_pointer/] => 'int');};
1243eval{$ffi->attach('OSRExportToPrettyWkt' => [qw/opaque string_pointer int/] => 'int');};
1244eval{$ffi->attach('OSRExportToPROJJSON' => [qw/opaque string_pointer string_pointer/] => 'int');};
1245eval{$ffi->attach('OSRExportToProj4' => [qw/opaque string_pointer/] => 'int');};
1246eval{$ffi->attach('OSRExportToPCI' => [qw/opaque string_pointer string_pointer double*/] => 'int');};
1247eval{$ffi->attach('OSRExportToUSGS' => [qw/opaque long* long* double* long*/] => 'int');};
1248eval{$ffi->attach('OSRExportToXML' => [qw/opaque string_pointer string/] => 'int');};
1249eval{$ffi->attach('OSRExportToPanorama' => [qw/opaque long* long* long* long* double*/] => 'int');};
1250eval{$ffi->attach('OSRExportToMICoordSys' => [qw/opaque string_pointer/] => 'int');};
1251eval{$ffi->attach('OSRExportToERM' => [qw/opaque string string string/] => 'int');};
1252eval{$ffi->attach('OSRMorphToESRI' => [qw/opaque/] => 'int');};
1253eval{$ffi->attach('OSRMorphFromESRI' => [qw/opaque/] => 'int');};
1254eval{$ffi->attach('OSRConvertToOtherProjection' => [qw/opaque string string_pointer/] => 'opaque');};
1255eval{$ffi->attach('OSRGetName' => [qw/opaque/] => 'string');};
1256eval{$ffi->attach('OSRSetAttrValue' => [qw/opaque string string/] => 'int');};
1257eval{$ffi->attach('OSRGetAttrValue' => [qw/opaque string int/] => 'string');};
1258eval{$ffi->attach('OSRSetAngularUnits' => [qw/opaque string double/] => 'int');};
1259eval{$ffi->attach('OSRGetAngularUnits' => [qw/opaque string_pointer/] => 'double');};
1260eval{$ffi->attach('OSRSetLinearUnits' => [qw/opaque string double/] => 'int');};
1261eval{$ffi->attach('OSRSetTargetLinearUnits' => [qw/opaque string string double/] => 'int');};
1262eval{$ffi->attach('OSRSetLinearUnitsAndUpdateParameters' => [qw/opaque string double/] => 'int');};
1263eval{$ffi->attach('OSRGetLinearUnits' => [qw/opaque string_pointer/] => 'double');};
1264eval{$ffi->attach('OSRGetTargetLinearUnits' => [qw/opaque string string_pointer/] => 'double');};
1265eval{$ffi->attach('OSRGetPrimeMeridian' => [qw/opaque string_pointer/] => 'double');};
1266eval{$ffi->attach('OSRIsGeographic' => [qw/opaque/] => 'int');};
1267eval{$ffi->attach('OSRIsDerivedGeographic' => [qw/opaque/] => 'int');};
1268eval{$ffi->attach('OSRIsLocal' => [qw/opaque/] => 'int');};
1269eval{$ffi->attach('OSRIsProjected' => [qw/opaque/] => 'int');};
1270eval{$ffi->attach('OSRIsCompound' => [qw/opaque/] => 'int');};
1271eval{$ffi->attach('OSRIsGeocentric' => [qw/opaque/] => 'int');};
1272eval{$ffi->attach('OSRIsVertical' => [qw/opaque/] => 'int');};
1273eval{$ffi->attach('OSRIsSameGeogCS' => [qw/opaque opaque/] => 'int');};
1274eval{$ffi->attach('OSRIsSameVertCS' => [qw/opaque opaque/] => 'int');};
1275eval{$ffi->attach('OSRIsSame' => [qw/opaque opaque/] => 'int');};
1276eval{$ffi->attach('OSRIsSameEx' => [qw/opaque opaque string_pointer/] => 'int');};
1277eval{$ffi->attach('OSRSetLocalCS' => [qw/opaque string/] => 'int');};
1278eval{$ffi->attach('OSRSetProjCS' => [qw/opaque string/] => 'int');};
1279eval{$ffi->attach('OSRSetGeocCS' => [qw/opaque string/] => 'int');};
1280eval{$ffi->attach('OSRSetWellKnownGeogCS' => [qw/opaque string/] => 'int');};
1281eval{$ffi->attach('OSRSetFromUserInput' => [qw/opaque string/] => 'int');};
1282eval{$ffi->attach('OSRCopyGeogCSFrom' => [qw/opaque opaque/] => 'int');};
1283eval{$ffi->attach('OSRSetTOWGS84' => [qw/opaque double double double double double double double/] => 'int');};
1284eval{$ffi->attach('OSRGetTOWGS84' => [qw/opaque double* int/] => 'int');};
1285eval{$ffi->attach('OSRAddGuessedTOWGS84' => [qw/opaque/] => 'int');};
1286eval{$ffi->attach('OSRSetCompoundCS' => [qw/opaque string opaque opaque/] => 'int');};
1287eval{$ffi->attach('OSRPromoteTo3D' => [qw/opaque string/] => 'int');};
1288eval{$ffi->attach('OSRDemoteTo2D' => [qw/opaque string/] => 'int');};
1289eval{$ffi->attach('OSRSetGeogCS' => [qw/opaque string string string double double string double string double/] => 'int');};
1290eval{$ffi->attach('OSRSetVertCS' => [qw/opaque string string int/] => 'int');};
1291eval{$ffi->attach('OSRGetSemiMajor' => [qw/opaque int*/] => 'double');};
1292eval{$ffi->attach('OSRGetSemiMinor' => [qw/opaque int*/] => 'double');};
1293eval{$ffi->attach('OSRGetInvFlattening' => [qw/opaque int*/] => 'double');};
1294eval{$ffi->attach('OSRSetAuthority' => [qw/opaque string string int/] => 'int');};
1295eval{$ffi->attach('OSRGetAuthorityCode' => [qw/opaque string/] => 'string');};
1296eval{$ffi->attach('OSRGetAuthorityName' => [qw/opaque string/] => 'string');};
1297eval{$ffi->attach('OSRGetAreaOfUse' => [qw/opaque double* double* double* double* string/] => 'int');};
1298eval{$ffi->attach('OSRSetProjection' => [qw/opaque string/] => 'int');};
1299eval{$ffi->attach('OSRSetProjParm' => [qw/opaque string double/] => 'int');};
1300eval{$ffi->attach('OSRGetProjParm' => [qw/opaque string double int*/] => 'double');};
1301eval{$ffi->attach('OSRSetNormProjParm' => [qw/opaque string double/] => 'int');};
1302eval{$ffi->attach('OSRGetNormProjParm' => [qw/opaque string double int*/] => 'double');};
1303eval{$ffi->attach('OSRSetUTM' => [qw/opaque int int/] => 'int');};
1304eval{$ffi->attach('OSRGetUTMZone' => [qw/opaque int*/] => 'int');};
1305eval{$ffi->attach('OSRSetStatePlane' => [qw/opaque int int/] => 'int');};
1306eval{$ffi->attach('OSRSetStatePlaneWithUnits' => [qw/opaque int int string double/] => 'int');};
1307eval{$ffi->attach('OSRAutoIdentifyEPSG' => [qw/opaque/] => 'int');};
1308eval{$ffi->attach('OSRFindMatches' => [qw/opaque string_pointer int* int*/] => 'uint64*');};
1309eval{$ffi->attach('OSRFreeSRSArray' => [qw/uint64*/] => 'void');};
1310eval{$ffi->attach('OSREPSGTreatsAsLatLong' => [qw/opaque/] => 'int');};
1311eval{$ffi->attach('OSREPSGTreatsAsNorthingEasting' => [qw/opaque/] => 'int');};
1312eval{$ffi->attach('OSRGetAxis' => ['opaque','string','int','unsigned int'] => 'string');};
1313eval{$ffi->attach('OSRGetAxesCount' => [qw/opaque/] => 'int');};
1314eval{$ffi->attach('OSRSetAxes' => ['opaque','string','string','unsigned int','string','unsigned int'] => 'int');};
1315eval{$ffi->attach('OSRGetAxisMappingStrategy' => [qw/opaque/] => 'int');};
1316eval{$ffi->attach('OSRSetAxisMappingStrategy' => [qw/opaque int/] => 'void');};
1317eval{$ffi->attach('OSRGetDataAxisToSRSAxisMapping' => [qw/opaque int*/] => 'int*');};
1318eval{$ffi->attach('OSRSetDataAxisToSRSAxisMapping' => [qw/opaque int int*/] => 'int');};
1319eval{$ffi->attach('OSRSetACEA' => [qw/opaque double double double double double double/] => 'int');};
1320eval{$ffi->attach('OSRSetAE' => [qw/opaque double double double double/] => 'int');};
1321eval{$ffi->attach('OSRSetBonne' => [qw/opaque double double double double/] => 'int');};
1322eval{$ffi->attach('OSRSetCEA' => [qw/opaque double double double double/] => 'int');};
1323eval{$ffi->attach('OSRSetCS' => [qw/opaque double double double double/] => 'int');};
1324eval{$ffi->attach('OSRSetEC' => [qw/opaque double double double double double double/] => 'int');};
1325eval{$ffi->attach('OSRSetEckert' => [qw/opaque int double double double/] => 'int');};
1326eval{$ffi->attach('OSRSetEckertIV' => [qw/opaque double double double/] => 'int');};
1327eval{$ffi->attach('OSRSetEckertVI' => [qw/opaque double double double/] => 'int');};
1328eval{$ffi->attach('OSRSetEquirectangular' => [qw/opaque double double double double/] => 'int');};
1329eval{$ffi->attach('OSRSetEquirectangular2' => [qw/opaque double double double double double/] => 'int');};
1330eval{$ffi->attach('OSRSetGS' => [qw/opaque double double double/] => 'int');};
1331eval{$ffi->attach('OSRSetGH' => [qw/opaque double double double/] => 'int');};
1332eval{$ffi->attach('OSRSetIGH' => [qw/opaque/] => 'int');};
1333eval{$ffi->attach('OSRSetGEOS' => [qw/opaque double double double double/] => 'int');};
1334eval{$ffi->attach('OSRSetGaussSchreiberTMercator' => [qw/opaque double double double double double/] => 'int');};
1335eval{$ffi->attach('OSRSetGnomonic' => [qw/opaque double double double double/] => 'int');};
1336eval{$ffi->attach('OSRSetHOM' => [qw/opaque double double double double double double double/] => 'int');};
1337eval{$ffi->attach('OSRSetHOMAC' => [qw/opaque double double double double double double double/] => 'int');};
1338eval{$ffi->attach('OSRSetHOM2PNO' => [qw/opaque double double double double double double double double/] => 'int');};
1339eval{$ffi->attach('OSRSetIWMPolyconic' => [qw/opaque double double double double double/] => 'int');};
1340eval{$ffi->attach('OSRSetKrovak' => [qw/opaque double double double double double double double/] => 'int');};
1341eval{$ffi->attach('OSRSetLAEA' => [qw/opaque double double double double/] => 'int');};
1342eval{$ffi->attach('OSRSetLCC' => [qw/opaque double double double double double double/] => 'int');};
1343eval{$ffi->attach('OSRSetLCC1SP' => [qw/opaque double double double double double/] => 'int');};
1344eval{$ffi->attach('OSRSetLCCB' => [qw/opaque double double double double double double/] => 'int');};
1345eval{$ffi->attach('OSRSetMC' => [qw/opaque double double double double/] => 'int');};
1346eval{$ffi->attach('OSRSetMercator' => [qw/opaque double double double double double/] => 'int');};
1347eval{$ffi->attach('OSRSetMercator2SP' => [qw/opaque double double double double double/] => 'int');};
1348eval{$ffi->attach('OSRSetMollweide' => [qw/opaque double double double/] => 'int');};
1349eval{$ffi->attach('OSRSetNZMG' => [qw/opaque double double double double/] => 'int');};
1350eval{$ffi->attach('OSRSetOS' => [qw/opaque double double double double double/] => 'int');};
1351eval{$ffi->attach('OSRSetOrthographic' => [qw/opaque double double double double/] => 'int');};
1352eval{$ffi->attach('OSRSetPolyconic' => [qw/opaque double double double double/] => 'int');};
1353eval{$ffi->attach('OSRSetPS' => [qw/opaque double double double double double/] => 'int');};
1354eval{$ffi->attach('OSRSetRobinson' => [qw/opaque double double double/] => 'int');};
1355eval{$ffi->attach('OSRSetSinusoidal' => [qw/opaque double double double/] => 'int');};
1356eval{$ffi->attach('OSRSetStereographic' => [qw/opaque double double double double double/] => 'int');};
1357eval{$ffi->attach('OSRSetSOC' => [qw/opaque double double double double/] => 'int');};
1358eval{$ffi->attach('OSRSetTM' => [qw/opaque double double double double double/] => 'int');};
1359eval{$ffi->attach('OSRSetTMVariant' => [qw/opaque string double double double double double/] => 'int');};
1360eval{$ffi->attach('OSRSetTMG' => [qw/opaque double double double double/] => 'int');};
1361eval{$ffi->attach('OSRSetTMSO' => [qw/opaque double double double double double/] => 'int');};
1362eval{$ffi->attach('OSRSetTPED' => [qw/opaque double double double double double double/] => 'int');};
1363eval{$ffi->attach('OSRSetVDG' => [qw/opaque double double double/] => 'int');};
1364eval{$ffi->attach('OSRSetWagner' => [qw/opaque int double double double/] => 'int');};
1365eval{$ffi->attach('OSRSetQSC' => [qw/opaque double double/] => 'int');};
1366eval{$ffi->attach('OSRSetSCH' => [qw/opaque double double double double/] => 'int');};
1367eval{$ffi->attach('OSRSetVerticalPerspective' => [qw/opaque double double double double double double/] => 'int');};
1368eval{$ffi->attach('OSRCalcInvFlattening' => [qw/double double/] => 'double');};
1369eval{$ffi->attach('OSRCalcSemiMinorFromInvFlattening' => [qw/double double/] => 'double');};
1370eval{$ffi->attach('OSRCleanup' => [] => 'void');};
1371eval{$ffi->attach('OSRGetCRSInfoListFromDatabase' => [qw/string opaque int*/] => 'opaque');};
1372eval{$ffi->attach('OSRDestroyCRSInfoList' => [qw/opaque/] => 'void');};
1373eval{$ffi->attach('OCTNewCoordinateTransformation' => [qw/opaque opaque/] => 'opaque');};
1374eval{$ffi->attach('OCTNewCoordinateTransformationOptions' => [] => 'opaque');};
1375eval{$ffi->attach('OCTCoordinateTransformationOptionsSetOperation' => [qw/opaque string int/] => 'int');};
1376eval{$ffi->attach('OCTCoordinateTransformationOptionsSetAreaOfInterest' => [qw/opaque double double double double/] => 'int');};
1377eval{$ffi->attach('OCTDestroyCoordinateTransformationOptions' => [qw/opaque/] => 'void');};
1378eval{$ffi->attach('OCTNewCoordinateTransformationEx' => [qw/opaque opaque opaque/] => 'opaque');};
1379eval{$ffi->attach('OCTDestroyCoordinateTransformation' => [qw/opaque/] => 'void');};
1380eval{$ffi->attach('OCTTransform' => [qw/opaque int double* double* double*/] => 'int');};
1381eval{$ffi->attach('OCTTransformEx' => [qw/opaque int double* double* double* int*/] => 'int');};
1382eval{$ffi->attach('OCTTransform4D' => [qw/opaque int double* double* double* double* int*/] => 'int');};
1383# from apps/gdal_utils.h
1384eval{$ffi->attach('GDALInfoOptionsNew' => [qw/opaque opaque/] => 'opaque');};
1385eval{$ffi->attach('GDALInfoOptionsFree' => [qw/opaque/] => 'void');};
1386eval{$ffi->attach('GDALInfo' => [qw/opaque opaque/] => 'string');};
1387eval{$ffi->attach('GDALTranslateOptionsNew' => [qw/opaque opaque/] => 'opaque');};
1388eval{$ffi->attach('GDALTranslateOptionsFree' => [qw/opaque/] => 'void');};
1389eval{$ffi->attach('GDALTranslateOptionsSetProgress' => [qw/opaque GDALProgressFunc opaque/] => 'void');};
1390eval{$ffi->attach('GDALTranslate' => [qw/string opaque opaque int*/] => 'opaque');};
1391eval{$ffi->attach('GDALWarpAppOptionsNew' => [qw/opaque opaque/] => 'opaque');};
1392eval{$ffi->attach('GDALWarpAppOptionsFree' => [qw/opaque/] => 'void');};
1393eval{$ffi->attach('GDALWarpAppOptionsSetProgress' => [qw/opaque GDALProgressFunc opaque/] => 'void');};
1394eval{$ffi->attach('GDALWarpAppOptionsSetQuiet' => [qw/opaque int/] => 'void');};
1395eval{$ffi->attach('GDALWarpAppOptionsSetWarpOption' => [qw/opaque string string/] => 'void');};
1396eval{$ffi->attach('GDALWarp' => [qw/string opaque int opaque[] opaque int*/] => 'opaque');};
1397eval{$ffi->attach('GDALVectorTranslateOptionsNew' => [qw/opaque opaque/] => 'opaque');};
1398eval{$ffi->attach('GDALVectorTranslateOptionsFree' => [qw/opaque/] => 'void');};
1399eval{$ffi->attach('GDALVectorTranslateOptionsSetProgress' => [qw/opaque GDALProgressFunc opaque/] => 'void');};
1400eval{$ffi->attach('GDALVectorTranslate' => [qw/string opaque int opaque[] opaque int*/] => 'opaque');};
1401eval{$ffi->attach('GDALDEMProcessingOptionsNew' => [qw/opaque opaque/] => 'opaque');};
1402eval{$ffi->attach('GDALDEMProcessingOptionsFree' => [qw/opaque/] => 'void');};
1403eval{$ffi->attach('GDALDEMProcessingOptionsSetProgress' => [qw/opaque GDALProgressFunc opaque/] => 'void');};
1404eval{$ffi->attach('GDALDEMProcessing' => [qw/string opaque string string opaque int*/] => 'opaque');};
1405eval{$ffi->attach('GDALNearblackOptionsNew' => [qw/opaque opaque/] => 'opaque');};
1406eval{$ffi->attach('GDALNearblackOptionsFree' => [qw/opaque/] => 'void');};
1407eval{$ffi->attach('GDALNearblackOptionsSetProgress' => [qw/opaque GDALProgressFunc opaque/] => 'void');};
1408eval{$ffi->attach('GDALNearblack' => [qw/string opaque opaque opaque int*/] => 'opaque');};
1409eval{$ffi->attach('GDALGridOptionsNew' => [qw/opaque opaque/] => 'opaque');};
1410eval{$ffi->attach('GDALGridOptionsFree' => [qw/opaque/] => 'void');};
1411eval{$ffi->attach('GDALGridOptionsSetProgress' => [qw/opaque GDALProgressFunc opaque/] => 'void');};
1412eval{$ffi->attach('GDALGrid' => [qw/string opaque opaque int*/] => 'opaque');};
1413eval{$ffi->attach('GDALRasterizeOptionsNew' => [qw/opaque opaque/] => 'opaque');};
1414eval{$ffi->attach('GDALRasterizeOptionsFree' => [qw/opaque/] => 'void');};
1415eval{$ffi->attach('GDALRasterizeOptionsSetProgress' => [qw/opaque GDALProgressFunc opaque/] => 'void');};
1416eval{$ffi->attach('GDALRasterize' => [qw/string opaque opaque opaque int*/] => 'opaque');};
1417eval{$ffi->attach('GDALBuildVRTOptionsNew' => [qw/opaque opaque/] => 'opaque');};
1418eval{$ffi->attach('GDALBuildVRTOptionsFree' => [qw/opaque/] => 'void');};
1419eval{$ffi->attach('GDALBuildVRTOptionsSetProgress' => [qw/opaque GDALProgressFunc opaque/] => 'void');};
1420eval{$ffi->attach('GDALBuildVRT' => [qw/string int opaque[] opaque opaque int*/] => 'opaque');};
1421eval{$ffi->attach('GDALMultiDimInfoOptionsNew' => [qw/string_pointer opaque/] => 'opaque');};
1422eval{$ffi->attach('GDALMultiDimInfoOptionsFree' => [qw/opaque/] => 'void');};
1423eval{$ffi->attach('GDALMultiDimInfo' => [qw/opaque opaque/] => 'string');};
1424eval{$ffi->attach('GDALMultiDimTranslateOptionsNew' => [qw/string_pointer opaque/] => 'opaque');};
1425eval{$ffi->attach('GDALMultiDimTranslateOptionsFree' => [qw/opaque/] => 'void');};
1426eval{$ffi->attach('GDALMultiDimTranslateOptionsSetProgress' => [qw/opaque GDALProgressFunc opaque/] => 'void');};
1427eval{$ffi->attach('GDALMultiDimTranslate' => [qw/string opaque int uint64* opaque int*/] => 'opaque');};
1428# end of generated code
1429
1430
1431    # we do not use Alien::gdal->data_dir since it issues warnings due to GDAL bug
1432    my $pc = PkgConfig->find('gdal');
1433    if ($pc->errmsg) {
1434        my $dir = Alien::gdal->dist_dir;
1435        my %options = (search_path_override => [$dir . '/lib/pkgconfig']);
1436        $pc = PkgConfig->find('gdal', %options);
1437    }
1438    if ($pc->errmsg) {
1439        warn $pc->errmsg;
1440    } else {
1441        my $dir = $pc->get_var('datadir');
1442        # this gdal.pc bug was fixed in GDAL 2.3.1
1443        # we just hope the one configuring GDAL did not change it to something that ends '/data'
1444        $dir =~ s/\/data$//;
1445        if (opendir(my $dh, $dir)) {
1446            CPLSetConfigOption(GDAL_DATA => $dir);
1447        } else {
1448            my $dist_data_dir = Alien::gdal->dist_dir . '/share/gdal';
1449            if (-d $dist_data_dir) {
1450                CPLSetConfigOption(GDAL_DATA => $dist_data_dir);
1451            }
1452            else {
1453                warn "GDAL data directory ($dir) doesn't exist. Maybe Alien::gdal is not installed?";
1454            }
1455        }
1456    }
1457
1458    $instance = {};
1459    $instance->{ffi} = $ffi;
1460    SetErrorHandling();
1461    GDALAllRegister();
1462    return bless $instance, $class;
1463}
1464
1465sub get_instance {
1466    my $class = shift;
1467    $instance = $class->new() unless $instance;
1468    return $instance;
1469}
1470
1471sub DESTROY {
1472    UnsetErrorHandling();
1473}
1474
1475sub GetVersionInfo {
1476    my $request = shift // 'VERSION_NUM';
1477    return GDALVersionInfo($request);
1478}
1479
1480sub GetDriver {
1481    my ($i) = @_;
1482    my $d = isint($i) ? GDALGetDriver($i) : GDALGetDriverByName($i);
1483    confess error_msg() // "Driver '$i' not found." unless $d;
1484    return bless \$d, 'Geo::GDAL::FFI::Driver';
1485}
1486
1487sub GetDrivers {
1488    my @drivers;
1489    for my $i (0..GDALGetDriverCount()-1) {
1490        push @drivers, GetDriver($i);
1491    }
1492    return @drivers;
1493}
1494
1495sub IdentifyDriver {
1496    my ($filename, $args) = @_;
1497    my $flags = 0;
1498    my $a = $args->{Flags} // [];
1499    for my $f (@$a) {
1500        print "$f\n";
1501        $flags |= $open_flags{$f};
1502    }
1503    print "$flags\n";
1504    my $drivers = 0;
1505    for my $o (@{$args->{AllowedDrivers}}) {
1506        $drivers = Geo::GDAL::FFI::CSLAddString($drivers, $o);
1507    }
1508    my $list = 0;
1509    for my $o (@{$args->{FileList}}) {
1510        $list = Geo::GDAL::FFI::CSLAddString($list, $o);
1511    }
1512    my $d;
1513    if ($flags or $drivers) {
1514        $d = GDALIdentifyDriverEx($filename, $flags, $drivers, $list);
1515    } else {
1516        $d = GDALIdentifyDriver($filename, $list);
1517    }
1518    Geo::GDAL::FFI::CSLDestroy($drivers);
1519    Geo::GDAL::FFI::CSLDestroy($list);
1520    return bless \$d, 'Geo::GDAL::FFI::Driver';
1521}
1522
1523sub Open {
1524    my ($name, $args) = @_;
1525    $name //= '';
1526    $args //= {};
1527    my $flags = 0;
1528    my $a = $args->{Flags} // [];
1529    for my $f (@$a) {
1530        $flags |= $open_flags{$f};
1531    }
1532    my $drivers = 0;
1533    for my $o (@{$args->{AllowedDrivers}}) {
1534        $drivers = Geo::GDAL::FFI::CSLAddString($drivers, $o);
1535    }
1536    my $options = 0;
1537    for my $o (@{$args->{Options}}) {
1538        $options = Geo::GDAL::FFI::CSLAddString($options, $o);
1539    }
1540    my $files = 0;
1541    for my $o (@{$args->{SiblingFiles}}) {
1542        $files = Geo::GDAL::FFI::CSLAddString($files, $o);
1543    }
1544    my $ds = GDALOpenEx($name, $flags, $drivers, $options, $files);
1545    Geo::GDAL::FFI::CSLDestroy($drivers);
1546    Geo::GDAL::FFI::CSLDestroy($options);
1547    Geo::GDAL::FFI::CSLDestroy($files);
1548    if (@errors) {
1549        my $msg = join("\n", @errors);
1550        @errors = ();
1551        confess $msg;
1552    }
1553    unless ($ds) { # no VERBOSE_ERROR in options and fail
1554        confess "Open failed for '$name'. Hint: add VERBOSE_ERROR to open_flags.";
1555    }
1556    return bless \$ds, 'Geo::GDAL::FFI::Dataset';
1557}
1558
1559sub write {
1560    print STDOUT $_[0];
1561}
1562
1563sub close {
1564}
1565
1566sub SetWriter {
1567    my ($self, $writer) = @_;
1568    $writer = $self unless $writer;
1569    my $w = $writer->can('write');
1570    my $c = $writer->can('close');
1571    confess "$writer must be able to write and close." unless $w && $c;
1572    #$self->{write} = $w;
1573    $self->{close} = $c;
1574    $self->{writer} = $self->{ffi}->closure(sub {
1575        my ($buf, $size, $count, $stream) = @_;
1576        $w->(buffer_to_scalar($buf, $size*$count));
1577    });
1578    VSIStdoutSetRedirection($self->{writer}, 0);
1579}
1580
1581sub CloseWriter {
1582    my $self = shift;
1583    $self->{close}->() if $self->{close};
1584    $self->SetWriter;
1585}
1586
1587sub get_importer {
1588    my ($self, $format) = @_;
1589    my $importer = $self->can('OSRImportFrom' . $format);
1590    confess "Spatial reference importer for format '$format' not found!" unless $importer;
1591    return $importer;
1592}
1593
1594sub get_exporter {
1595    my ($self, $format) = @_;
1596    my $exporter = $self->can('OSRExportTo' . $format);
1597    confess "Spatial reference exporter for format '$format' not found!" unless $exporter;
1598    return $exporter;
1599}
1600
1601sub get_setter {
1602    my ($self, $proj) = @_;
1603    my $setter = $self->can('OSRSet' . $proj);
1604    confess "Parameter setter for projection '$proj' not found!" unless $setter;
1605    return $setter;
1606}
1607
1608sub HaveGEOS {
1609    my $t = $geometry_types{Point};
1610    my $g = OGR_G_CreateGeometry($t);
1611    OGR_G_SetPoint($g, 0, 0, 0, 0);
1612    my $c = OGR_G_CreateGeometry($t);
1613    my $n = @errors;
1614    OGR_G_Centroid($g, $c);
1615    if (@errors > $n) {
1616        pop @errors;
1617        return undef;
1618    } else {
1619        return 1;
1620    }
1621}
1622
1623sub SetConfigOption {
1624    my ($key, $default) = @_;
1625    CPLSetConfigOption($key, $default);
1626}
1627
1628sub GetConfigOption {
1629    my ($key, $default) = @_;
1630    return CPLGetConfigOption($key, $default);
1631}
1632
1633sub FindFile {
1634    my ($class, $basename) = @_ == 2 ? @_ : ('', @_);
1635    $class //= '';
1636    $basename //= '';
1637    return CPLFindFile($class, $basename);
1638}
1639
1640sub PushFinderLocation {
1641    my ($location) = @_;
1642    $location //= '';
1643    CPLPushFinderLocation($location);
1644}
1645
1646sub PopFinderLocation {
1647    CPLPopFinderLocation();
1648}
1649
1650sub FinderClean {
1651    CPLFinderClean();
1652}
1653
1654BEGIN {
1655    require PkgConfig;
1656    PkgConfig->import;
1657    require Alien::gdal;
1658    $instance = Geo::GDAL::FFI->new();
1659}
1660
16611;
1662
1663=pod
1664
1665=encoding UTF-8
1666
1667=head1 NAME
1668
1669Geo::GDAL::FFI - A foreign function interface to GDAL
1670
1671=head1 VERSION
1672
1673Version 0.06
1674
1675=head1 SYNOPSIS
1676
1677This is an example of creating a vector dataset.
1678
1679 use Geo::GDAL::FFI qw/GetDriver/;
1680
1681 my $sr = Geo::GDAL::FFI::SpatialReference->new(EPSG => 3067);
1682 my $layer = GetDriver('ESRI Shapefile')
1683     ->Create('test.shp')
1684     ->CreateLayer({
1685         Name => 'test',
1686         SpatialReference => $sr,
1687         GeometryType => 'Point',
1688         Fields => [
1689         {
1690             Name => 'name',
1691             Type => 'String'
1692         }
1693         ]
1694     });
1695 my $f = Geo::GDAL::FFI::Feature->new($layer->GetDefn);
1696 $f->SetField(name => 'a');
1697 my $g = Geo::GDAL::FFI::Geometry->new('Point');
1698 $g->SetPoint(1, 2);
1699 $f->SetGeomField($g);
1700 $layer->CreateFeature($f);
1701
1702This is an example of reading a vector dataset.
1703
1704 use Geo::GDAL::FFI qw/Open/;
1705
1706 my $layer = Open('test.shp')->GetLayer;
1707 $layer->ResetReading;
1708 while (my $feature = $layer->GetNextFeature) {
1709     my $value = $feature->GetField('name');
1710     my $geom = $feature->GetGeomField;
1711     say $value, ' ', $geom->AsText;
1712 }
1713
1714This is an example of creating a raster dataset.
1715
1716 use Geo::GDAL::FFI qw/GetDriver/;
1717
1718 my $tiff = GetDriver('GTiff')->Create('test.tiff', 3, 2);
1719 my $ogc_wkt =
1720        'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS84",6378137,298.257223563,'.
1721        'AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,'.
1722        'AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,'.
1723        'AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]';
1724 $tiff->SetProjectionString($ogc_wkt);
1725 my $transform = [10,2,0,20,0,3];
1726 $tiff->SetGeoTransform($transform);
1727 my $data = [[0,1,2],[3,4,5]];
1728 $tiff->GetBand->Write($data);
1729
1730This is an example of reading a raster dataset. Note that using L<PDL>
1731and L<MCE::Shared> can greatly reduce the time needed to process large
1732raster datasets.
1733
1734 use Geo::GDAL::FFI qw/Open/;
1735
1736 my $band = Open($ARGV[0])->GetBand;
1737 my ($w_band, $h_band) = $band->GetSize;
1738 my ($w_block, $h_block) = $band->GetBlockSize;
1739 my $nodata = $band->GetNoDataValue;
1740 my ($xoff, $yoff) = (0,0);
1741 my ($min, $max);
1742
1743 while (1) {
1744     if ($xoff >= $w_band) {
1745         $xoff = 0;
1746         $yoff += $h_block;
1747         last if $yoff >= $h_band;
1748     }
1749     my $w_real = $w_band - $xoff;
1750     $w_real = $w_block if $w_real > $w_block;
1751     my $h_real = $h_band - $yoff;
1752     $h_real = $h_block if $h_real > $h_block;
1753
1754     my $data = $band->Read($xoff, $yoff, $w_real, $h_real);
1755
1756     for my $y (0..$#$data) {
1757         my $row = $data->[$y];
1758         for my $x (0..$#$row) {
1759             my $value = $row->[$x];
1760             next if defined $nodata && $value == $nodata;
1761             $min = $value if !defined $min || $value < $min;
1762             $max = $value if !defined $max || $value > $max;
1763         }
1764     }
1765
1766     $xoff += $w_block;
1767 }
1768
1769 say "min = $min, max = $max";
1770
1771=head1 DESCRIPTION
1772
1773This is a foreign function interface to the GDAL geospatial data
1774access library.
1775
1776=head1 IMPORTABLE FUNCTIONS
1777
1778The most important importable functions are GetDriver and Open, which
1779return a driver and a dataset objects respectively. GetDrivers returns
1780all available drivers as objects.
1781
1782Other importable functions include error handling configuration
1783(SetErrorHandling and UnsetErrorHandling), functions that return lists
1784of strings that are used in methods (Capabilities, OpenFlags,
1785DataTypes, ResamplingMethods, FieldTypes, FieldSubtypes,
1786Justifications, ColorInterpretations, GeometryTypes, GeometryFormats,
1787GridAlgorithms), also functions GetVersionInfo, HaveGEOS,
1788SetConfigOption, GetConfigOption, FindFile, PushFinderLocation,
1789PopFinderLocation, and FinderClean can be imported.
1790
1791:all imports all above functions.
1792
1793=head2 GetVersionInfo
1794
1795 my $info = GetVersionInfo($request);
1796
1797Returns the version information from the underlying GDAL
1798library. $request is optional and by default 'VERSION_NUM'.
1799
1800=head2 GetDriver
1801
1802 my $driver = GetDriver($name);
1803
1804Returns the specific driver object.
1805
1806=head2 GetDrivers
1807
1808Returns a list of all available driver objects.
1809
1810=head2 Open
1811
1812 my $dataset = Open($name, {Flags => [qw/READONLY/], ...});
1813
1814Open a dataset. $name is the name of the dataset. Named arguments are
1815the following.
1816
1817=over 4
1818
1819=item C<Flags>
1820
1821Optional, default is a reference to an empty array. Note that some
1822drivers can open both raster and vector datasets.
1823
1824=item C<AllowedDrivers>
1825
1826Optional, default is all drivers. Use a reference to an array of
1827driver names to limit which drivers to test.
1828
1829=item C<SiblingFiles>
1830
1831Optional, default is to probe the file system. You may use a reference
1832to an array of auxiliary file names.
1833
1834=item C<Options>
1835
1836Optional, a reference to an array of driver specific open
1837options. Consult the main GDAL documentation for open options.
1838
1839=back
1840
1841=head2 Capabilities
1842
1843Returns the list of capabilities (strings) a GDAL major object
1844(Driver, Dataset, Band, or Layer in Geo::GDAL::FFI) can have.
1845
1846=head2 OpenFlags
1847
1848Returns the list of opening flags to be used in the Open method.
1849
1850=head2 DataTypes
1851
1852Returns the list of raster cell data types to be used in e.g. the
1853CreateDataset method of the Driver class.
1854
1855=head2 FieldTypes
1856
1857Returns the list of field types.
1858
1859=head2 FieldSubtypes
1860
1861Returns the list of field subtypes.
1862
1863=head2 Justifications
1864
1865Returns the list of field justifications.
1866
1867=head2 ColorInterpretations
1868
1869Returns the list of color interpretations.
1870
1871=head2 GeometryTypes
1872
1873Returns the list of geometry types.
1874
1875=head2 SetErrorHandling
1876
1877Set a Perl function to catch errors reported within GDAL with
1878CPLError. The errors are collected into @Geo::GDAL::FFI::errors and
1879confessed if a method fails. This is the default.
1880
1881=head2 UnsetErrorHandling
1882
1883Unset the Perl function to catch GDAL errors. If no other error
1884handler is set, GDAL prints the errors into stderr.
1885
1886=head1 METHODS
1887
1888=head2 get_instance
1889
1890 my $gdal = Geo::GDAL::FFI->get_instance;
1891
1892Obtain the Geo::GDAL::FFI singleton object. The object is usually not needed.
1893
1894=head1 LICENSE
1895
1896This software is released under the Artistic License. See
1897L<perlartistic>.
1898
1899=head1 AUTHOR
1900
1901Ari Jolma - Ari.Jolma at gmail.com
1902
1903=head1 SEE ALSO
1904
1905L<Geo::GDAL::FFI::Object>
1906
1907L<Geo::GDAL::FFI::Driver>
1908
1909L<Geo::GDAL::FFI::SpatialReference>
1910
1911L<Geo::GDAL::FFI::Dataset>
1912
1913L<Geo::GDAL::FFI::Band>
1914
1915L<Geo::GDAL::FFI::FeatureDefn>
1916
1917L<Geo::GDAL::FFI::FieldDefn>
1918
1919L<Geo::GDAL::FFI::GeomFieldDefn>
1920
1921L<Geo::GDAL::FFI::Layer>
1922
1923L<Geo::GDAL::FFI::Feature>
1924
1925L<Geo::GDAL::FFI::Geometry>
1926
1927L<Geo::GDAL::FFI::VSI>
1928
1929L<Geo::GDAL::FFI::VSI::File>
1930
1931L<Alien::gdal>, L<FFI::Platypus>, L<http://www.gdal.org>
1932
1933=cut
1934
1935__END__;
1936