LCOV - code coverage report
Current view: top level - ogr/ogrsf_frmts/geojson - ogrgeojsonreader.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 11 11 100.0 %
Date: 2024-11-21 22:18:42 Functions: 6 6 100.0 %

          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 */

Generated by: LCOV version 1.14