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