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 : * Permission is hereby granted, free of charge, to any person obtaining a
12 : * copy of this software and associated documentation files (the "Software"),
13 : * to deal in the Software without restriction, including without limitation
14 : * the rights to use, copy, modify, merge, publish, distribute, sublicense,
15 : * and/or sell copies of the Software, and to permit persons to whom the
16 : * Software is furnished to do so, subject to the following conditions:
17 : *
18 : * The above copyright notice and this permission notice shall be included
19 : * in all copies or substantial portions of the Software.
20 : *
21 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22 : * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27 : * DEALINGS IN THE SOFTWARE.
28 : ****************************************************************************/
29 :
30 : #ifndef OGR_PLSCENES_H_INCLUDED
31 : #define OGR_PLSCENES_H_INCLUDED
32 :
33 : #include "gdal_priv.h"
34 : #include "ogrsf_frmts.h"
35 : #include "ogr_srs_api.h"
36 : #include "cpl_http.h"
37 : #include "ogr_geojson.h"
38 : #include "ogrgeojsonreader.h"
39 : #include "ogr_swq.h"
40 : #include <map>
41 : #include <set>
42 : #include <vector>
43 :
44 : class OGRPLScenesDataV1Layer;
45 :
46 : class OGRPLScenesDataV1Dataset final : public GDALDataset
47 : {
48 : bool m_bLayerListInitialized;
49 : bool m_bMustCleanPersistent;
50 : CPLString m_osBaseURL;
51 : CPLString m_osAPIKey;
52 : CPLString m_osNextItemTypesPageURL;
53 : CPLString m_osFilter;
54 :
55 : int m_nLayers;
56 : OGRPLScenesDataV1Layer **m_papoLayers;
57 :
58 : bool m_bFollowLinks;
59 :
60 : char **GetBaseHTTPOptions();
61 : OGRLayer *ParseItemType(json_object *poItemType);
62 : bool ParseItemTypes(json_object *poObj, CPLString &osNext);
63 : void EstablishLayerList();
64 : GDALDataset *OpenRasterScene(GDALOpenInfo *poOpenInfo, CPLString osScene,
65 : char **papszOptions);
66 : CPLString InsertAPIKeyInURL(CPLString osURL);
67 :
68 : public:
69 : OGRPLScenesDataV1Dataset();
70 : virtual ~OGRPLScenesDataV1Dataset();
71 :
72 : virtual int GetLayerCount() override;
73 : virtual OGRLayer *GetLayer(int idx) override;
74 : virtual OGRLayer *GetLayerByName(const char *pszName) override;
75 :
76 : json_object *RunRequest(const char *pszURL, int bQuiet404Error = FALSE,
77 : const char *pszHTTPVerb = "GET",
78 : bool bExpectJSonReturn = true,
79 : const char *pszPostContent = nullptr);
80 :
81 21 : bool DoesFollowLinks() const
82 : {
83 21 : return m_bFollowLinks;
84 : }
85 :
86 18 : const CPLString &GetFilter() const
87 : {
88 18 : return m_osFilter;
89 : }
90 :
91 58 : const CPLString &GetBaseURL() const
92 : {
93 58 : return m_osBaseURL;
94 : }
95 :
96 : static GDALDataset *Open(GDALOpenInfo *poOpenInfo);
97 : };
98 :
99 : class OGRPLScenesDataV1FeatureDefn final : public OGRFeatureDefn
100 : {
101 : OGRPLScenesDataV1Layer *m_poLayer;
102 :
103 : public:
104 12 : OGRPLScenesDataV1FeatureDefn(OGRPLScenesDataV1Layer *poLayer,
105 : const char *pszName)
106 12 : : OGRFeatureDefn(pszName), m_poLayer(poLayer)
107 : {
108 12 : }
109 :
110 24 : ~OGRPLScenesDataV1FeatureDefn()
111 12 : {
112 24 : }
113 :
114 : virtual int GetFieldCount() const override;
115 :
116 12 : void DropRefToLayer()
117 : {
118 12 : m_poLayer = nullptr;
119 12 : }
120 : };
121 :
122 : class OGRPLScenesDataV1Layer final : public OGRLayer
123 : {
124 : friend class OGRPLScenesDataV1Dataset;
125 : friend class OGRPLScenesDataV1FeatureDefn;
126 :
127 : OGRPLScenesDataV1Dataset *m_poDS;
128 : bool m_bFeatureDefnEstablished;
129 : OGRPLScenesDataV1FeatureDefn *m_poFeatureDefn;
130 : OGRSpatialReference *m_poSRS;
131 : GIntBig m_nTotalFeatures;
132 : std::map<CPLString, int> m_oMapPrefixedJSonFieldNameToFieldIdx;
133 : std::map<int, CPLString> m_oMapFieldIdxToQueryableJSonFieldName;
134 :
135 : GIntBig m_nNextFID;
136 : bool m_bEOF;
137 : bool m_bStillInFirstPage;
138 : CPLString m_osNextURL;
139 : CPLString m_osRequestURL;
140 : int m_nPageSize;
141 : bool m_bInFeatureCountOrGetExtent;
142 :
143 : json_object *m_poPageObj;
144 : json_object *m_poFeatures;
145 : int m_nFeatureIdx;
146 :
147 : json_object *m_poAttributeFilter;
148 : bool m_bFilterMustBeClientSideEvaluated;
149 :
150 : std::set<CPLString> m_oSetAssets;
151 : std::set<CPLString> m_oSetUnregisteredAssets;
152 : std::set<CPLString> m_oSetUnregisteredFields;
153 :
154 : OGRFeature *GetNextRawFeature();
155 : bool
156 : SetFieldFromPrefixedJSonFieldName(OGRFeature *poFeature,
157 : const CPLString &osPrefixedJSonFieldName,
158 : json_object *poVal);
159 : void EstablishLayerDefn();
160 : void RegisterField(OGRFieldDefn *poFieldDefn,
161 : const char *pszQueryableJSonName,
162 : const char *pszPrefixedJSonName);
163 : bool GetNextPage();
164 : json_object *BuildFilter(swq_expr_node *poNode);
165 : bool IsSimpleComparison(const swq_expr_node *poNode);
166 :
167 : public:
168 : OGRPLScenesDataV1Layer(OGRPLScenesDataV1Dataset *poDS, const char *pszName);
169 : virtual ~OGRPLScenesDataV1Layer();
170 :
171 : virtual void ResetReading() override;
172 : virtual OGRFeature *GetNextFeature() override;
173 : virtual int TestCapability(const char *) override;
174 : virtual OGRFeatureDefn *GetLayerDefn() override;
175 : virtual GIntBig GetFeatureCount(int bForce = FALSE) override;
176 :
177 : virtual char **GetMetadata(const char *pszDomain = "") override;
178 : virtual const char *GetMetadataItem(const char *pszName,
179 : const char *pszDomain = "") override;
180 :
181 : virtual void SetSpatialFilter(OGRGeometry *poGeom) override;
182 :
183 1 : virtual void SetSpatialFilter(int iGeomField, OGRGeometry *poGeom) override
184 : {
185 1 : OGRLayer::SetSpatialFilter(iGeomField, poGeom);
186 1 : }
187 :
188 : virtual OGRErr SetAttributeFilter(const char *) override;
189 :
190 : virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce) override;
191 :
192 1 : virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent,
193 : int bForce) override
194 : {
195 1 : return OGRLayer::GetExtent(iGeomField, psExtent, bForce);
196 : }
197 : };
198 :
199 : #endif /* ndef OGR_PLSCENES_H_INCLUDED */
|