Line data Source code
1 : /******************************************************************************
2 : *
3 : * Project: OpenGIS Simple Features Reference Implementation
4 : * Purpose: Define some core portability services for cross-platform OGR code.
5 : * Author: Frank Warmerdam, warmerdam@pobox.com
6 : *
7 : ******************************************************************************
8 : * Copyright (c) 1999, Frank Warmerdam
9 : * Copyright (c) 2007-2014, Even Rouault <even dot rouault at spatialys.com>
10 : *
11 : * SPDX-License-Identifier: MIT
12 : ****************************************************************************/
13 :
14 : #ifndef OGR_CORE_H_INCLUDED
15 : #define OGR_CORE_H_INCLUDED
16 :
17 : #include "cpl_port.h"
18 : #if defined(GDAL_COMPILATION)
19 : #define DO_NOT_DEFINE_GDAL_DATE_NAME
20 : #endif
21 : #include "gdal_version.h"
22 :
23 : /**
24 : * \file
25 : *
26 : * Core portability services for cross-platform OGR code.
27 : */
28 :
29 : #if defined(__cplusplus) && !defined(CPL_SUPRESS_CPLUSPLUS)
30 :
31 : extern "C++"
32 : {
33 : #if !defined(DOXYGEN_SKIP)
34 : #include <cmath>
35 : #include <limits>
36 : #endif
37 :
38 : class OGREnvelope3D;
39 :
40 : /**
41 : * Simple container for a bounding region (rectangle)
42 : */
43 : class CPL_DLL OGREnvelope
44 : {
45 : public:
46 : /** Default constructor. Defines an empty rectangle */
47 8684539 : OGREnvelope()
48 8684539 : : MinX(std::numeric_limits<double>::infinity()),
49 17369074 : MaxX(-std::numeric_limits<double>::infinity()),
50 8684539 : MinY(std::numeric_limits<double>::infinity()),
51 8684539 : MaxY(-std::numeric_limits<double>::infinity())
52 : {
53 8684539 : }
54 :
55 : /** Copy constructor */
56 113889 : OGREnvelope(const OGREnvelope &oOther)
57 113889 : : MinX(oOther.MinX), MaxX(oOther.MaxX), MinY(oOther.MinY),
58 113889 : MaxY(oOther.MaxY)
59 : {
60 113889 : }
61 :
62 : /** Assignment operator */
63 : OGREnvelope &operator=(const OGREnvelope &) = default;
64 :
65 : /** Minimum X value */
66 : double MinX;
67 :
68 : /** Maximum X value */
69 : double MaxX;
70 :
71 : /** Minimum Y value */
72 : double MinY;
73 :
74 : /** Maximum Y value */
75 : double MaxY;
76 :
77 : #ifdef HAVE_GCC_DIAGNOSTIC_PUSH
78 : #pragma GCC diagnostic push
79 : #pragma GCC diagnostic ignored "-Wfloat-equal"
80 : #endif
81 : /** Return whether the object has been initialized, that is, is non
82 : * empty */
83 47319 : int IsInit() const
84 : {
85 47319 : return MinX != std::numeric_limits<double>::infinity();
86 : }
87 :
88 : #ifdef HAVE_GCC_DIAGNOSTIC_PUSH
89 : #pragma GCC diagnostic pop
90 : #endif
91 :
92 : /** Update the current object by computing its union with the other
93 : * rectangle */
94 328567 : void Merge(OGREnvelope const &sOther)
95 : {
96 328567 : MinX = MIN(MinX, sOther.MinX);
97 328567 : MaxX = MAX(MaxX, sOther.MaxX);
98 328567 : MinY = MIN(MinY, sOther.MinY);
99 328567 : MaxY = MAX(MaxY, sOther.MaxY);
100 328567 : }
101 :
102 : /** Update the current object by computing its union with the provided
103 : * point */
104 189516 : void Merge(double dfX, double dfY)
105 : {
106 189516 : MinX = MIN(MinX, dfX);
107 189516 : MaxX = MAX(MaxX, dfX);
108 189516 : MinY = MIN(MinY, dfY);
109 189516 : MaxY = MAX(MaxY, dfY);
110 189516 : }
111 :
112 : /** Update the current object by computing its intersection with the
113 : * other rectangle */
114 239 : void Intersect(OGREnvelope const &sOther)
115 : {
116 239 : if (Intersects(sOther))
117 : {
118 234 : if (IsInit())
119 : {
120 234 : MinX = MAX(MinX, sOther.MinX);
121 234 : MaxX = MIN(MaxX, sOther.MaxX);
122 234 : MinY = MAX(MinY, sOther.MinY);
123 234 : MaxY = MIN(MaxY, sOther.MaxY);
124 : }
125 : else
126 : {
127 0 : MinX = sOther.MinX;
128 0 : MaxX = sOther.MaxX;
129 0 : MinY = sOther.MinY;
130 0 : MaxY = sOther.MaxY;
131 : }
132 : }
133 : else
134 : {
135 5 : *this = OGREnvelope();
136 : }
137 239 : }
138 :
139 : /** Return whether the current object intersects with the other
140 : * rectangle */
141 15913 : int Intersects(OGREnvelope const &other) const
142 : {
143 15568 : return MinX <= other.MaxX && MaxX >= other.MinX &&
144 31481 : MinY <= other.MaxY && MaxY >= other.MinY;
145 : }
146 :
147 : /** Return whether the current object contains the other rectangle */
148 16093 : int Contains(OGREnvelope const &other) const
149 : {
150 2644 : return MinX <= other.MinX && MinY <= other.MinY &&
151 18737 : MaxX >= other.MaxX && MaxY >= other.MaxY;
152 : }
153 :
154 : /** Return whether the current rectangle is equal to the other rectangle
155 : */
156 53 : bool operator==(const OGREnvelope &other) const
157 : {
158 : #ifdef HAVE_GCC_DIAGNOSTIC_PUSH
159 : #pragma GCC diagnostic push
160 : #pragma GCC diagnostic ignored "-Wfloat-equal"
161 : #endif
162 47 : return MinX == other.MinX && MinY == other.MinY &&
163 100 : MaxX == other.MaxX && MaxY == other.MaxY;
164 :
165 : #ifdef HAVE_GCC_DIAGNOSTIC_PUSH
166 : #pragma GCC diagnostic pop
167 : #endif
168 : }
169 :
170 : /** Return whether the current rectangle is not equal to the other
171 : * rectangle */
172 47 : bool operator!=(const OGREnvelope &other) const
173 : {
174 47 : return !(*this == other);
175 : }
176 :
177 : /** Return the width of the envelope. Envelope must be initialized. */
178 664 : double Width() const
179 : {
180 664 : return MaxX - MinX;
181 : }
182 :
183 : /** Return the height of the envelope. Envelope must be initialized. */
184 664 : double Height() const
185 : {
186 664 : return MaxY - MinY;
187 : }
188 :
189 : /** Return the center point of the envelope. Envelope must be initialized. */
190 212 : void Center(double &dfX, double &dfY) const
191 : {
192 212 : dfX = MinX + Width() / 2;
193 212 : dfY = MinY + Height() / 2;
194 212 : }
195 : };
196 : } // extern "C++"
197 :
198 : #else
199 : typedef struct
200 : {
201 : double MinX;
202 : double MaxX;
203 : double MinY;
204 : double MaxY;
205 : } OGREnvelope;
206 : #endif
207 :
208 : #if defined(__cplusplus) && !defined(CPL_SUPRESS_CPLUSPLUS)
209 :
210 : extern "C++"
211 : {
212 :
213 : /**
214 : * Simple container for a bounding region in 3D.
215 : */
216 : class CPL_DLL OGREnvelope3D : public OGREnvelope
217 : {
218 : public:
219 : /** Default constructor. Defines an empty rectangle */
220 1622937 : OGREnvelope3D()
221 1622937 : : OGREnvelope(), MinZ(std::numeric_limits<double>::infinity()),
222 3245874 : MaxZ(-std::numeric_limits<double>::infinity())
223 : {
224 1622937 : }
225 :
226 : /** Copy constructor */
227 31 : OGREnvelope3D(const OGREnvelope3D &oOther)
228 31 : : OGREnvelope(oOther), MinZ(oOther.MinZ), MaxZ(oOther.MaxZ)
229 : {
230 31 : }
231 :
232 : /** Assignment operator */
233 : OGREnvelope3D &operator=(const OGREnvelope3D &) = default;
234 :
235 : /** Returns TRUE if MinZ and MaxZ are both valid numbers. */
236 30 : bool Is3D() const
237 : {
238 30 : return std::isfinite(MinZ) && std::isfinite(MaxZ);
239 : }
240 :
241 : /** Minimum Z value */
242 : double MinZ;
243 :
244 : /** Maximum Z value */
245 : double MaxZ;
246 :
247 : #ifdef HAVE_GCC_DIAGNOSTIC_PUSH
248 : #pragma GCC diagnostic push
249 : #pragma GCC diagnostic ignored "-Wfloat-equal"
250 : #endif
251 : /** Return whether the object has been initialized, that is, is non
252 : * empty */
253 2002 : int IsInit() const
254 : {
255 2002 : return MinX != std::numeric_limits<double>::infinity();
256 : }
257 : #ifdef HAVE_GCC_DIAGNOSTIC_PUSH
258 : #pragma GCC diagnostic pop
259 : #endif
260 :
261 : /** Update the current object by computing its union with the other
262 : * rectangle */
263 1033606 : void Merge(OGREnvelope3D const &sOther)
264 : {
265 1033606 : MinX = MIN(MinX, sOther.MinX);
266 1033606 : MaxX = MAX(MaxX, sOther.MaxX);
267 1033606 : MinY = MIN(MinY, sOther.MinY);
268 1033606 : MaxY = MAX(MaxY, sOther.MaxY);
269 1033606 : MinZ = MIN(MinZ, sOther.MinZ);
270 1033606 : MaxZ = MAX(MaxZ, sOther.MaxZ);
271 1033606 : }
272 :
273 : /** Update the current object by computing its union with the other
274 : * rectangle */
275 179 : void Merge(OGREnvelope const &sOther)
276 : {
277 179 : MinX = MIN(MinX, sOther.MinX);
278 179 : MaxX = MAX(MaxX, sOther.MaxX);
279 179 : MinY = MIN(MinY, sOther.MinY);
280 179 : MaxY = MAX(MaxY, sOther.MaxY);
281 179 : }
282 :
283 : /** Update the current object by computing its union with the provided
284 : * point */
285 14981 : void Merge(double dfX, double dfY, double dfZ)
286 : {
287 14981 : MinX = MIN(MinX, dfX);
288 14981 : MaxX = MAX(MaxX, dfX);
289 14981 : MinY = MIN(MinY, dfY);
290 14981 : MaxY = MAX(MaxY, dfY);
291 14981 : MinZ = MIN(MinZ, dfZ);
292 14981 : MaxZ = MAX(MaxZ, dfZ);
293 14981 : }
294 :
295 : /** Update the current object by computing its intersection with the
296 : * other rectangle */
297 : void Intersect(OGREnvelope3D const &sOther)
298 : {
299 : if (Intersects(sOther))
300 : {
301 : if (IsInit())
302 : {
303 : MinX = MAX(MinX, sOther.MinX);
304 : MaxX = MIN(MaxX, sOther.MaxX);
305 : MinY = MAX(MinY, sOther.MinY);
306 : MaxY = MIN(MaxY, sOther.MaxY);
307 : MinZ = MAX(MinZ, sOther.MinZ);
308 : MaxZ = MIN(MaxZ, sOther.MaxZ);
309 : }
310 : else
311 : {
312 : MinX = sOther.MinX;
313 : MaxX = sOther.MaxX;
314 : MinY = sOther.MinY;
315 : MaxY = sOther.MaxY;
316 : MinZ = sOther.MinZ;
317 : MaxZ = sOther.MaxZ;
318 : }
319 : }
320 : else
321 : {
322 : *this = OGREnvelope3D();
323 : }
324 : }
325 :
326 : /** Return whether the current object intersects with the other
327 : * rectangle */
328 : int Intersects(OGREnvelope3D const &other) const
329 : {
330 : return MinX <= other.MaxX && MaxX >= other.MinX &&
331 : MinY <= other.MaxY && MaxY >= other.MinY &&
332 : MinZ <= other.MaxZ && MaxZ >= other.MinZ;
333 : }
334 :
335 : /** Return whether the current object contains the other rectangle */
336 : int Contains(OGREnvelope3D const &other) const
337 : {
338 : return MinX <= other.MinX && MinY <= other.MinY &&
339 : MaxX >= other.MaxX && MaxY >= other.MaxY &&
340 : MinZ <= other.MinZ && MaxZ >= other.MaxZ;
341 : }
342 : };
343 :
344 : } // extern "C++"
345 :
346 : #else
347 : typedef struct
348 : {
349 : double MinX;
350 : double MaxX;
351 : double MinY;
352 : double MaxY;
353 : double MinZ;
354 : double MaxZ;
355 : } OGREnvelope3D;
356 : #endif
357 :
358 : CPL_C_START
359 :
360 : /*! @cond Doxygen_Suppress */
361 : void CPL_DLL *OGRMalloc(size_t) CPL_WARN_DEPRECATED("Use CPLMalloc instead.");
362 : void CPL_DLL *OGRCalloc(size_t, size_t)
363 : CPL_WARN_DEPRECATED("Use CPLCalloc instead.");
364 : void CPL_DLL *OGRRealloc(void *, size_t)
365 : CPL_WARN_DEPRECATED("Use CPLRealloc instead.");
366 : char CPL_DLL *OGRStrdup(const char *)
367 : CPL_WARN_DEPRECATED("Use CPLStrdup instead.");
368 : void CPL_DLL OGRFree(void *) CPL_WARN_DEPRECATED("Use CPLFree instead.");
369 : /*! @endcond */
370 :
371 : #ifdef STRICT_OGRERR_TYPE
372 : /** Type for a OGR error */
373 : typedef enum
374 : {
375 : OGRERR_NONE, /**< Success */
376 : OGRERR_NOT_ENOUGH_DATA, /**< Not enough data to deserialize */
377 : OGRERR_NOT_ENOUGH_MEMORY, /**< Not enough memory */
378 : OGRERR_UNSUPPORTED_GEOMETRY_TYPE, /**< Unsupported geometry type */
379 : OGRERR_UNSUPPORTED_OPERATION, /**< Unsupported operation */
380 : OGRERR_CORRUPT_DATA, /**< Corrupt data */
381 : OGRERR_FAILURE, /**< Failure */
382 : OGRERR_UNSUPPORTED_SRS, /**< Unsupported SRS */
383 : OGRERR_INVALID_HANDLE, /**< Invalid handle */
384 : OGRERR_NON_EXISTING_FEATURE /**< Non existing feature */
385 : } OGRErr;
386 : #else
387 : /** Type for a OGR error */
388 : typedef int OGRErr;
389 :
390 : #define OGRERR_NONE 0 /**< Success */
391 : #define OGRERR_NOT_ENOUGH_DATA 1 /**< Not enough data to deserialize */
392 : #define OGRERR_NOT_ENOUGH_MEMORY 2 /**< Not enough memory */
393 : #define OGRERR_UNSUPPORTED_GEOMETRY_TYPE 3 /**< Unsupported geometry type */
394 : #define OGRERR_UNSUPPORTED_OPERATION 4 /**< Unsupported operation */
395 : #define OGRERR_CORRUPT_DATA 5 /**< Corrupt data */
396 : #define OGRERR_FAILURE 6 /**< Failure */
397 : #define OGRERR_UNSUPPORTED_SRS 7 /**< Unsupported SRS */
398 : #define OGRERR_INVALID_HANDLE 8 /**< Invalid handle */
399 : #define OGRERR_NON_EXISTING_FEATURE 9 /**< Non existing feature */
400 :
401 : #endif
402 :
403 : /** Type for a OGR boolean */
404 : typedef int OGRBoolean;
405 :
406 : /* -------------------------------------------------------------------- */
407 : /* ogr_geometry.h related definitions. */
408 : /* -------------------------------------------------------------------- */
409 :
410 : #if defined(HAVE_GCC_DIAGNOSTIC_PUSH) && __STDC_VERSION__ < 202311L
411 : /* wkbPoint25D and friends cause warnings with -Wpedantic prior to C23. */
412 : /* Cf https://github.com/OSGeo/gdal/issues/2322 */
413 : #pragma GCC diagnostic push
414 : #pragma GCC diagnostic ignored "-Wpedantic"
415 : #endif
416 :
417 : /**
418 : * List of well known binary geometry types. These are used within the BLOBs
419 : * but are also returned from OGRGeometry::getGeometryType() to identify the
420 : * type of a geometry object.
421 : */
422 : typedef enum
423 : {
424 : wkbUnknown = 0, /**< unknown type, non-standard */
425 :
426 : wkbPoint = 1, /**< 0-dimensional geometric object, standard WKB */
427 : wkbLineString = 2, /**< 1-dimensional geometric object with linear
428 : * interpolation between Points, standard WKB */
429 : wkbPolygon = 3, /**< planar 2-dimensional geometric object defined
430 : * by 1 exterior boundary and 0 or more interior
431 : * boundaries, standard WKB */
432 : wkbMultiPoint = 4, /**< GeometryCollection of Points, standard WKB */
433 : wkbMultiLineString =
434 : 5, /**< GeometryCollection of LineStrings, standard WKB */
435 : wkbMultiPolygon = 6, /**< GeometryCollection of Polygons, standard WKB */
436 : wkbGeometryCollection = 7, /**< geometric object that is a collection of 1
437 : or more geometric objects, standard WKB */
438 :
439 : wkbCircularString = 8, /**< one or more circular arc segments connected end
440 : * to end, ISO SQL/MM Part 3. */
441 : wkbCompoundCurve = 9, /**< sequence of contiguous curves, ISO SQL/MM Part 3.
442 : */
443 : wkbCurvePolygon = 10, /**< planar surface, defined by 1 exterior boundary
444 : * and zero or more interior boundaries, that are
445 : * curves. ISO SQL/MM Part 3. */
446 : wkbMultiCurve = 11, /**< GeometryCollection of Curves, ISO SQL/MM Part 3.
447 : */
448 : wkbMultiSurface = 12, /**< GeometryCollection of Surfaces, ISO SQL/MM
449 : Part 3. */
450 : wkbCurve = 13, /**< Curve (abstract type). ISO SQL/MM Part 3. */
451 : wkbSurface = 14, /**< Surface (abstract type). ISO SQL/MM Part 3. */
452 : wkbPolyhedralSurface =
453 : 15, /**< a contiguous collection of polygons, which share common
454 : * boundary segments, ISO SQL/MM Part 3. */
455 : wkbTIN = 16, /**< a PolyhedralSurface consisting only of Triangle patches
456 : * ISO SQL/MM Part 3. */
457 : wkbTriangle = 17, /**< a Triangle. ISO SQL/MM Part 3. */
458 :
459 : wkbNone = 100, /**< non-standard, for pure attribute records */
460 : wkbLinearRing = 101, /**< non-standard, just for createGeometry() */
461 :
462 : wkbCircularStringZ = 1008, /**< wkbCircularString with Z component. ISO
463 : SQL/MM Part 3. */
464 : wkbCompoundCurveZ = 1009, /**< wkbCompoundCurve with Z component. ISO SQL/MM
465 : Part 3. */
466 : wkbCurvePolygonZ = 1010, /**< wkbCurvePolygon with Z component. ISO SQL/MM
467 : Part 3. */
468 : wkbMultiCurveZ = 1011, /**< wkbMultiCurve with Z component. ISO SQL/MM
469 : Part 3. */
470 : wkbMultiSurfaceZ = 1012, /**< wkbMultiSurface with Z component. ISO SQL/MM
471 : Part 3. */
472 : wkbCurveZ = 1013, /**< wkbCurve with Z component. ISO SQL/MM Part 3.*/
473 : wkbSurfaceZ = 1014, /**< wkbSurface with Z component. ISO SQL/MM Part 3.
474 : */
475 : wkbPolyhedralSurfaceZ = 1015, /**< ISO SQL/MM Part 3. */
476 : wkbTINZ = 1016, /**< ISO SQL/MM Part 3. */
477 : wkbTriangleZ = 1017, /**< ISO SQL/MM Part 3. */
478 :
479 : wkbPointM = 2001, /**< ISO SQL/MM Part 3. */
480 : wkbLineStringM = 2002, /**< ISO SQL/MM Part 3. */
481 : wkbPolygonM = 2003, /**< ISO SQL/MM Part 3. */
482 : wkbMultiPointM = 2004, /**< ISO SQL/MM Part 3. */
483 : wkbMultiLineStringM = 2005, /**< ISO SQL/MM Part 3. */
484 : wkbMultiPolygonM = 2006, /**< ISO SQL/MM Part 3. */
485 : wkbGeometryCollectionM = 2007, /**< ISO SQL/MM Part 3. */
486 : wkbCircularStringM = 2008, /**< ISO SQL/MM Part 3. */
487 : wkbCompoundCurveM = 2009, /**< ISO SQL/MM Part 3. */
488 : wkbCurvePolygonM = 2010, /**< ISO SQL/MM Part 3. */
489 : wkbMultiCurveM = 2011, /**< ISO SQL/MM Part 3. */
490 : wkbMultiSurfaceM = 2012, /**< ISO SQL/MM Part 3. */
491 : wkbCurveM = 2013, /**< ISO SQL/MM Part 3. */
492 : wkbSurfaceM = 2014, /**< ISO SQL/MM Part 3. */
493 : wkbPolyhedralSurfaceM = 2015, /**< ISO SQL/MM Part 3. */
494 : wkbTINM = 2016, /**< ISO SQL/MM Part 3. */
495 : wkbTriangleM = 2017, /**< ISO SQL/MM Part 3. */
496 :
497 : wkbPointZM = 3001, /**< ISO SQL/MM Part 3. */
498 : wkbLineStringZM = 3002, /**< ISO SQL/MM Part 3. */
499 : wkbPolygonZM = 3003, /**< ISO SQL/MM Part 3. */
500 : wkbMultiPointZM = 3004, /**< ISO SQL/MM Part 3. */
501 : wkbMultiLineStringZM = 3005, /**< ISO SQL/MM Part 3. */
502 : wkbMultiPolygonZM = 3006, /**< ISO SQL/MM Part 3. */
503 : wkbGeometryCollectionZM = 3007, /**< ISO SQL/MM Part 3. */
504 : wkbCircularStringZM = 3008, /**< ISO SQL/MM Part 3. */
505 : wkbCompoundCurveZM = 3009, /**< ISO SQL/MM Part 3. */
506 : wkbCurvePolygonZM = 3010, /**< ISO SQL/MM Part 3. */
507 : wkbMultiCurveZM = 3011, /**< ISO SQL/MM Part 3. */
508 : wkbMultiSurfaceZM = 3012, /**< ISO SQL/MM Part 3. */
509 : wkbCurveZM = 3013, /**< ISO SQL/MM Part 3. */
510 : wkbSurfaceZM = 3014, /**< ISO SQL/MM Part 3. */
511 : wkbPolyhedralSurfaceZM = 3015, /**< ISO SQL/MM Part 3. */
512 : wkbTINZM = 3016, /**< ISO SQL/MM Part 3. */
513 : wkbTriangleZM = 3017, /**< ISO SQL/MM Part 3. */
514 :
515 : #if defined(DOXYGEN_SKIP)
516 : // Sphinx doesn't like 0x8000000x constants
517 : wkbPoint25D = -2147483647, /**< 2.5D extension as per 99-402 */
518 : wkbLineString25D = -2147483646, /**< 2.5D extension as per 99-402 */
519 : wkbPolygon25D = -2147483645, /**< 2.5D extension as per 99-402 */
520 : wkbMultiPoint25D = -2147483644, /**< 2.5D extension as per 99-402 */
521 : wkbMultiLineString25D = -2147483643, /**< 2.5D extension as per 99-402 */
522 : wkbMultiPolygon25D = -2147483642, /**< 2.5D extension as per 99-402 */
523 : wkbGeometryCollection25D = -2147483641 /**< 2.5D extension as per 99-402 */
524 : #else
525 : wkbPoint25D = 0x80000001, /**< 2.5D extension as per 99-402 */
526 : wkbLineString25D = 0x80000002, /**< 2.5D extension as per 99-402 */
527 : wkbPolygon25D = 0x80000003, /**< 2.5D extension as per 99-402 */
528 : wkbMultiPoint25D = 0x80000004, /**< 2.5D extension as per 99-402 */
529 : wkbMultiLineString25D = 0x80000005, /**< 2.5D extension as per 99-402 */
530 : wkbMultiPolygon25D = 0x80000006, /**< 2.5D extension as per 99-402 */
531 : wkbGeometryCollection25D = 0x80000007 /**< 2.5D extension as per 99-402 */
532 : #endif
533 : } OGRwkbGeometryType;
534 :
535 : #if defined(HAVE_GCC_DIAGNOSTIC_PUSH) && __STDC_VERSION__ < 202311L
536 : #pragma GCC diagnostic pop
537 : #endif
538 :
539 : /* clang-format off */
540 : /**
541 : * Output variants of WKB we support.
542 : *
543 : * 99-402 was a short-lived extension to SFSQL 1.1 that used a high-bit flag
544 : * to indicate the presence of Z coordinates in a WKB geometry.
545 : *
546 : * SQL/MM Part 3 and SFSQL 1.2 use offsets of 1000 (Z), 2000 (M) and 3000 (ZM)
547 : * to indicate the present of higher dimensional coordinates in a WKB geometry.
548 : * Reference: <a href="https://portal.opengeospatial.org/files/?artifact_id=320243">
549 : * 09-009_Committee_Draft_ISOIEC_CD_13249-3_SQLMM_Spatial.pdf</a>,
550 : * ISO/IEC JTC 1/SC 32 N 1820, ISO/IEC CD 13249-3:201x(E), Date: 2009-01-16.
551 : * The codes are also found in §8.2.3 of <a href="http://portal.opengeospatial.org/files/?artifact_id=25355"> OGC
552 : * 06-103r4 "OpenGIS® Implementation Standard for Geographic information -
553 : * Simple feature access - Part 1: Common architecture", v1.2.1</a>
554 : */
555 : /* clang-format on */
556 :
557 : typedef enum
558 : {
559 : wkbVariantOldOgc, /**< Old-style 99-402 extended dimension (Z) WKB types */
560 : wkbVariantIso, /**< SFSQL 1.2 and ISO SQL/MM Part 3 extended dimension (Z&M)
561 : WKB types */
562 : wkbVariantPostGIS1 /**< PostGIS 1.X has different codes for CurvePolygon,
563 : MultiCurve and MultiSurface */
564 : } OGRwkbVariant;
565 :
566 : #ifndef GDAL_COMPILATION
567 : /** @deprecated Use wkbHasZ() or wkbSetZ() instead */
568 : #define wkb25DBit 0x80000000
569 : #endif
570 :
571 : #ifndef __cplusplus
572 : /** Return the 2D geometry type corresponding to the specified geometry type */
573 : #define wkbFlatten(x) OGR_GT_Flatten((OGRwkbGeometryType)(x))
574 : #else
575 : /** Return the 2D geometry type corresponding to the specified geometry type */
576 : #define wkbFlatten(x) OGR_GT_Flatten(static_cast<OGRwkbGeometryType>(x))
577 : #endif
578 :
579 : /** Return if the geometry type is a 3D geometry type
580 : */
581 : #define wkbHasZ(x) (OGR_GT_HasZ(x) != 0)
582 :
583 : /** Return the 3D geometry type corresponding to the specified geometry type.
584 : */
585 : #define wkbSetZ(x) OGR_GT_SetZ(x)
586 :
587 : /** Return if the geometry type is a measured geometry type
588 : */
589 : #define wkbHasM(x) (OGR_GT_HasM(x) != 0)
590 :
591 : /** Return the measured geometry type corresponding to the specified geometry
592 : * type.
593 : */
594 : #define wkbSetM(x) OGR_GT_SetM(x)
595 :
596 : #ifndef DOXYGEN_SKIP
597 : #define ogrZMarker 0x21125711
598 : #endif
599 :
600 : const char CPL_DLL *OGRGeometryTypeToName(OGRwkbGeometryType eType);
601 : OGRwkbGeometryType CPL_DLL OGRMergeGeometryTypes(OGRwkbGeometryType eMain,
602 : OGRwkbGeometryType eExtra);
603 : OGRwkbGeometryType CPL_DLL OGRMergeGeometryTypesEx(OGRwkbGeometryType eMain,
604 : OGRwkbGeometryType eExtra,
605 : int bAllowPromotingToCurves);
606 : OGRwkbGeometryType CPL_DLL OGR_GT_Flatten(OGRwkbGeometryType eType);
607 : OGRwkbGeometryType CPL_DLL OGR_GT_SetZ(OGRwkbGeometryType eType);
608 : OGRwkbGeometryType CPL_DLL OGR_GT_SetM(OGRwkbGeometryType eType);
609 : OGRwkbGeometryType CPL_DLL OGR_GT_SetModifier(OGRwkbGeometryType eType,
610 : int bSetZ, int bSetM);
611 : int CPL_DLL OGR_GT_HasZ(OGRwkbGeometryType eType);
612 : int CPL_DLL OGR_GT_HasM(OGRwkbGeometryType eType);
613 : int CPL_DLL OGR_GT_IsSubClassOf(OGRwkbGeometryType eType,
614 : OGRwkbGeometryType eSuperType);
615 : int CPL_DLL OGR_GT_IsCurve(OGRwkbGeometryType);
616 : int CPL_DLL OGR_GT_IsSurface(OGRwkbGeometryType);
617 : int CPL_DLL OGR_GT_IsNonLinear(OGRwkbGeometryType);
618 : OGRwkbGeometryType CPL_DLL OGR_GT_GetCollection(OGRwkbGeometryType eType);
619 : OGRwkbGeometryType CPL_DLL OGR_GT_GetSingle(OGRwkbGeometryType eType);
620 : OGRwkbGeometryType CPL_DLL OGR_GT_GetCurve(OGRwkbGeometryType eType);
621 : OGRwkbGeometryType CPL_DLL OGR_GT_GetLinear(OGRwkbGeometryType eType);
622 :
623 : /** Enumeration to describe byte order */
624 : typedef enum
625 : {
626 : wkbXDR = 0, /**< MSB/Sun/Motorola: Most Significant Byte First */
627 : wkbNDR = 1 /**< LSB/Intel/Vax: Least Significant Byte First */
628 : } OGRwkbByteOrder;
629 :
630 : #ifndef DOXYGEN_SKIP
631 :
632 : #ifndef NO_HACK_FOR_IBM_DB2_V72
633 : #define HACK_FOR_IBM_DB2_V72
634 : #endif
635 :
636 : #ifdef HACK_FOR_IBM_DB2_V72
637 : #define DB2_V72_FIX_BYTE_ORDER(x) ((((x)&0x31) == (x)) ? ((x)&0x1) : (x))
638 : #define DB2_V72_UNFIX_BYTE_ORDER(x) \
639 : CPL_STATIC_CAST(unsigned char, OGRGeometry::bGenerate_DB2_V72_BYTE_ORDER \
640 : ? ((x) | 0x30) \
641 : : (x))
642 : #else
643 : #define DB2_V72_FIX_BYTE_ORDER(x) (x)
644 : #define DB2_V72_UNFIX_BYTE_ORDER(x) (x)
645 : #endif
646 :
647 : #endif /* #ifndef DOXYGEN_SKIP */
648 :
649 : /** Alter field name.
650 : * Used by OGR_L_AlterFieldDefn().
651 : */
652 : #define ALTER_NAME_FLAG 0x1
653 :
654 : /** Alter field type.
655 : * Used by OGR_L_AlterFieldDefn().
656 : */
657 : #define ALTER_TYPE_FLAG 0x2
658 :
659 : /** Alter field width and precision.
660 : * Used by OGR_L_AlterFieldDefn().
661 : */
662 : #define ALTER_WIDTH_PRECISION_FLAG 0x4
663 :
664 : /** Alter field NOT NULL constraint.
665 : * Used by OGR_L_AlterFieldDefn().
666 : */
667 : #define ALTER_NULLABLE_FLAG 0x8
668 :
669 : /** Alter field DEFAULT value.
670 : * Used by OGR_L_AlterFieldDefn().
671 : */
672 : #define ALTER_DEFAULT_FLAG 0x10
673 :
674 : /** Alter field UNIQUE constraint.
675 : * Used by OGR_L_AlterFieldDefn().
676 : * @since GDAL 3.2
677 : */
678 : #define ALTER_UNIQUE_FLAG 0x20
679 :
680 : /** Alter field domain name.
681 : * Used by OGR_L_AlterFieldDefn().
682 : * @since GDAL 3.3
683 : */
684 : #define ALTER_DOMAIN_FLAG 0x40
685 :
686 : /** Alter field alternative name.
687 : * Used by OGR_L_AlterFieldDefn().
688 : * @since GDAL 3.7
689 : */
690 : #define ALTER_ALTERNATIVE_NAME_FLAG 0x80
691 :
692 : /** Alter field comment.
693 : * Used by OGR_L_AlterFieldDefn().
694 : * @since GDAL 3.7
695 : */
696 : #define ALTER_COMMENT_FLAG 0x100
697 :
698 : /** Alter all parameters of field definition.
699 : * Used by OGR_L_AlterFieldDefn().
700 : */
701 : #define ALTER_ALL_FLAG \
702 : (ALTER_NAME_FLAG | ALTER_TYPE_FLAG | ALTER_WIDTH_PRECISION_FLAG | \
703 : ALTER_NULLABLE_FLAG | ALTER_DEFAULT_FLAG | ALTER_UNIQUE_FLAG | \
704 : ALTER_DOMAIN_FLAG | ALTER_ALTERNATIVE_NAME_FLAG | ALTER_COMMENT_FLAG)
705 :
706 : /** Alter geometry field name.
707 : * Used by OGR_L_AlterGeomFieldDefn().
708 : * @since GDAL 3.6
709 : */
710 : #define ALTER_GEOM_FIELD_DEFN_NAME_FLAG 0x1000
711 :
712 : /** Alter geometry field type.
713 : * Used by OGR_L_AlterGeomFieldDefn().
714 : * @since GDAL 3.6
715 : */
716 : #define ALTER_GEOM_FIELD_DEFN_TYPE_FLAG 0x2000
717 :
718 : /** Alter geometry field nullable state.
719 : * Used by OGR_L_AlterGeomFieldDefn().
720 : * @since GDAL 3.6
721 : */
722 : #define ALTER_GEOM_FIELD_DEFN_NULLABLE_FLAG 0x4000
723 :
724 : /** Alter geometry field spatial reference system (except its coordinate epoch)
725 : * Used by OGR_L_AlterGeomFieldDefn().
726 : * @since GDAL 3.6
727 : */
728 : #define ALTER_GEOM_FIELD_DEFN_SRS_FLAG 0x8000
729 :
730 : /** Alter geometry field coordinate epoch
731 : * Used by OGR_L_AlterGeomFieldDefn().
732 : * @since GDAL 3.6
733 : */
734 : #define ALTER_GEOM_FIELD_DEFN_SRS_COORD_EPOCH_FLAG 0x10000
735 :
736 : /** Alter all parameters of field definition.
737 : * Used by OGR_L_AlterGeomFieldDefn().
738 : * @since GDAL 3.6
739 : */
740 : #define ALTER_GEOM_FIELD_DEFN_ALL_FLAG \
741 : (ALTER_GEOM_FIELD_DEFN_NAME_FLAG | ALTER_GEOM_FIELD_DEFN_TYPE_FLAG | \
742 : ALTER_GEOM_FIELD_DEFN_NULLABLE_FLAG | ALTER_GEOM_FIELD_DEFN_SRS_FLAG | \
743 : ALTER_GEOM_FIELD_DEFN_SRS_COORD_EPOCH_FLAG)
744 :
745 : /** Validate that fields respect not-null constraints.
746 : * Used by OGR_F_Validate().
747 : */
748 : #define OGR_F_VAL_NULL 0x00000001
749 :
750 : /** Validate that geometries respect geometry column type.
751 : * Used by OGR_F_Validate().
752 : */
753 : #define OGR_F_VAL_GEOM_TYPE 0x00000002
754 :
755 : /** Validate that (string) fields respect field width.
756 : * Used by OGR_F_Validate().
757 : */
758 : #define OGR_F_VAL_WIDTH 0x00000004
759 :
760 : /** Allow fields that are null when there's an associated default value.
761 : * This can be used for drivers where the low-level layers will automatically
762 : * set the field value to the associated default value. This flag only makes
763 : * sense if OGR_F_VAL_NULL is set too. Used by OGR_F_Validate().
764 : */
765 : #define OGR_F_VAL_ALLOW_NULL_WHEN_DEFAULT 0x00000008
766 :
767 : /** Allow geometry fields to have a different coordinate dimension that their
768 : * geometry column type.
769 : * This flag only makes sense if OGR_F_VAL_GEOM_TYPE is set too.
770 : * Used by OGR_F_Validate().
771 : */
772 : #define OGR_F_VAL_ALLOW_DIFFERENT_GEOM_DIM 0x00000010
773 :
774 : /** Enable all validation tests (except OGR_F_VAL_ALLOW_DIFFERENT_GEOM_DIM)
775 : * Used by OGR_F_Validate().
776 : */
777 : #define OGR_F_VAL_ALL (0x7FFFFFFF & ~OGR_F_VAL_ALLOW_DIFFERENT_GEOM_DIM)
778 :
779 : /************************************************************************/
780 : /* ogr_feature.h related definitions. */
781 : /************************************************************************/
782 :
783 : /**
784 : * List of feature field types. This list is likely to be extended in the
785 : * future ... avoid coding applications based on the assumption that all
786 : * field types can be known.
787 : */
788 :
789 : typedef enum
790 : {
791 : /** Single signed 32bit integer */ OFTInteger = 0,
792 : /** List of signed 32bit integers */ OFTIntegerList = 1,
793 : /** Double Precision floating point */ OFTReal = 2,
794 : /** List of doubles */ OFTRealList = 3,
795 : /** String of ASCII chars */ OFTString = 4,
796 : /** Array of strings */ OFTStringList = 5,
797 : /** deprecated */ OFTWideString = 6,
798 : /** deprecated */ OFTWideStringList = 7,
799 : /** Raw Binary data */ OFTBinary = 8,
800 : /** Date */ OFTDate = 9,
801 : /** Time */ OFTTime = 10,
802 : /** Date and Time */ OFTDateTime = 11,
803 : /** Single signed 64bit integer */ OFTInteger64 = 12,
804 : /** List of signed 64bit integers */ OFTInteger64List = 13,
805 : OFTMaxType = 13
806 : } OGRFieldType;
807 :
808 : /**
809 : * List of field subtypes. A subtype represents a hint, a restriction of the
810 : * main type, that is not strictly necessary to consult.
811 : * This list is likely to be extended in the
812 : * future ... avoid coding applications based on the assumption that all
813 : * field types can be known.
814 : * Most subtypes only make sense for a restricted set of main types.
815 : */
816 : typedef enum
817 : {
818 : /** No subtype. This is the default value */ OFSTNone = 0,
819 : /** Boolean integer. Only valid for OFTInteger and OFTIntegerList.*/
820 : OFSTBoolean = 1,
821 : /** Signed 16-bit integer. Only valid for OFTInteger and OFTIntegerList. */
822 : OFSTInt16 = 2,
823 : /** Single precision (32 bit) floating point. Only valid for OFTReal and
824 : OFTRealList. */
825 : OFSTFloat32 = 3,
826 : /** JSON content. Only valid for OFTString.
827 : */
828 : OFSTJSON = 4,
829 : /** UUID string representation. Only valid for OFTString.
830 : * @since GDAL 3.3
831 : */
832 : OFSTUUID = 5,
833 : OFSTMaxSubType = 5
834 : } OGRFieldSubType;
835 :
836 : /**
837 : * Display justification for field values.
838 : */
839 :
840 : typedef enum
841 : {
842 : OJUndefined = 0,
843 : OJLeft = 1,
844 : OJRight = 2
845 : } OGRJustification;
846 :
847 : /** Special value for a unset FID */
848 : #define OGRNullFID -1
849 :
850 : /* Special value for an unknown field type. This should only be used
851 : * while reading a file. At the end of file any unknown types should
852 : * be set to OFTString.
853 : */
854 : /*! @cond Doxygen_Suppress */
855 : #define OGRUnknownType static_cast<OGRFieldType>(-1)
856 : /*! @endcond */
857 :
858 : /** Special value set in OGRField.Set.nMarker1, nMarker2 and nMarker3 for
859 : * a unset field.
860 : * Direct use of this value is strongly discouraged.
861 : * Use OGR_RawField_SetUnset() or OGR_RawField_IsUnset() instead.
862 : */
863 : #define OGRUnsetMarker -21121
864 :
865 : /** Special value set in OGRField.Set.nMarker1, nMarker2 and nMarker3 for
866 : * a null field.
867 : * Direct use of this value is strongly discouraged.
868 : * Use OGR_RawField_SetNull() or OGR_RawField_IsNull() instead.
869 : */
870 : #define OGRNullMarker -21122
871 :
872 : /** Time zone flag indicating unknown timezone. For the
873 : * OGRFieldDefn::GetTZFlag() property, this may also indicate a mix of
874 : * unknown, localtime or known time zones in the same field.
875 : */
876 : #define OGR_TZFLAG_UNKNOWN 0
877 :
878 : /** Time zone flag indicating local time */
879 : #define OGR_TZFLAG_LOCALTIME 1
880 :
881 : /** Time zone flag only returned by OGRFieldDefn::GetTZFlag() to indicate
882 : * that all values in the field have a known time zone (ie different from
883 : * OGR_TZFLAG_UNKNOWN and OGR_TZFLAG_LOCALTIME), but it may be different among
884 : * features. */
885 : #define OGR_TZFLAG_MIXED_TZ 2
886 :
887 : /** Time zone flag indicating UTC.
888 : * Used to derived other time zone flags with the following logic:
889 : * - values above 100 indicate a 15 minute increment per unit.
890 : * - values under 100 indicate a 15 minute decrement per unit.
891 : * For example: a value of 101 indicates UTC+00:15, a value of 102 UTC+00:30,
892 : * a value of 99 UTC-00:15 ,etc. */
893 : #define OGR_TZFLAG_UTC 100
894 :
895 : /************************************************************************/
896 : /* OGRField */
897 : /************************************************************************/
898 :
899 : /**
900 : * OGRFeature field attribute value union.
901 : */
902 :
903 : typedef union
904 : {
905 : /*! @cond Doxygen_Suppress */
906 : int Integer;
907 : GIntBig Integer64;
908 : double Real;
909 : char *String;
910 :
911 : struct
912 : {
913 : int nCount;
914 : int *paList;
915 : } IntegerList;
916 :
917 : struct
918 : {
919 : int nCount;
920 : GIntBig *paList;
921 : } Integer64List;
922 :
923 : struct
924 : {
925 : int nCount;
926 : double *paList;
927 : } RealList;
928 :
929 : struct
930 : {
931 : int nCount;
932 : char **paList;
933 : } StringList;
934 :
935 : struct
936 : {
937 : int nCount;
938 : GByte *paData;
939 : } Binary;
940 :
941 : struct
942 : {
943 : int nMarker1;
944 : int nMarker2;
945 : int nMarker3;
946 : } Set;
947 :
948 : struct
949 : {
950 : GInt16 Year;
951 : GByte Month;
952 : GByte Day;
953 : GByte Hour;
954 : GByte Minute;
955 : GByte TZFlag; /* 0=unknown, 1=localtime(ambiguous),
956 : 100=GMT, 104=GMT+1, 80=GMT-5, etc */
957 : GByte Reserved; /* must be set to 0 */
958 : float Second; /* with millisecond accuracy. at the end of the structure,
959 : so as to keep it 12 bytes on 32 bit */
960 : } Date;
961 :
962 : /*! @endcond */
963 : } OGRField;
964 :
965 : /** Return the number of milliseconds from a datetime with decimal seconds */
966 : int CPL_DLL OGR_GET_MS(float fSec);
967 :
968 : /** Option for OGRParseDate() to ask for lax checks on the input format */
969 : #define OGRPARSEDATE_OPTION_LAX 1
970 :
971 : int CPL_DLL OGRParseDate(const char *pszInput, OGRField *psOutput,
972 : int nOptions);
973 :
974 : /* -------------------------------------------------------------------- */
975 : /* Constants from ogrsf_frmts.h for capabilities. */
976 : /* -------------------------------------------------------------------- */
977 : #define OLCRandomRead "RandomRead" /**< Layer capability for random read */
978 : #define OLCSequentialWrite \
979 : "SequentialWrite" /**< Layer capability for sequential write */
980 : #define OLCRandomWrite "RandomWrite" /**< Layer capability for random write */
981 : #define OLCFastSpatialFilter \
982 : "FastSpatialFilter" /**< Layer capability for fast spatial filter */
983 : #define OLCFastFeatureCount \
984 : "FastFeatureCount" /**< Layer capability for fast feature count retrieval \
985 : */
986 : #define OLCFastGetExtent \
987 : "FastGetExtent" /**< Layer capability for fast extent retrieval */
988 : #define OLCFastGetExtent3D \
989 : "FastGetExtent3D" /**< Layer capability for fast 3D extent retrieval */
990 : #define OLCCreateField \
991 : "CreateField" /**< Layer capability for field creation \
992 : */
993 : #define OLCDeleteField \
994 : "DeleteField" /**< Layer capability for field deletion \
995 : */
996 : #define OLCReorderFields \
997 : "ReorderFields" /**< Layer capability for field reordering */
998 : #define OLCAlterFieldDefn \
999 : "AlterFieldDefn" /**< Layer capability for field alteration */
1000 : #define OLCAlterGeomFieldDefn \
1001 : "AlterGeomFieldDefn" /**< Layer capability for geometry field alteration \
1002 : */
1003 : #define OLCTransactions \
1004 : "Transactions" /**< Layer capability for transactions \
1005 : */
1006 : #define OLCDeleteFeature \
1007 : "DeleteFeature" /**< Layer capability for feature deletion */
1008 : #define OLCUpsertFeature \
1009 : "UpsertFeature" /**< Layer capability for feature upsert */
1010 : #define OLCUpdateFeature \
1011 : "UpdateFeature" /**< Layer capability for specialized \
1012 : UpdateFeature() implementation */
1013 : #define OLCFastSetNextByIndex \
1014 : "FastSetNextByIndex" /**< Layer capability for setting next feature index \
1015 : */
1016 : #define OLCStringsAsUTF8 \
1017 : "StringsAsUTF8" /**< Layer capability for strings returned with UTF-8 \
1018 : encoding */
1019 : #define OLCIgnoreFields \
1020 : "IgnoreFields" /**< Layer capability for field ignoring */
1021 : #define OLCCreateGeomField \
1022 : "CreateGeomField" /**< Layer capability for geometry field creation */
1023 : #define OLCCurveGeometries \
1024 : "CurveGeometries" /**< Layer capability for curve geometries support */
1025 : #define OLCMeasuredGeometries \
1026 : "MeasuredGeometries" /**< Layer capability for measured geometries support \
1027 : */
1028 : #define OLCZGeometries \
1029 : "ZGeometries" /**< Layer capability for geometry with Z dimension support. \
1030 : Since GDAL 3.6. */
1031 : #define OLCRename \
1032 : "Rename" /**< Layer capability for a layer that supports Rename() */
1033 : #define OLCFastGetArrowStream \
1034 : "FastGetArrowStream" /**< Layer capability for fast GetArrowStream() \
1035 : implementation */
1036 : #define OLCFastWriteArrowBatch \
1037 : "FastWriteArrowBatch" /**< Layer capability for fast WriteArrowBatch() \
1038 : implementation */
1039 :
1040 : #define ODsCCreateLayer \
1041 : "CreateLayer" /**< Dataset capability for layer creation */
1042 : #define ODsCDeleteLayer \
1043 : "DeleteLayer" /**< Dataset capability for layer deletion */
1044 : /* Reserved: "RenameLayer" */
1045 : #define ODsCCreateGeomFieldAfterCreateLayer \
1046 : "CreateGeomFieldAfterCreateLayer" /**< Dataset capability for geometry \
1047 : field creation support */
1048 : #define ODsCCurveGeometries \
1049 : "CurveGeometries" /**< Dataset capability for curve geometries support */
1050 : #define ODsCTransactions \
1051 : "Transactions" /**< Dataset capability for dataset transactions */
1052 : #define ODsCEmulatedTransactions \
1053 : "EmulatedTransactions" /**< Dataset capability for emulated dataset \
1054 : transactions */
1055 : #define ODsCMeasuredGeometries \
1056 : "MeasuredGeometries" /**< Dataset capability for measured geometries \
1057 : support */
1058 : #define ODsCZGeometries \
1059 : "ZGeometries" /**< Dataset capability for geometry with Z dimension \
1060 : support. Since GDAL 3.6. */
1061 : #define ODsCRandomLayerRead \
1062 : "RandomLayerRead" /**< Dataset capability for GetNextFeature() returning \
1063 : features from random layers */
1064 : /* Note the unfortunate trailing space at the end of the string */
1065 : #define ODsCRandomLayerWrite \
1066 : "RandomLayerWrite " /**< Dataset capability for supporting CreateFeature \
1067 : on layer in random order */
1068 : #define ODsCAddFieldDomain \
1069 : "AddFieldDomain" /**< Dataset capability for supporting AddFieldDomain() \
1070 : (at least partially) */
1071 : #define ODsCDeleteFieldDomain \
1072 : "DeleteFieldDomain" /**< Dataset capability for supporting \
1073 : DeleteFieldDomain()*/
1074 : #define ODsCUpdateFieldDomain \
1075 : "UpdateFieldDomain" /**< Dataset capability for supporting \
1076 : UpdateFieldDomain()*/
1077 :
1078 : #define ODrCCreateDataSource \
1079 : "CreateDataSource" /**< Driver capability for datasource creation */
1080 : #define ODrCDeleteDataSource \
1081 : "DeleteDataSource" /**< Driver capability for datasource deletion */
1082 :
1083 : /* -------------------------------------------------------------------- */
1084 : /* Layer metadata items. */
1085 : /* -------------------------------------------------------------------- */
1086 : /** Capability set to YES as metadata on a layer that has features with
1087 : * 64 bit identifiers.
1088 : */
1089 : #define OLMD_FID64 "OLMD_FID64"
1090 :
1091 : /************************************************************************/
1092 : /* ogr_featurestyle.h related definitions. */
1093 : /************************************************************************/
1094 :
1095 : /**
1096 : * OGRStyleTool derived class types (returned by GetType()).
1097 : */
1098 :
1099 : typedef enum ogr_style_tool_class_id
1100 : {
1101 : OGRSTCNone = 0, /**< None */
1102 : OGRSTCPen = 1, /**< Pen */
1103 : OGRSTCBrush = 2, /**< Brush */
1104 : OGRSTCSymbol = 3, /**< Symbol */
1105 : OGRSTCLabel = 4, /**< Label */
1106 : OGRSTCVector = 5 /**< Vector */
1107 : } OGRSTClassId;
1108 :
1109 : /**
1110 : * List of units supported by OGRStyleTools.
1111 : */
1112 : typedef enum ogr_style_tool_units_id
1113 : {
1114 : OGRSTUGround = 0, /**< Ground unit */
1115 : OGRSTUPixel = 1, /**< Pixel */
1116 : OGRSTUPoints = 2, /**< Points */
1117 : OGRSTUMM = 3, /**< Millimeter */
1118 : OGRSTUCM = 4, /**< Centimeter */
1119 : OGRSTUInches = 5 /**< Inch */
1120 : } OGRSTUnitId;
1121 :
1122 : /**
1123 : * List of parameters for use with OGRStylePen.
1124 : */
1125 : typedef enum ogr_style_tool_param_pen_id
1126 : {
1127 : OGRSTPenColor = 0, /**< Color */
1128 : OGRSTPenWidth = 1, /**< Width */
1129 : OGRSTPenPattern = 2, /**< Pattern */
1130 : OGRSTPenId = 3, /**< Id */
1131 : OGRSTPenPerOffset = 4, /**< Perpendicular offset */
1132 : OGRSTPenCap = 5, /**< Cap */
1133 : OGRSTPenJoin = 6, /**< Join */
1134 : OGRSTPenPriority = 7, /**< Priority */
1135 : #ifndef DOXYGEN_SKIP
1136 : OGRSTPenLast = 8
1137 : #endif
1138 : } OGRSTPenParam;
1139 :
1140 : /**
1141 : * List of parameters for use with OGRStyleBrush.
1142 : */
1143 : typedef enum ogr_style_tool_param_brush_id
1144 : {
1145 : OGRSTBrushFColor = 0, /**< Foreground color */
1146 : OGRSTBrushBColor = 1, /**< Background color */
1147 : OGRSTBrushId = 2, /**< Id */
1148 : OGRSTBrushAngle = 3, /**< Angle */
1149 : OGRSTBrushSize = 4, /**< Size */
1150 : OGRSTBrushDx = 5, /**< Dx */
1151 : OGRSTBrushDy = 6, /**< Dy */
1152 : OGRSTBrushPriority = 7, /**< Priority */
1153 : #ifndef DOXYGEN_SKIP
1154 : OGRSTBrushLast = 8
1155 : #endif
1156 :
1157 : } OGRSTBrushParam;
1158 :
1159 : /**
1160 : * List of parameters for use with OGRStyleSymbol.
1161 : */
1162 : typedef enum ogr_style_tool_param_symbol_id
1163 : {
1164 : OGRSTSymbolId = 0, /**< Id */
1165 : OGRSTSymbolAngle = 1, /**< Angle */
1166 : OGRSTSymbolColor = 2, /**< Color */
1167 : OGRSTSymbolSize = 3, /**< Size */
1168 : OGRSTSymbolDx = 4, /**< Dx */
1169 : OGRSTSymbolDy = 5, /**< Dy */
1170 : OGRSTSymbolStep = 6, /**< Step */
1171 : OGRSTSymbolPerp = 7, /**< Perpendicular */
1172 : OGRSTSymbolOffset = 8, /**< Offset */
1173 : OGRSTSymbolPriority = 9, /**< Priority */
1174 : OGRSTSymbolFontName = 10, /**< Font name */
1175 : OGRSTSymbolOColor = 11, /**< Outline color */
1176 : #ifndef DOXYGEN_SKIP
1177 : OGRSTSymbolLast = 12
1178 : #endif
1179 : } OGRSTSymbolParam;
1180 :
1181 : /**
1182 : * List of parameters for use with OGRStyleLabel.
1183 : */
1184 : typedef enum ogr_style_tool_param_label_id
1185 : {
1186 : OGRSTLabelFontName = 0, /**< Font name */
1187 : OGRSTLabelSize = 1, /**< Size */
1188 : OGRSTLabelTextString = 2, /**< Text string */
1189 : OGRSTLabelAngle = 3, /**< Angle */
1190 : OGRSTLabelFColor = 4, /**< Foreground color */
1191 : OGRSTLabelBColor = 5, /**< Background color */
1192 : OGRSTLabelPlacement = 6, /**< Placement */
1193 : OGRSTLabelAnchor = 7, /**< Anchor */
1194 : OGRSTLabelDx = 8, /**< Dx */
1195 : OGRSTLabelDy = 9, /**< Dy */
1196 : OGRSTLabelPerp = 10, /**< Perpendicular */
1197 : OGRSTLabelBold = 11, /**< Bold */
1198 : OGRSTLabelItalic = 12, /**< Italic */
1199 : OGRSTLabelUnderline = 13, /**< Underline */
1200 : OGRSTLabelPriority = 14, /**< Priority */
1201 : OGRSTLabelStrikeout = 15, /**< Strike out */
1202 : OGRSTLabelStretch = 16, /**< Stretch */
1203 : OGRSTLabelAdjHor = 17, /**< OBSOLETE; do not use */
1204 : OGRSTLabelAdjVert = 18, /**< OBSOLETE; do not use */
1205 : OGRSTLabelHColor = 19, /**< Highlight color */
1206 : OGRSTLabelOColor = 20, /**< Outline color */
1207 : #ifndef DOXYGEN_SKIP
1208 : OGRSTLabelLast = 21
1209 : #endif
1210 : } OGRSTLabelParam;
1211 :
1212 : /* -------------------------------------------------------------------- */
1213 : /* Field domains */
1214 : /* -------------------------------------------------------------------- */
1215 :
1216 : /** Associates a code and a value
1217 : *
1218 : * @since GDAL 3.3
1219 : */
1220 : typedef struct
1221 : {
1222 : /** Code. Content should be of the type of the OGRFieldDomain */
1223 : char *pszCode;
1224 :
1225 : /** Value. Might be NULL */
1226 : char *pszValue;
1227 : } OGRCodedValue;
1228 :
1229 : /** Type of field domain.
1230 : *
1231 : * @since GDAL 3.3
1232 : */
1233 : typedef enum
1234 : {
1235 : /** Coded */
1236 : OFDT_CODED,
1237 : /** Range (min/max) */
1238 : OFDT_RANGE,
1239 : /** Glob (used by GeoPackage) */
1240 : OFDT_GLOB
1241 : } OGRFieldDomainType;
1242 :
1243 : /** Split policy for field domains.
1244 : *
1245 : * When a feature is split in two, defines how the value of attributes
1246 : * following the domain are computed.
1247 : *
1248 : * @since GDAL 3.3
1249 : */
1250 : typedef enum
1251 : {
1252 : /** Default value */
1253 : OFDSP_DEFAULT_VALUE,
1254 : /** Duplicate */
1255 : OFDSP_DUPLICATE,
1256 : /** New values are computed by the ratio of their area/length compared to
1257 : the area/length of the original feature */
1258 : OFDSP_GEOMETRY_RATIO
1259 : } OGRFieldDomainSplitPolicy;
1260 :
1261 : /** Merge policy for field domains.
1262 : *
1263 : * When a feature is built by merging two features, defines how the value of
1264 : * attributes following the domain are computed.
1265 : *
1266 : * @since GDAL 3.3
1267 : */
1268 : typedef enum
1269 : {
1270 : /** Default value */
1271 : OFDMP_DEFAULT_VALUE,
1272 : /** Sum */
1273 : OFDMP_SUM,
1274 : /** New values are computed as the weighted average of the source values. */
1275 : OFDMP_GEOMETRY_WEIGHTED
1276 : } OGRFieldDomainMergePolicy;
1277 :
1278 : /* ------------------------------------------------------------------- */
1279 : /* Version checking */
1280 : /* -------------------------------------------------------------------- */
1281 :
1282 : #ifndef DOXYGEN_SKIP
1283 :
1284 : /* Note to developers : please keep this section in sync with gdal.h */
1285 :
1286 : #ifndef GDAL_VERSION_INFO_DEFINED
1287 : #define GDAL_VERSION_INFO_DEFINED
1288 : const char CPL_DLL *CPL_STDCALL GDALVersionInfo(const char *);
1289 : #endif
1290 :
1291 : #ifndef GDAL_CHECK_VERSION
1292 :
1293 : /** Return TRUE if GDAL library version at runtime matches
1294 : nVersionMajor.nVersionMinor.
1295 :
1296 : The purpose of this method is to ensure that calling code will run with the
1297 : GDAL version it is compiled for. It is primarily indented for external
1298 : plugins.
1299 :
1300 : @param nVersionMajor Major version to be tested against
1301 : @param nVersionMinor Minor version to be tested against
1302 : @param pszCallingComponentName If not NULL, in case of version mismatch, the
1303 : method will issue a failure mentioning the name of the calling component.
1304 : */
1305 : int CPL_DLL CPL_STDCALL GDALCheckVersion(int nVersionMajor, int nVersionMinor,
1306 : const char *pszCallingComponentName);
1307 :
1308 : /** Helper macro for GDALCheckVersion */
1309 : #define GDAL_CHECK_VERSION(pszCallingComponentName) \
1310 : GDALCheckVersion(GDAL_VERSION_MAJOR, GDAL_VERSION_MINOR, \
1311 : pszCallingComponentName)
1312 :
1313 : #endif
1314 :
1315 : #endif /* #ifndef DOXYGEN_SKIP */
1316 :
1317 : CPL_C_END
1318 :
1319 : #endif /* ndef OGR_CORE_H_INCLUDED */
|