Coverage Report

Created: 2025-06-22 06:59

/src/gdal/ogr/ogr_wkb.h
Line
Count
Source (jump to first uncovered line)
1
/******************************************************************************
2
 *
3
 * Project:  OGR
4
 * Purpose:  WKB geometry related methods
5
 * Author:   Even Rouault <even dot rouault at spatialys.com>
6
 *
7
 ******************************************************************************
8
 * Copyright (c) 2022, Even Rouault <even dot rouault at spatialys.com>
9
 *
10
 * SPDX-License-Identifier: MIT
11
 ****************************************************************************/
12
13
#ifndef OGR_WKB_H_INCLUDED
14
#define OGR_WKB_H_INCLUDED
15
16
#include <cstdint>
17
18
#include "cpl_port.h"
19
#include "ogr_core.h"
20
21
#include <vector>
22
23
bool CPL_DLL OGRWKBGetGeomType(const GByte *pabyWkb, size_t nWKBSize,
24
                               bool &bNeedSwap, uint32_t &nType);
25
bool OGRWKBPolygonGetArea(const GByte *&pabyWkb, size_t &nWKBSize,
26
                          double &dfArea);
27
bool OGRWKBMultiPolygonGetArea(const GByte *&pabyWkb, size_t &nWKBSize,
28
                               double &dfArea);
29
30
bool CPL_DLL OGRWKBGetBoundingBox(const GByte *pabyWkb, size_t nWKBSize,
31
                                  OGREnvelope3D &sEnvelope);
32
33
bool CPL_DLL OGRWKBGetBoundingBox(const GByte *pabyWkb, size_t nWKBSize,
34
                                  OGREnvelope &sEnvelope);
35
36
bool CPL_DLL OGRWKBIntersectsPessimistic(const GByte *pabyWkb, size_t nWKBSize,
37
                                         const OGREnvelope &sEnvelope);
38
39
void CPL_DLL OGRWKBFixupCounterClockWiseExternalRing(GByte *pabyWkb,
40
                                                     size_t nWKBSize);
41
42
/** Modifies a PostGIS-style Extended WKB geometry to a regular WKB one.
43
 * pabyEWKB will be modified in place.
44
 * The return value will be either at the beginning of pabyEWKB or 4 bytes
45
 * later, and thus has the same lifetime of pabyEWKB. The function returns in
46
 * nWKBSizeOut the length of the returned WKB pointer. pnSRIDOut may be NULL, or
47
 * if not NULL, the function will return in it the SRID, if present, or INT_MIN
48
 * if not present.
49
 */
50
const GByte CPL_DLL *WKBFromEWKB(GByte *pabyEWKB, size_t nEWKBSize,
51
                                 size_t &nWKBSizeOut, int *pnSRIDOut);
52
53
/** Object to update point coordinates in a WKB geometry */
54
class CPL_DLL OGRWKBPointUpdater
55
{
56
  public:
57
    OGRWKBPointUpdater();
58
    virtual ~OGRWKBPointUpdater();
59
60
    /** Update method */
61
    virtual bool update(bool bNeedSwap, void *x, void *y, void *z, void *m) = 0;
62
};
63
64
bool CPL_DLL OGRWKBUpdatePoints(GByte *pabyWkb, size_t nWKBSize,
65
                                OGRWKBPointUpdater &oUpdater);
66
67
/** Transformation cache */
68
struct CPL_DLL OGRWKBTransformCache
69
{
70
#ifdef OGR_WKB_TRANSFORM_ALL_AT_ONCE
71
    std::vector<bool> abNeedSwap{};
72
    std::vector<bool> abIsEmpty{};
73
    std::vector<void *> apdfX{};
74
    std::vector<void *> apdfY{};
75
    std::vector<void *> apdfZ{};
76
    std::vector<void *> apdfM{};
77
    std::vector<double> adfX{};
78
    std::vector<double> adfY{};
79
    std::vector<double> adfZ{};
80
    std::vector<double> adfM{};
81
    std::vector<int> anErrorCodes{};
82
83
    void clear();
84
#endif
85
};
86
87
class OGRCoordinateTransformation;
88
bool CPL_DLL OGRWKBTransform(GByte *pabyWkb, size_t nWKBSize,
89
                             OGRCoordinateTransformation *poCT,
90
                             OGRWKBTransformCache &oCache,
91
                             OGREnvelope3D &sEnvelope);
92
93
/************************************************************************/
94
/*                       OGRAppendBuffer                                */
95
/************************************************************************/
96
97
/** Append buffer that can be grown dynamically. */
98
class CPL_DLL OGRAppendBuffer
99
{
100
  public:
101
    /** Constructor */
102
    OGRAppendBuffer();
103
104
    /** Destructor */
105
    virtual ~OGRAppendBuffer();
106
107
    /** Return the pointer at which nItemSize bytes can be written,
108
     * or nullptr in case of error.
109
     */
110
    inline void *GetPtrForNewBytes(size_t nItemSize)
111
0
    {
112
0
        if (nItemSize > m_nCapacity - m_nSize)
113
0
        {
114
0
            if (!Grow(nItemSize))
115
0
                return nullptr;
116
0
        }
117
0
        void *pRet = static_cast<GByte *>(m_pRawBuffer) + m_nSize;
118
0
        m_nSize += nItemSize;
119
0
        return pRet;
120
0
    }
121
122
    /** Return the number of valid bytes in the buffer. */
123
    inline size_t GetSize() const
124
0
    {
125
0
        return m_nSize;
126
0
    }
127
128
  protected:
129
    /** Capacity of the buffer (ie number of bytes allocated). */
130
    size_t m_nCapacity = 0;
131
132
    /** Number of valid bytes in the buffer. */
133
    size_t m_nSize = 0;
134
135
    /** Raw buffer pointer. */
136
    void *m_pRawBuffer = nullptr;
137
138
    /** Extend the capacity of m_pRawBuffer to be at least m_nSize + nItemSize
139
     * large.
140
     */
141
    virtual bool Grow(size_t nItemSize) = 0;
142
143
  private:
144
    OGRAppendBuffer(const OGRAppendBuffer &) = delete;
145
    OGRAppendBuffer &operator=(const OGRAppendBuffer &) = delete;
146
};
147
148
/************************************************************************/
149
/*                       OGRWKTToWKBTranslator                          */
150
/************************************************************************/
151
152
/** Translate WKT geometry to WKB geometry and append it to a buffer */
153
class CPL_DLL OGRWKTToWKBTranslator
154
{
155
    OGRAppendBuffer &m_oAppendBuffer;
156
    bool m_bCanUseStrtod = false;
157
158
  public:
159
    /** Constructor */
160
    explicit OGRWKTToWKBTranslator(OGRAppendBuffer &oAppendBuffer);
161
162
    /** Translate the WKT geometry starting at pabyWKTStart and of length nLength.
163
     *
164
     * If pabyWKTStart[nLength] can be dereferenced and temporarily modified,
165
     * set bCanAlterByteAfter to true, which will optimize performance.
166
     *
167
     * Returns the number of bytes of the generated WKB, or -1 in case of error.
168
     */
169
    size_t TranslateWKT(void *pabyWKTStart, size_t nLength,
170
                        bool bCanAlterByteAfter);
171
};
172
173
#endif  // OGR_WKB_H_INCLUDED