Coverage Report

Created: 2026-02-14 06:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gdal/ogr/ogrsf_frmts/geojson/ogrgeojsonreader.h
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Project:  OpenGIS Simple Features Reference Implementation
4
 * Purpose:  Defines GeoJSON reader within OGR OGRGeoJSON Driver.
5
 * Author:   Mateusz Loskot, mateusz@loskot.net
6
 *
7
 ******************************************************************************
8
 * Copyright (c) 2007, Mateusz Loskot
9
 * Copyright (c) 2010-2013, Even Rouault <even dot rouault at spatialys.com>
10
 *
11
 * SPDX-License-Identifier: MIT
12
 ****************************************************************************/
13
#ifndef OGR_GEOJSONREADER_H_INCLUDED
14
#define OGR_GEOJSONREADER_H_INCLUDED
15
16
#include "cpl_json_header.h"
17
#include "cpl_string.h"
18
#include "ogr_core.h"
19
#include "ogrsf_frmts.h"
20
21
#include "ogrgeojsonutils.h"
22
#include "directedacyclicgraph.hpp"
23
24
#include <utility>
25
#include <map>
26
#include <set>
27
#include <vector>
28
29
/************************************************************************/
30
/*                         FORWARD DECLARATIONS                         */
31
/************************************************************************/
32
33
class OGRGeometry;
34
class OGRRawPoint;
35
class OGRPoint;
36
class OGRMultiPoint;
37
class OGRLineString;
38
class OGRMultiLineString;
39
class OGRLinearRing;
40
class OGRPolygon;
41
class OGRMultiPolygon;
42
class OGRGeometryCollection;
43
class OGRFeature;
44
class OGRGeoJSONLayer;
45
class OGRSpatialReference;
46
47
/************************************************************************/
48
/*                         OGRGeoJSONBaseReader                         */
49
/************************************************************************/
50
51
class OGRGeoJSONBaseReader
52
{
53
  public:
54
    OGRGeoJSONBaseReader();
55
56
    void SetPreserveGeometryType(bool bPreserve);
57
    void SetSkipAttributes(bool bSkip);
58
    void SetFlattenNestedAttributes(bool bFlatten, char chSeparator);
59
    void SetStoreNativeData(bool bStoreNativeData);
60
    void SetArrayAsString(bool bArrayAsString);
61
    void SetDateAsString(bool bDateAsString);
62
63
    enum class ForeignMemberProcessing
64
    {
65
        AUTO,
66
        ALL,
67
        NONE,
68
        STAC,
69
    };
70
71
    void
72
    SetForeignMemberProcessing(ForeignMemberProcessing eForeignMemberProcessing)
73
0
    {
74
0
        eForeignMemberProcessing_ = eForeignMemberProcessing;
75
0
    }
76
77
    bool GenerateFeatureDefn(
78
        std::map<std::string, int> &oMapFieldNameToIdx,
79
        std::vector<std::unique_ptr<OGRFieldDefn>> &apoFieldDefn,
80
        gdal::DirectedAcyclicGraph<int, std::string> &dag, OGRLayer *poLayer,
81
        json_object *poObj);
82
    void FinalizeLayerDefn(OGRLayer *poLayer, CPLString &osFIDColumn);
83
84
    OGRGeometry *ReadGeometry(json_object *poObj,
85
                              const OGRSpatialReference *poLayerSRS);
86
    OGRFeature *ReadFeature(OGRLayer *poLayer, json_object *poObj,
87
                            const char *pszSerializedObj);
88
89
    bool ExtentRead() const;
90
91
    OGREnvelope3D GetExtent3D() const;
92
93
  protected:
94
    bool bGeometryPreserve_ = true;
95
    bool bAttributesSkip_ = false;
96
    bool bFlattenNestedAttributes_ = false;
97
    char chNestedAttributeSeparator_ = 0;
98
    bool bStoreNativeData_ = false;
99
    bool bArrayAsString_ = false;
100
    bool bDateAsString_ = false;
101
    ForeignMemberProcessing eForeignMemberProcessing_ =
102
        ForeignMemberProcessing::AUTO;
103
104
  private:
105
    std::set<int> aoSetUndeterminedTypeFields_;
106
107
    // bFlatten... is a tri-state boolean with -1 being unset.
108
    int bFlattenGeocouchSpatiallistFormat = -1;
109
110
    bool bFoundGeocouchId = false;
111
    bool bFoundRev = false;
112
    bool bFoundTypeFeature = false;
113
    bool bIsGeocouchSpatiallistFormat = false;
114
    bool bFeatureLevelIdAsAttribute_ = false;
115
    bool bFeatureLevelIdAsFID_ = false;
116
    bool m_bNeedFID64 = false;
117
118
    bool m_bFirstGeometry = true;
119
    OGREnvelope3D m_oEnvelope3D;
120
    // Becomes true when extent has been read from data
121
    bool m_bExtentRead = false;
122
    OGRwkbGeometryType m_eLayerGeomType = wkbUnknown;
123
124
    CPL_DISALLOW_COPY_ASSIGN(OGRGeoJSONBaseReader)
125
};
126
127
/************************************************************************/
128
/*                           OGRGeoJSONReader                           */
129
/************************************************************************/
130
131
class OGRGeoJSONDataSource;
132
class OGRGeoJSONReaderStreamingParser;
133
134
class OGRGeoJSONReader : public OGRGeoJSONBaseReader
135
{
136
  public:
137
    OGRGeoJSONReader();
138
    ~OGRGeoJSONReader();
139
140
    OGRErr Parse(const char *pszText);
141
    void ReadLayers(OGRGeoJSONDataSource *poDS);
142
    void ReadLayer(OGRGeoJSONDataSource *poDS, const char *pszName,
143
                   json_object *poObj);
144
    bool FirstPassReadLayer(OGRGeoJSONDataSource *poDS, VSILFILE *fp,
145
                            bool &bTryStandardReading);
146
147
    json_object *GetJSonObject()
148
0
    {
149
0
        return poGJObject_;
150
0
    }
151
152
    void ResetReading();
153
    OGRFeature *GetNextFeature(OGRGeoJSONLayer *poLayer);
154
    OGRFeature *GetFeature(OGRGeoJSONLayer *poLayer, GIntBig nFID);
155
    bool IngestAll(OGRGeoJSONLayer *poLayer);
156
157
    VSILFILE *GetFP()
158
0
    {
159
0
        return fp_;
160
0
    }
161
162
    bool CanEasilyAppend() const
163
0
    {
164
0
        return bCanEasilyAppend_;
165
0
    }
166
167
    bool FCHasBBOX() const
168
0
    {
169
0
        return bFCHasBBOX_;
170
0
    }
171
172
  private:
173
    friend class OGRGeoJSONReaderStreamingParser;
174
175
    json_object *poGJObject_;
176
    OGRGeoJSONReaderStreamingParser *poStreamingParser_;
177
    bool bFirstSeg_;
178
    bool bJSonPLikeWrapper_;
179
    VSILFILE *fp_;
180
    bool bCanEasilyAppend_;
181
    bool bFCHasBBOX_;
182
    bool bOriginalIdModifiedEmitted_ = false;
183
184
    size_t nBufferSize_;
185
    GByte *pabyBuffer_;
186
187
    GIntBig nTotalFeatureCount_;
188
    GUIntBig nTotalOGRFeatureMemEstimate_;
189
190
    std::map<GIntBig, std::pair<vsi_l_offset, vsi_l_offset>>
191
        oMapFIDToOffsetSize_;
192
    //
193
    // Copy operations not supported.
194
    //
195
    CPL_DISALLOW_COPY_ASSIGN(OGRGeoJSONReader)
196
197
    //
198
    // Translation utilities.
199
    //
200
    bool GenerateLayerDefn(OGRGeoJSONLayer *poLayer, json_object *poGJObject);
201
202
    static bool AddFeature(OGRGeoJSONLayer *poLayer,
203
                           std::unique_ptr<OGRGeometry> poGeometry);
204
    static bool AddFeature(OGRGeoJSONLayer *poLayer,
205
                           std::unique_ptr<OGRFeature> poFeature);
206
207
    void ReadFeatureCollection(OGRGeoJSONLayer *poLayer, json_object *poObj);
208
    size_t SkipPrologEpilogAndUpdateJSonPLikeWrapper(size_t nRead);
209
};
210
211
void OGRGeoJSONGenerateFeatureDefnDealWithID(
212
    json_object *poObj, json_object *poObjProps, int &nPrevFieldIdx,
213
    std::map<std::string, int> &oMapFieldNameToIdx,
214
    std::vector<std::unique_ptr<OGRFieldDefn>> &apoFieldDefn,
215
    gdal::DirectedAcyclicGraph<int, std::string> &dag,
216
    bool &bFeatureLevelIdAsFID, bool &bFeatureLevelIdAsAttribute,
217
    bool &bNeedFID64);
