Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: PlanetLabs scene driver 4 : * Purpose: PLScenes driver interface 5 : * Author: Even Rouault, even dot rouault at spatialys.com 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2015, Planet Labs 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #ifndef OGR_PLSCENES_H_INCLUDED 14 : #define OGR_PLSCENES_H_INCLUDED 15 : 16 : #include "gdal_priv.h" 17 : #include "ogrsf_frmts.h" 18 : #include "ogr_srs_api.h" 19 : #include "cpl_http.h" 20 : #include "ogrlibjsonutils.h" 21 : #include "ogr_swq.h" 22 : #include <map> 23 : #include <set> 24 : #include <vector> 25 : 26 : class OGRPLScenesDataV1Layer; 27 : 28 : class OGRPLScenesDataV1Dataset final : public GDALDataset 29 : { 30 : bool m_bLayerListInitialized; 31 : bool m_bMustCleanPersistent; 32 : CPLString m_osBaseURL; 33 : CPLString m_osAPIKey; 34 : CPLString m_osNextItemTypesPageURL; 35 : CPLString m_osFilter; 36 : 37 : int m_nLayers; 38 : OGRPLScenesDataV1Layer **m_papoLayers; 39 : 40 : bool m_bFollowLinks; 41 : 42 : char **GetBaseHTTPOptions(); 43 : OGRLayer *ParseItemType(json_object *poItemType); 44 : bool ParseItemTypes(json_object *poObj, CPLString &osNext); 45 : void EstablishLayerList(); 46 : GDALDataset *OpenRasterScene(GDALOpenInfo *poOpenInfo, CPLString osScene, 47 : char **papszOptions); 48 : CPLString InsertAPIKeyInURL(CPLString osURL); 49 : 50 : public: 51 : OGRPLScenesDataV1Dataset(); 52 : virtual ~OGRPLScenesDataV1Dataset(); 53 : 54 : virtual int GetLayerCount() override; 55 : virtual OGRLayer *GetLayer(int idx) override; 56 : virtual OGRLayer *GetLayerByName(const char *pszName) override; 57 : 58 : json_object *RunRequest(const char *pszURL, int bQuiet404Error = FALSE, 59 : const char *pszHTTPVerb = "GET", 60 : bool bExpectJSonReturn = true, 61 : const char *pszPostContent = nullptr); 62 : 63 21 : bool DoesFollowLinks() const 64 : { 65 21 : return m_bFollowLinks; 66 : } 67 : 68 18 : const CPLString &GetFilter() const 69 : { 70 18 : return m_osFilter; 71 : } 72 : 73 58 : const CPLString &GetBaseURL() const 74 : { 75 58 : return m_osBaseURL; 76 : } 77 : 78 : static GDALDataset *Open(GDALOpenInfo *poOpenInfo); 79 : }; 80 : 81 : class OGRPLScenesDataV1FeatureDefn final : public OGRFeatureDefn 82 : { 83 : OGRPLScenesDataV1Layer *m_poLayer; 84 : 85 : public: 86 12 : OGRPLScenesDataV1FeatureDefn(OGRPLScenesDataV1Layer *poLayer, 87 : const char *pszName) 88 12 : : OGRFeatureDefn(pszName), m_poLayer(poLayer) 89 : { 90 12 : } 91 : 92 24 : ~OGRPLScenesDataV1FeatureDefn() 93 12 : { 94 24 : } 95 : 96 : virtual int GetFieldCount() const override; 97 : 98 12 : void DropRefToLayer() 99 : { 100 12 : m_poLayer = nullptr; 101 12 : } 102 : }; 103 : 104 : class OGRPLScenesDataV1Layer final : public OGRLayer 105 : { 106 : friend class OGRPLScenesDataV1Dataset; 107 : friend class OGRPLScenesDataV1FeatureDefn; 108 : 109 : OGRPLScenesDataV1Dataset *m_poDS; 110 : bool m_bFeatureDefnEstablished; 111 : OGRPLScenesDataV1FeatureDefn *m_poFeatureDefn; 112 : OGRSpatialReference *m_poSRS; 113 : GIntBig m_nTotalFeatures; 114 : std::map<CPLString, int> m_oMapPrefixedJSonFieldNameToFieldIdx; 115 : std::map<int, CPLString> m_oMapFieldIdxToQueryableJSonFieldName; 116 : 117 : GIntBig m_nNextFID; 118 : bool m_bEOF; 119 : bool m_bStillInFirstPage; 120 : CPLString m_osNextURL; 121 : CPLString m_osRequestURL; 122 : int m_nPageSize; 123 : bool m_bInFeatureCountOrGetExtent; 124 : 125 : json_object *m_poPageObj; 126 : json_object *m_poFeatures; 127 : int m_nFeatureIdx; 128 : 129 : json_object *m_poAttributeFilter; 130 : bool m_bFilterMustBeClientSideEvaluated; 131 : 132 : std::set<CPLString> m_oSetAssets; 133 : std::set<CPLString> m_oSetUnregisteredAssets; 134 : std::set<CPLString> m_oSetUnregisteredFields; 135 : 136 : OGRFeature *GetNextRawFeature(); 137 : bool 138 : SetFieldFromPrefixedJSonFieldName(OGRFeature *poFeature, 139 : const CPLString &osPrefixedJSonFieldName, 140 : json_object *poVal); 141 : void EstablishLayerDefn(); 142 : void RegisterField(OGRFieldDefn *poFieldDefn, 143 : const char *pszQueryableJSonName, 144 : const char *pszPrefixedJSonName); 145 : bool GetNextPage(); 146 : json_object *BuildFilter(swq_expr_node *poNode); 147 : bool IsSimpleComparison(const swq_expr_node *poNode); 148 : 149 : public: 150 : OGRPLScenesDataV1Layer(OGRPLScenesDataV1Dataset *poDS, const char *pszName); 151 : virtual ~OGRPLScenesDataV1Layer(); 152 : 153 : virtual void ResetReading() override; 154 : virtual OGRFeature *GetNextFeature() override; 155 : virtual int TestCapability(const char *) override; 156 : virtual OGRFeatureDefn *GetLayerDefn() override; 157 : virtual GIntBig GetFeatureCount(int bForce = FALSE) override; 158 : 159 : virtual char **GetMetadata(const char *pszDomain = "") override; 160 : virtual const char *GetMetadataItem(const char *pszName, 161 : const char *pszDomain = "") override; 162 : 163 : virtual void SetSpatialFilter(OGRGeometry *poGeom) override; 164 : 165 1 : virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override 166 : { 167 1 : OGRLayer::SetSpatialFilter(iGeomField, poGeom); 168 1 : } 169 : 170 : virtual OGRErr SetAttributeFilter(const char *) override; 171 : 172 : virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override; 173 : 174 1 : virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent, 175 : int bForce) override 176 : { 177 1 : return OGRLayer::GetExtent(iGeomField, psExtent, bForce); 178 : } 179 : }; 180 : 181 : #endif /* ndef OGR_PLSCENES_H_INCLUDED */