Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: KML Driver 4 : * Purpose: Declarations for OGR wrapper classes for KML, and OGR->KML 5 : * translation of geometry. 6 : * Author: Christopher Condit, condit@sdsc.edu; 7 : * Jens Oberender, j.obi@troja.net 8 : * 9 : ****************************************************************************** 10 : * Copyright (c) 2006, Christopher Condit 11 : * 2007, Jens Oberender 12 : * Copyright (c) 2007-2014, Even Rouault <even dot rouault at spatialys.com> 13 : * 14 : * SPDX-License-Identifier: MIT 15 : ****************************************************************************/ 16 : #ifndef OGR_KML_H_INCLUDED 17 : #define OGR_KML_H_INCLUDED 18 : 19 : #include "ogrsf_frmts.h" 20 : 21 : #ifdef HAVE_EXPAT 22 : #include "kmlvector.h" 23 : #endif 24 : 25 : class OGRKMLDataSource; 26 : 27 : /************************************************************************/ 28 : /* OGRKMLLayer */ 29 : /************************************************************************/ 30 : 31 : class OGRKMLLayer final : public OGRLayer 32 : { 33 : public: 34 : OGRKMLLayer(const char *pszName_, const OGRSpatialReference *poSRS, 35 : bool bWriter, OGRwkbGeometryType eType, OGRKMLDataSource *poDS); 36 : ~OGRKMLLayer() override; 37 : 38 43 : OGRFeatureDefn *GetLayerDefn() 39 : { 40 43 : return poFeatureDefn_; 41 : } 42 : 43 : // 44 : // OGRLayer Interface 45 : // 46 : const OGRFeatureDefn *GetLayerDefn() const override; 47 : OGRErr ICreateFeature(OGRFeature *poFeature) override; 48 : OGRErr CreateField(const OGRFieldDefn *poField, 49 : int bApproxOK = TRUE) override; 50 : void ResetReading() override; 51 : OGRFeature *GetNextFeature() override; 52 : GIntBig GetFeatureCount(int bForce = TRUE) override; 53 : int TestCapability(const char *pszCap) const override; 54 : 55 : GDALDataset *GetDataset() override; 56 : 57 : // 58 : // OGRKMLLayer Interface 59 : // 60 : void SetLayerNumber(int nLayer); 61 : 62 19 : void SetClosedForWriting() 63 : { 64 19 : bClosedForWriting = true; 65 19 : } 66 : 67 : CPLString WriteSchema(); 68 : 69 : private: 70 : friend class OGRKMLDataSource; 71 : 72 : OGRKMLDataSource *poDS_ = nullptr; 73 : OGRSpatialReference *poSRS_ = nullptr; 74 : OGRCoordinateTransformation *poCT_ = nullptr; 75 : 76 : OGRFeatureDefn *poFeatureDefn_ = nullptr; 77 : 78 : int iNextKMLId_ = 0; 79 : bool bWriter_ = false; 80 : int nLayerNumber_ = 0; 81 : GIntBig nWroteFeatureCount_ = 0; 82 : bool bSchemaWritten_ = false; 83 : bool bClosedForWriting = false; 84 : char *pszName_ = nullptr; 85 : 86 : int nLastAsked = -1; 87 : int nLastCount = -1; 88 : 89 : CPL_DISALLOW_COPY_ASSIGN(OGRKMLLayer) 90 : }; 91 : 92 : /************************************************************************/ 93 : /* OGRKMLDataSource */ 94 : /************************************************************************/ 95 : 96 68 : class OGRKMLDataSource final : public GDALDataset 97 : { 98 : public: 99 : OGRKMLDataSource(); 100 : ~OGRKMLDataSource() override; 101 : 102 : int Open(const char *pszName, int bTestOpen); 103 : 104 879 : int GetLayerCount() const override 105 : { 106 879 : return nLayers_; 107 : } 108 : 109 : const OGRLayer *GetLayer(int nLayer) const override; 110 : OGRLayer *ICreateLayer(const char *pszName, 111 : const OGRGeomFieldDefn *poGeomFieldDefn, 112 : CSLConstList papszOptions) override; 113 : int TestCapability(const char *pszCap) const override; 114 : 115 : // 116 : // OGRKMLDataSource Interface 117 : // 118 : int Create(const char *pszName, CSLConstList papszOptions); 119 : 120 1581 : const char *GetNameField() const 121 : { 122 1581 : return pszNameField_; 123 : } 124 : 125 1497 : const char *GetDescriptionField() const 126 : { 127 1497 : return pszDescriptionField_; 128 : } 129 : 130 91 : const char *GetAltitudeMode() 131 : { 132 91 : return pszAltitudeMode_; 133 : } 134 : 135 128 : VSILFILE *GetOutputFP() 136 : { 137 128 : return fpOutput_; 138 : } 139 : 140 : void GrowExtents(OGREnvelope *psGeomBounds); 141 : #ifdef HAVE_EXPAT 142 854 : KMLVector *GetKMLFile() 143 : { 144 854 : return poKMLFile_; 145 : } 146 : #endif 147 : 148 0 : bool IsFirstCTError() const 149 : { 150 0 : return !bIssuedCTError_; 151 : } 152 : 153 0 : void IssuedFirstCTError() 154 : { 155 0 : bIssuedCTError_ = true; 156 0 : } 157 : 158 : private: 159 : #ifdef HAVE_EXPAT 160 : KMLVector *poKMLFile_ = nullptr; 161 : #endif 162 : 163 : OGRKMLLayer **papoLayers_ = nullptr; 164 : int nLayers_ = 0; 165 : 166 : // The name of the field to use for the KML name element. 167 : char *pszNameField_ = nullptr; 168 : char *pszDescriptionField_ = nullptr; 169 : 170 : // The KML altitude mode to use. 171 : char *pszAltitudeMode_ = nullptr; 172 : 173 : char **papszCreateOptions_ = nullptr; 174 : 175 : // Output related parameters. 176 : VSILFILE *fpOutput_ = nullptr; 177 : 178 : OGREnvelope oEnvelope_{}; 179 : 180 : // Have we issued a coordinate transformation already for this datasource. 181 : bool bIssuedCTError_ = false; 182 : 183 : CPL_DISALLOW_COPY_ASSIGN(OGRKMLDataSource) 184 : }; 185 : 186 : #endif /* OGR_KML_H_INCLUDED */