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