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