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