1 /****************************************************************************** 2 * $Id: gdal_alg.h d8114610ec3abbffbfce3dfbd353ea53ac81c013 2021-03-04 05:38:17 -0500 John Papadakis $ 3 * 4 * Project: GDAL Image Processing Algorithms 5 * Purpose: Prototypes, and definitions for various GDAL based algorithms. 6 * Author: Frank Warmerdam, warmerdam@pobox.com 7 * 8 ****************************************************************************** 9 * Copyright (c) 2001, Frank Warmerdam 10 * Copyright (c) 2008-2012, Even Rouault <even dot rouault at spatialys.com> 11 * 12 * Permission is hereby granted, free of charge, to any person obtaining a 13 * copy of this software and associated documentation files (the "Software"), 14 * to deal in the Software without restriction, including without limitation 15 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 16 * and/or sell copies of the Software, and to permit persons to whom the 17 * Software is furnished to do so, subject to the following conditions: 18 * 19 * The above copyright notice and this permission notice shall be included 20 * in all copies or substantial portions of the Software. 21 * 22 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 23 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 25 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 26 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 27 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 28 * DEALINGS IN THE SOFTWARE. 29 ****************************************************************************/ 30 31 #ifndef GDAL_ALG_H_INCLUDED 32 #define GDAL_ALG_H_INCLUDED 33 34 /** 35 * \file gdal_alg.h 36 * 37 * Public (C callable) GDAL algorithm entry points, and definitions. 38 */ 39 40 #ifndef DOXYGEN_SKIP 41 #include "gdal.h" 42 #include "cpl_minixml.h" 43 #include "ogr_api.h" 44 #endif 45 46 CPL_C_START 47 48 int CPL_DLL CPL_STDCALL GDALComputeMedianCutPCT( GDALRasterBandH hRed, 49 GDALRasterBandH hGreen, 50 GDALRasterBandH hBlue, 51 int (*pfnIncludePixel)(int,int,void*), 52 int nColors, 53 GDALColorTableH hColorTable, 54 GDALProgressFunc pfnProgress, 55 void * pProgressArg ); 56 57 int CPL_DLL CPL_STDCALL GDALDitherRGB2PCT( GDALRasterBandH hRed, 58 GDALRasterBandH hGreen, 59 GDALRasterBandH hBlue, 60 GDALRasterBandH hTarget, 61 GDALColorTableH hColorTable, 62 GDALProgressFunc pfnProgress, 63 void * pProgressArg ); 64 65 int CPL_DLL CPL_STDCALL GDALChecksumImage( GDALRasterBandH hBand, 66 int nXOff, int nYOff, int nXSize, int nYSize ); 67 68 CPLErr CPL_DLL CPL_STDCALL 69 GDALComputeProximity( GDALRasterBandH hSrcBand, 70 GDALRasterBandH hProximityBand, 71 char **papszOptions, 72 GDALProgressFunc pfnProgress, 73 void * pProgressArg ); 74 75 CPLErr CPL_DLL CPL_STDCALL 76 GDALFillNodata( GDALRasterBandH hTargetBand, 77 GDALRasterBandH hMaskBand, 78 double dfMaxSearchDist, 79 int bDeprecatedOption, 80 int nSmoothingIterations, 81 char **papszOptions, 82 GDALProgressFunc pfnProgress, 83 void * pProgressArg ); 84 85 CPLErr CPL_DLL CPL_STDCALL 86 GDALPolygonize( GDALRasterBandH hSrcBand, 87 GDALRasterBandH hMaskBand, 88 OGRLayerH hOutLayer, int iPixValField, 89 char **papszOptions, 90 GDALProgressFunc pfnProgress, 91 void * pProgressArg ); 92 93 CPLErr CPL_DLL CPL_STDCALL 94 GDALFPolygonize( GDALRasterBandH hSrcBand, 95 GDALRasterBandH hMaskBand, 96 OGRLayerH hOutLayer, int iPixValField, 97 char **papszOptions, 98 GDALProgressFunc pfnProgress, 99 void * pProgressArg ); 100 101 CPLErr CPL_DLL CPL_STDCALL 102 GDALSieveFilter( GDALRasterBandH hSrcBand, GDALRasterBandH hMaskBand, 103 GDALRasterBandH hDstBand, 104 int nSizeThreshold, int nConnectedness, 105 char **papszOptions, 106 GDALProgressFunc pfnProgress, 107 void * pProgressArg ); 108 109 /* 110 * Warp Related. 111 */ 112 113 typedef int 114 (*GDALTransformerFunc)( void *pTransformerArg, 115 int bDstToSrc, int nPointCount, 116 double *x, double *y, double *z, int *panSuccess ); 117 118 /*! @cond Doxygen_Suppress */ 119 #define GDAL_GTI2_SIGNATURE "GTI2" 120 121 typedef struct { 122 GByte abySignature[4]; 123 const char *pszClassName; 124 GDALTransformerFunc pfnTransform; 125 void (*pfnCleanup)( void * pTransformerArg ); 126 CPLXMLNode *(*pfnSerialize)( void * pTransformerArg ); 127 void* (*pfnCreateSimilar)( void* pTransformerArg, double dfSrcRatioX, double dfSrcRatioY ); 128 } GDALTransformerInfo; 129 /*! @endcond */ 130 131 /*! @cond Doxygen_Suppress */ 132 void CPL_DLL GDALDestroyTransformer( void *pTransformerArg ); 133 int CPL_DLL GDALUseTransformer( void *pTransformerArg, 134 int bDstToSrc, int nPointCount, 135 double *x, double *y, double *z, 136 int *panSuccess ); 137 void* GDALCreateSimilarTransformer( void* psTransformerArg, double dfSrcRatioX, double dfSrcRatioY ); 138 /*! @endcond */ 139 140 /* High level transformer for going from image coordinates on one file 141 to image coordinates on another, potentially doing reprojection, 142 utilizing GCPs or using the geotransform. */ 143 144 void CPL_DLL * 145 GDALCreateGenImgProjTransformer( GDALDatasetH hSrcDS, const char *pszSrcWKT, 146 GDALDatasetH hDstDS, const char *pszDstWKT, 147 int bGCPUseOK, double dfGCPErrorThreshold, 148 int nOrder ); 149 void CPL_DLL * 150 GDALCreateGenImgProjTransformer2( GDALDatasetH hSrcDS, GDALDatasetH hDstDS, 151 char **papszOptions ); 152 void CPL_DLL * 153 GDALCreateGenImgProjTransformer3( const char *pszSrcWKT, 154 const double *padfSrcGeoTransform, 155 const char *pszDstWKT, 156 const double *padfDstGeoTransform ); 157 158 void CPL_DLL * 159 GDALCreateGenImgProjTransformer4( OGRSpatialReferenceH hSrcSRS, 160 const double *padfSrcGeoTransform, 161 OGRSpatialReferenceH hDstSRS, 162 const double *padfDstGeoTransform, 163 const char* const *papszOptions ); 164 165 void CPL_DLL GDALSetGenImgProjTransformerDstGeoTransform( void *, 166 const double * ); 167 void CPL_DLL GDALDestroyGenImgProjTransformer( void * ); 168 int CPL_DLL GDALGenImgProjTransform( 169 void *pTransformArg, int bDstToSrc, int nPointCount, 170 double *x, double *y, double *z, int *panSuccess ); 171 172 void GDALSetTransformerDstGeoTransform( void *, const double * ); 173 void GDALGetTransformerDstGeoTransform( void*, double* ); 174 175 /* Geo to geo reprojection transformer. */ 176 void CPL_DLL * 177 GDALCreateReprojectionTransformer( const char *pszSrcWKT, 178 const char *pszDstWKT ); 179 void CPL_DLL * 180 GDALCreateReprojectionTransformerEx( 181 OGRSpatialReferenceH hSrcSRS, 182 OGRSpatialReferenceH hDstSRS, 183 const char* const *papszOptions); 184 void CPL_DLL GDALDestroyReprojectionTransformer( void * ); 185 int CPL_DLL GDALReprojectionTransform( 186 void *pTransformArg, int bDstToSrc, int nPointCount, 187 double *x, double *y, double *z, int *panSuccess ); 188 189 /* GCP based transformer ... forward is to georef coordinates */ 190 void CPL_DLL * 191 GDALCreateGCPTransformer( int nGCPCount, const GDAL_GCP *pasGCPList, 192 int nReqOrder, int bReversed ); 193 194 /* GCP based transformer with refinement of the GCPs ... forward is to georef coordinates */ 195 void CPL_DLL * 196 GDALCreateGCPRefineTransformer( int nGCPCount, const GDAL_GCP *pasGCPList, 197 int nReqOrder, int bReversed, double tolerance, int minimumGcps); 198 199 void CPL_DLL GDALDestroyGCPTransformer( void *pTransformArg ); 200 int CPL_DLL GDALGCPTransform( 201 void *pTransformArg, int bDstToSrc, int nPointCount, 202 double *x, double *y, double *z, int *panSuccess ); 203 204 /* Thin Plate Spine transformer ... forward is to georef coordinates */ 205 206 void CPL_DLL * 207 GDALCreateTPSTransformer( int nGCPCount, const GDAL_GCP *pasGCPList, 208 int bReversed ); 209 void CPL_DLL GDALDestroyTPSTransformer( void *pTransformArg ); 210 int CPL_DLL GDALTPSTransform( 211 void *pTransformArg, int bDstToSrc, int nPointCount, 212 double *x, double *y, double *z, int *panSuccess ); 213 214 /*! @cond Doxygen_Suppress */ 215 #ifdef GDAL_COMPILATION 216 #define RPCInfoV1ToMD RPCInfoToMD 217 #else 218 #define RPCInfoToMD RPCInfoV2ToMD 219 #endif 220 char CPL_DLL ** RPCInfoV1ToMD( GDALRPCInfoV1 *psRPCInfo ); 221 char CPL_DLL ** RPCInfoV2ToMD( GDALRPCInfoV2 *psRPCInfo ); 222 /*! @endcond */ 223 224 /* RPC based transformer ... src is pixel/line/elev, dst is long/lat/elev */ 225 226 /*! @cond Doxygen_Suppress */ 227 #ifdef GDAL_COMPILATION 228 #define GDALCreateRPCTransformerV1 GDALCreateRPCTransformer 229 #else 230 #define GDALCreateRPCTransformer GDALCreateRPCTransformerV2 231 #endif 232 233 void CPL_DLL * 234 GDALCreateRPCTransformerV1( GDALRPCInfoV1 *psRPC, int bReversed, 235 double dfPixErrThreshold, 236 char **papszOptions ); 237 /*! @endcond */ 238 239 void CPL_DLL * 240 GDALCreateRPCTransformerV2( const GDALRPCInfoV2 *psRPC, int bReversed, 241 double dfPixErrThreshold, 242 char **papszOptions ); 243 244 void CPL_DLL GDALDestroyRPCTransformer( void *pTransformArg ); 245 int CPL_DLL GDALRPCTransform( 246 void *pTransformArg, int bDstToSrc, int nPointCount, 247 double *x, double *y, double *z, int *panSuccess ); 248 249 /* Geolocation transformer */ 250 251 void CPL_DLL * 252 GDALCreateGeoLocTransformer( GDALDatasetH hBaseDS, 253 char **papszGeolocationInfo, 254 int bReversed ); 255 void CPL_DLL GDALDestroyGeoLocTransformer( void *pTransformArg ); 256 int CPL_DLL GDALGeoLocTransform( 257 void *pTransformArg, int bDstToSrc, int nPointCount, 258 double *x, double *y, double *z, int *panSuccess ); 259 260 /* Approximate transformer */ 261 void CPL_DLL * 262 GDALCreateApproxTransformer( GDALTransformerFunc pfnRawTransformer, 263 void *pRawTransformerArg, double dfMaxError ); 264 void CPL_DLL GDALApproxTransformerOwnsSubtransformer( void *pCBData, 265 int bOwnFlag ); 266 void CPL_DLL GDALDestroyApproxTransformer( void *pApproxArg ); 267 int CPL_DLL GDALApproxTransform( 268 void *pTransformArg, int bDstToSrc, int nPointCount, 269 double *x, double *y, double *z, int *panSuccess ); 270 271 int CPL_DLL CPL_STDCALL 272 GDALSimpleImageWarp( GDALDatasetH hSrcDS, 273 GDALDatasetH hDstDS, 274 int nBandCount, int *panBandList, 275 GDALTransformerFunc pfnTransform, 276 void *pTransformArg, 277 GDALProgressFunc pfnProgress, 278 void *pProgressArg, 279 char **papszWarpOptions ); 280 281 CPLErr CPL_DLL CPL_STDCALL 282 GDALSuggestedWarpOutput( GDALDatasetH hSrcDS, 283 GDALTransformerFunc pfnTransformer, 284 void *pTransformArg, 285 double *padfGeoTransformOut, 286 int *pnPixels, int *pnLines ); 287 CPLErr CPL_DLL CPL_STDCALL 288 GDALSuggestedWarpOutput2( GDALDatasetH hSrcDS, 289 GDALTransformerFunc pfnTransformer, 290 void *pTransformArg, 291 double *padfGeoTransformOut, 292 int *pnPixels, int *pnLines, 293 double *padfExtents, 294 int nOptions ); 295 296 /*! @cond Doxygen_Suppress */ 297 CPLXMLNode CPL_DLL * 298 GDALSerializeTransformer( GDALTransformerFunc pfnFunc, void *pTransformArg ); 299 CPLErr CPL_DLL GDALDeserializeTransformer( CPLXMLNode *psTree, 300 GDALTransformerFunc *ppfnFunc, 301 void **ppTransformArg ); 302 /*! @endcond */ 303 304 CPLErr CPL_DLL 305 GDALTransformGeolocations( GDALRasterBandH hXBand, 306 GDALRasterBandH hYBand, 307 GDALRasterBandH hZBand, 308 GDALTransformerFunc pfnTransformer, 309 void *pTransformArg, 310 GDALProgressFunc pfnProgress, 311 void *pProgressArg, 312 char **papszOptions ); 313 314 /* -------------------------------------------------------------------- */ 315 /* Contour Line Generation */ 316 /* -------------------------------------------------------------------- */ 317 318 /** Contour writer callback type */ 319 typedef CPLErr (*GDALContourWriter)( double dfLevel, int nPoints, 320 double *padfX, double *padfY, void * ); 321 322 /** Contour generator opaque type */ 323 typedef void *GDALContourGeneratorH; 324 325 GDALContourGeneratorH CPL_DLL 326 GDAL_CG_Create( int nWidth, int nHeight, 327 int bNoDataSet, double dfNoDataValue, 328 double dfContourInterval, double dfContourBase, 329 GDALContourWriter pfnWriter, void *pCBData ); 330 CPLErr CPL_DLL GDAL_CG_FeedLine( GDALContourGeneratorH hCG, 331 double *padfScanline ); 332 void CPL_DLL GDAL_CG_Destroy( GDALContourGeneratorH hCG ); 333 334 /*! @cond Doxygen_Suppress */ 335 typedef struct 336 { 337 void *hLayer; 338 339 double adfGeoTransform[6]; 340 341 int nElevField; 342 int nElevFieldMin; 343 int nElevFieldMax; 344 int nIDField; 345 int nNextID; 346 } OGRContourWriterInfo; 347 348 CPLErr CPL_DLL 349 OGRContourWriter( double, int, double *, double *, void *pInfo ); 350 /*! @endcond */ 351 352 CPLErr CPL_DLL 353 GDALContourGenerate( GDALRasterBandH hBand, 354 double dfContourInterval, double dfContourBase, 355 int nFixedLevelCount, double *padfFixedLevels, 356 int bUseNoData, double dfNoDataValue, 357 void *hLayer, int iIDField, int iElevField, 358 GDALProgressFunc pfnProgress, void *pProgressArg ); 359 360 CPLErr CPL_DLL 361 GDALContourGenerateEx( GDALRasterBandH hBand, void *hLayer, 362 CSLConstList options, 363 GDALProgressFunc pfnProgress, void *pProgressArg ); 364 365 /* -------------------------------------------------------------------- */ 366 /* Viewshed Generation */ 367 /* -------------------------------------------------------------------- */ 368 369 /** Viewshed Modes */ 370 typedef enum { 371 GVM_Diagonal = 1, 372 GVM_Edge = 2, 373 GVM_Max = 3, 374 GVM_Min = 4 375 } GDALViewshedMode; 376 377 /** Viewshed output types */ 378 typedef enum { 379 GVOT_NORMAL = 1, 380 GVOT_MIN_TARGET_HEIGHT_FROM_DEM = 2, 381 GVOT_MIN_TARGET_HEIGHT_FROM_GROUND = 3 382 } GDALViewshedOutputType; 383 384 GDALDatasetH CPL_DLL 385 GDALViewshedGenerate(GDALRasterBandH hBand, 386 const char* pszDriverName, 387 const char* pszTargetRasterName, 388 CSLConstList papszCreationOptions, 389 double dfObserverX, double dfObserverY, double dfObserverHeight, 390 double dfTargetHeight, double dfVisibleVal, double dfInvisibleVal, 391 double dfOutOfRangeVal, double dfNoDataVal, double dfCurvCoeff, 392 GDALViewshedMode eMode, double dfMaxDistance, 393 GDALProgressFunc pfnProgress, void *pProgressArg, 394 GDALViewshedOutputType heightMode, CSLConstList papszExtraOptions); 395 396 /************************************************************************/ 397 /* Rasterizer API - geometries burned into GDAL raster. */ 398 /************************************************************************/ 399 400 CPLErr CPL_DLL 401 GDALRasterizeGeometries( GDALDatasetH hDS, 402 int nBandCount, int *panBandList, 403 int nGeomCount, OGRGeometryH *pahGeometries, 404 GDALTransformerFunc pfnTransformer, 405 void *pTransformArg, 406 double *padfGeomBurnValue, 407 char **papszOptions, 408 GDALProgressFunc pfnProgress, 409 void * pProgressArg ); 410 CPLErr CPL_DLL 411 GDALRasterizeLayers( GDALDatasetH hDS, 412 int nBandCount, int *panBandList, 413 int nLayerCount, OGRLayerH *pahLayers, 414 GDALTransformerFunc pfnTransformer, 415 void *pTransformArg, 416 double *padfLayerBurnValues, 417 char **papszOptions, 418 GDALProgressFunc pfnProgress, 419 void *pProgressArg ); 420 421 CPLErr CPL_DLL 422 GDALRasterizeLayersBuf( void *pData, int nBufXSize, int nBufYSize, 423 GDALDataType eBufType, int nPixelSpace, int nLineSpace, 424 int nLayerCount, OGRLayerH *pahLayers, 425 const char *pszDstProjection, 426 double *padfDstGeoTransform, 427 GDALTransformerFunc pfnTransformer, 428 void *pTransformArg, double dfBurnValue, 429 char **papszOptions, GDALProgressFunc pfnProgress, 430 void *pProgressArg ); 431 432 /************************************************************************/ 433 /* Gridding interface. */ 434 /************************************************************************/ 435 436 /** Gridding Algorithms */ 437 typedef enum { 438 /*! Inverse distance to a power */ GGA_InverseDistanceToAPower = 1, 439 /*! Moving Average */ GGA_MovingAverage = 2, 440 /*! Nearest Neighbor */ GGA_NearestNeighbor = 3, 441 /*! Minimum Value (Data Metric) */ GGA_MetricMinimum = 4, 442 /*! Maximum Value (Data Metric) */ GGA_MetricMaximum = 5, 443 /*! Data Range (Data Metric) */ GGA_MetricRange = 6, 444 /*! Number of Points (Data Metric) */ GGA_MetricCount = 7, 445 /*! Average Distance (Data Metric) */ GGA_MetricAverageDistance = 8, 446 /*! Average Distance Between Data Points (Data Metric) */ 447 GGA_MetricAverageDistancePts = 9, 448 /*! Linear interpolation (from Delaunay triangulation. Since GDAL 2.1 */ 449 GGA_Linear = 10, 450 /*! Inverse distance to a power with nearest neighbor search for max points */ 451 GGA_InverseDistanceToAPowerNearestNeighbor = 11 452 } GDALGridAlgorithm; 453 454 /** Inverse distance to a power method control options */ 455 typedef struct 456 { 457 /*! Weighting power. */ 458 double dfPower; 459 /*! Smoothing parameter. */ 460 double dfSmoothing; 461 /*! Reserved for future use. */ 462 double dfAnisotropyRatio; 463 /*! Reserved for future use. */ 464 double dfAnisotropyAngle; 465 /*! The first radius (X axis if rotation angle is 0) of search ellipse. */ 466 double dfRadius1; 467 /*! The second radius (Y axis if rotation angle is 0) of search ellipse. */ 468 double dfRadius2; 469 /*! Angle of ellipse rotation in degrees. 470 * 471 * Ellipse rotated counter clockwise. 472 */ 473 double dfAngle; 474 /*! Maximum number of data points to use. 475 * 476 * Do not search for more points than this number. 477 * If less amount of points found the grid node considered empty and will 478 * be filled with NODATA marker. 479 */ 480 GUInt32 nMaxPoints; 481 /*! Minimum number of data points to use. 482 * 483 * If less amount of points found the grid node considered empty and will 484 * be filled with NODATA marker. 485 */ 486 GUInt32 nMinPoints; 487 /*! No data marker to fill empty points. */ 488 double dfNoDataValue; 489 } GDALGridInverseDistanceToAPowerOptions; 490 491 /** Inverse distance to a power, with nearest neighbour search, control options */ 492 typedef struct 493 { 494 /*! Weighting power. */ 495 double dfPower; 496 /*! The radius of search circle. */ 497 double dfRadius; 498 /*! Smoothing parameter. */ 499 double dfSmoothing; 500 501 /*! Maximum number of data points to use. 502 * 503 * Do not search for more points than this number. 504 * If less amount of points found the grid node considered empty and will 505 * be filled with NODATA marker. 506 */ 507 GUInt32 nMaxPoints; 508 /*! Minimum number of data points to use. 509 * 510 * If less amount of points found the grid node considered empty and will 511 * be filled with NODATA marker. 512 */ 513 GUInt32 nMinPoints; 514 /*! No data marker to fill empty points. */ 515 double dfNoDataValue; 516 } GDALGridInverseDistanceToAPowerNearestNeighborOptions; 517 518 /** Moving average method control options */ 519 typedef struct 520 { 521 /*! The first radius (X axis if rotation angle is 0) of search ellipse. */ 522 double dfRadius1; 523 /*! The second radius (Y axis if rotation angle is 0) of search ellipse. */ 524 double dfRadius2; 525 /*! Angle of ellipse rotation in degrees. 526 * 527 * Ellipse rotated counter clockwise. 528 */ 529 double dfAngle; 530 /*! Minimum number of data points to average. 531 * 532 * If less amount of points found the grid node considered empty and will 533 * be filled with NODATA marker. 534 */ 535 GUInt32 nMinPoints; 536 /*! No data marker to fill empty points. */ 537 double dfNoDataValue; 538 } GDALGridMovingAverageOptions; 539 540 /** Nearest neighbor method control options */ 541 typedef struct 542 { 543 /*! The first radius (X axis if rotation angle is 0) of search ellipse. */ 544 double dfRadius1; 545 /*! The second radius (Y axis if rotation angle is 0) of search ellipse. */ 546 double dfRadius2; 547 /*! Angle of ellipse rotation in degrees. 548 * 549 * Ellipse rotated counter clockwise. 550 */ 551 double dfAngle; 552 /*! No data marker to fill empty points. */ 553 double dfNoDataValue; 554 } GDALGridNearestNeighborOptions; 555 556 /** Data metrics method control options */ 557 typedef struct 558 { 559 /*! The first radius (X axis if rotation angle is 0) of search ellipse. */ 560 double dfRadius1; 561 /*! The second radius (Y axis if rotation angle is 0) of search ellipse. */ 562 double dfRadius2; 563 /*! Angle of ellipse rotation in degrees. 564 * 565 * Ellipse rotated counter clockwise. 566 */ 567 double dfAngle; 568 /*! Minimum number of data points to average. 569 * 570 * If less amount of points found the grid node considered empty and will 571 * be filled with NODATA marker. 572 */ 573 GUInt32 nMinPoints; 574 /*! No data marker to fill empty points. */ 575 double dfNoDataValue; 576 } GDALGridDataMetricsOptions; 577 578 /** Linear method control options */ 579 typedef struct 580 { 581 /*! In case the point to be interpolated does not fit into a triangle of 582 * the Delaunay triangulation, use that maximum distance to search a nearest 583 * neighbour, or use nodata otherwise. If set to -1, the search distance is infinite. 584 * If set to 0, nodata value will be always used. 585 */ 586 double dfRadius; 587 /*! No data marker to fill empty points. */ 588 double dfNoDataValue; 589 } GDALGridLinearOptions; 590 591 CPLErr CPL_DLL 592 GDALGridCreate( GDALGridAlgorithm, const void *, GUInt32, 593 const double *, const double *, const double *, 594 double, double, double, double, 595 GUInt32, GUInt32, GDALDataType, void *, 596 GDALProgressFunc, void *); 597 598 /** Grid context opaque type */ 599 typedef struct GDALGridContext GDALGridContext; 600 601 GDALGridContext CPL_DLL* 602 GDALGridContextCreate( GDALGridAlgorithm eAlgorithm, const void *poOptions, 603 GUInt32 nPoints, 604 const double *padfX, const double *padfY, const double *padfZ, 605 int bCallerWillKeepPointArraysAlive ); 606 607 void CPL_DLL GDALGridContextFree(GDALGridContext* psContext); 608 609 CPLErr CPL_DLL GDALGridContextProcess(GDALGridContext* psContext, 610 double dfXMin, double dfXMax, double dfYMin, double dfYMax, 611 GUInt32 nXSize, GUInt32 nYSize, GDALDataType eType, void *pData, 612 GDALProgressFunc pfnProgress, void *pProgressArg ); 613 614 GDAL_GCP CPL_DLL * 615 GDALComputeMatchingPoints( GDALDatasetH hFirstImage, 616 GDALDatasetH hSecondImage, 617 char **papszOptions, 618 int *pnGCPCount ); 619 620 /************************************************************************/ 621 /* Delaunay triangulation interface. */ 622 /************************************************************************/ 623 624 /** Triangle fact */ 625 typedef struct 626 { 627 int anVertexIdx[3]; /**< index to the padfX/padfY arrays */ 628 int anNeighborIdx[3]; /**< index to GDALDelaunayTriangulation.pasFacets, or -1 */ 629 /* anNeighborIdx[k] is the triangle to the opposite side */ 630 /* of the opposite segment of anVertexIdx[k] */ 631 } GDALTriFacet; 632 633 /** Triangle barycentric coefficients. 634 * 635 * Conversion from cartesian (x,y) to barycentric (l1,l2,l3) with : 636 * l1 = dfMul1X * (x - dfCxtX) + dfMul1Y * (y - dfCstY) 637 * l2 = dfMul2X * (x - dfCxtX) + dfMul2Y * (y - dfCstY) 638 * l3 = 1 - l1 - l2 639 */ 640 typedef struct 641 { 642 double dfMul1X; /**< dfMul1X */ 643 double dfMul1Y; /**< dfMul1Y */ 644 double dfMul2X; /**< dfMul2X */ 645 double dfMul2Y; /**< dfMul2Y */ 646 double dfCstX; /**< dfCstX */ 647 double dfCstY; /**< dfCstY */ 648 } GDALTriBarycentricCoefficients; 649 650 /** Triangulation structure */ 651 typedef struct 652 { 653 int nFacets; /**< number of facets */ 654 GDALTriFacet *pasFacets; /**< array of nFacets facets */ 655 GDALTriBarycentricCoefficients *pasFacetCoefficients; /**< arra of nFacets barycentric coefficients */ 656 } GDALTriangulation; 657 658 int CPL_DLL GDALHasTriangulation(void); 659 660 GDALTriangulation CPL_DLL *GDALTriangulationCreateDelaunay(int nPoints, 661 const double* padfX, 662 const double* padfY); 663 int CPL_DLL GDALTriangulationComputeBarycentricCoefficients( 664 GDALTriangulation* psDT, 665 const double* padfX, 666 const double* padfY); 667 int CPL_DLL GDALTriangulationComputeBarycentricCoordinates( 668 const GDALTriangulation* psDT, 669 int nFacetIdx, 670 double dfX, 671 double dfY, 672 double* pdfL1, 673 double* pdfL2, 674 double* pdfL3); 675 int CPL_DLL GDALTriangulationFindFacetBruteForce( const GDALTriangulation* psDT, 676 double dfX, 677 double dfY, 678 int* panOutputFacetIdx ); 679 int CPL_DLL GDALTriangulationFindFacetDirected( const GDALTriangulation* psDT, 680 int nFacetIdx, 681 double dfX, 682 double dfY, 683 int* panOutputFacetIdx ); 684 void CPL_DLL GDALTriangulationFree(GDALTriangulation* psDT); 685 686 /*! @cond Doxygen_Suppress */ 687 // GDAL internal use only 688 void GDALTriangulationTerminate(void); 689 /*! @endcond */ 690 691 GDALDatasetH CPL_DLL GDALOpenVerticalShiftGrid( 692 const char* pszProj4Geoidgrids, 693 int* pbError ); 694 695 GDALDatasetH CPL_DLL GDALApplyVerticalShiftGrid( GDALDatasetH hSrcDataset, 696 GDALDatasetH hGridDataset, 697 int bInverse, 698 double dfSrcUnitToMeter, 699 double dfDstUnitToMeter, 700 const char* const* papszOptions ); 701 702 CPL_C_END 703 704 #endif /* ndef GDAL_ALG_H_INCLUDED */ 705