218
219
void OGRGeoJSONReaderSetField(OGRLayer *poLayer, OGRFeature *poFeature,
220
                              int nField, const char *pszAttrPrefix,
221
                              json_object *poVal, bool bFlattenNestedAttributes,
222
                              char chNestedAttributeSeparator);
223
void OGRGeoJSONReaderAddOrUpdateField(
224
    std::vector<int> &retIndices,
225
    std::map<std::string, int> &oMapFieldNameToIdx,
226
    std::vector<std::unique_ptr<OGRFieldDefn>> &apoFieldDefn,
227
    const char *pszKey, json_object *poVal, bool bFlattenNestedAttributes,
228
    char chNestedAttributeSeparator, bool bArrayAsString, bool bDateAsString,
229
    std::set<int> &aoSetUndeterminedTypeFields);
230
231
/************************************************************************/
232
/*                      GeoJSON Parsing Utilities                       */
233
/************************************************************************/
234
235
bool OGRGeoJSONUpdateLayerGeomType(bool &bFirstGeom,
236
                                   OGRwkbGeometryType eGeomType,
237
                                   OGRwkbGeometryType &eLayerGeomType);
238
239
// Get the 3D extent from the geometry coordinates of a feature
240
bool OGRGeoJSONGetExtent3D(json_object *poObj, OGREnvelope3D *poEnvelope);
241
242
/************************************************************************/
243
/*                          OGRESRIJSONReader                           */
244
/************************************************************************/
245
246
class OGRESRIJSONReader
247
{
248
  public:
249
    OGRESRIJSONReader();
250
    ~OGRESRIJSONReader();
251
252
    OGRErr Parse(const char *pszText);
253
    void ReadLayers(OGRGeoJSONDataSource *poDS, GeoJSONSourceType eSourceType);
254
255
    json_object *GetJSonObject()
256
0
    {
257
0
        return poGJObject_;
258
0
    }
259
260
  private:
261
    json_object *poGJObject_;
262
    OGRGeoJSONLayer *poLayer_;
263
264
    //
265
    // Copy operations not supported.
266
    //
267
    OGRESRIJSONReader(OGRESRIJSONReader const &);
268
    OGRESRIJSONReader &operator=(OGRESRIJSONReader const &);
269
270
    //
271
    // Translation utilities.
272
    //
273
    bool GenerateLayerDefn();
274
    bool ParseField(json_object *poObj);
275
    bool AddFeature(std::unique_ptr<OGRFeature> poFeature);
276
277
    OGRFeature *ReadFeature(json_object *poObj);
278
    OGRGeoJSONLayer *ReadFeatureCollection(json_object *poObj);
279
};
280
281
/************************************************************************/
282
/*                          OGRTopoJSONReader                           */
283
/************************************************************************/
284
285
class OGRTopoJSONReader
286
{
287
  public:
288
    OGRTopoJSONReader();
289
    ~OGRTopoJSONReader();
290
291
    OGRErr Parse(const char *pszText, bool bLooseIdentification);
292
    void ReadLayers(OGRGeoJSONDataSource *poDS);
293
294
  private:
295
    json_object *poGJObject_;
296
297
    //
298
    // Copy operations not supported.
299
    //
300
    OGRTopoJSONReader(OGRTopoJSONReader const &);
301
    OGRTopoJSONReader &operator=(OGRTopoJSONReader const &);
302
};
303
304
#endif /* OGR_GEOJSONUTILS_H_INCLUDED */