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