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(); 37 : 38 : // 39 : // OGRLayer Interface 40 : // 41 : OGRFeatureDefn *GetLayerDefn() override; 42 : OGRErr ICreateFeature(OGRFeature *poFeature) override; 43 : OGRErr CreateField(const OGRFieldDefn *poField, 44 : int bApproxOK = TRUE) override; 45 : void ResetReading() override; 46 : OGRFeature *GetNextFeature() override; 47 : GIntBig GetFeatureCount(int bForce = TRUE) override; 48 : int TestCapability(const char *pszCap) override; 49 : 50 : GDALDataset *GetDataset() override; 51 : 52 : // 53 : // OGRKMLLayer Interface 54 : // 55 : void SetLayerNumber(int nLayer); 56 : 57 19 : void SetClosedForWriting() 58 : { 59 19 : bClosedForWriting = true; 60 19 : } 61 : 62 : CPLString WriteSchema(); 63 : 64 : private: 65 : friend class OGRKMLDataSource; 66 : 67 : OGRKMLDataSource *poDS_ = nullptr; 68 : OGRSpatialReference *poSRS_ = nullptr; 69 : OGRCoordinateTransformation *poCT_ = nullptr; 70 : 71 : OGRFeatureDefn *poFeatureDefn_ = nullptr; 72 : 73 : int iNextKMLId_ = 0; 74 : bool bWriter_ = false; 75 : int nLayerNumber_ = 0; 76 : GIntBig nWroteFeatureCount_ = 0; 77 : bool bSchemaWritten_ = false; 78 : bool bClosedForWriting = false; 79 : char *pszName_ = nullptr; 80 : 81 : int nLastAsked = -1; 82 : int nLastCount = -1; 83 : 84 : CPL_DISALLOW_COPY_ASSIGN(OGRKMLLayer) 85 : }; 86 : 87 : /************************************************************************/ 88 : /* OGRKMLDataSource */ 89 : /************************************************************************/ 90 : 91 67 : class OGRKMLDataSource final : public GDALDataset 92 : { 93 : public: 94 : OGRKMLDataSource(); 95 : ~OGRKMLDataSource(); 96 : 97 : int Open(const char *pszName, int bTestOpen); 98 : 99 1243 : int GetLayerCount() override 100 : { 101 1243 : return nLayers_; 102 : } 103 : 104 : OGRLayer *GetLayer(int nLayer) override; 105 : OGRLayer *ICreateLayer(const char *pszName, 106 : const OGRGeomFieldDefn *poGeomFieldDefn, 107 : CSLConstList papszOptions) override; 108 : int TestCapability(const char *pszCap) override; 109 : 110 : // 111 : // OGRKMLDataSource Interface 112 : // 113 : int Create(const char *pszName, char **papszOptions); 114 : 115 1581 : const char *GetNameField() const 116 : { 117 1581 : return pszNameField_; 118 : } 119 : 120 1497 : const char *GetDescriptionField() const 121 : { 122 1497 : return pszDescriptionField_; 123 : } 124 : 125 90 : const char *GetAltitudeMode() 126 : { 127 90 : return pszAltitudeMode_; 128 : } 129 : 130 128 : VSILFILE *GetOutputFP() 131 : { 132 128 : return fpOutput_; 133 : } 134 : 135 : void GrowExtents(OGREnvelope *psGeomBounds); 136 : #ifdef HAVE_EXPAT 137 810 : KML *GetKMLFile() 138 : { 139 810 : return poKMLFile_; 140 : } 141 : #endif 142 : 143 0 : bool IsFirstCTError() const 144 : { 145 0 : return !bIssuedCTError_; 146 : } 147 : 148 0 : void IssuedFirstCTError() 149 : { 150 0 : bIssuedCTError_ = true; 151 0 : } 152 : 153 : private: 154 : #ifdef HAVE_EXPAT 155 : KML *poKMLFile_ = nullptr; 156 : #endif 157 : 158 : OGRKMLLayer **papoLayers_ = nullptr; 159 : int nLayers_ = 0; 160 : 161 : // The name of the field to use for the KML name element. 162 : char *pszNameField_ = nullptr; 163 : char *pszDescriptionField_ = nullptr; 164 : 165 : // The KML altitude mode to use. 166 : char *pszAltitudeMode_ = nullptr; 167 : 168 : char **papszCreateOptions_ = nullptr; 169 : 170 : // Output related parameters. 171 : VSILFILE *fpOutput_ = nullptr; 172 : 173 : OGREnvelope oEnvelope_{}; 174 : 175 : // Have we issued a coordinate transformation already for this datasource. 176 : bool bIssuedCTError_ = false; 177 : 178 : CPL_DISALLOW_COPY_ASSIGN(OGRKMLDataSource) 179 : }; 180 : 181 : #endif /* OGR_KML_H_INCLUDED */