Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: Interlis 1 Translator 4 : * Purpose: Definition of classes for OGR Interlis 1 driver. 5 : * Author: Pirmin Kalberer, Sourcepole AG 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2004, Pirmin Kalberer, Sourcepole AG 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #ifndef OGR_ILI1_H_INCLUDED 14 : #define OGR_ILI1_H_INCLUDED 15 : 16 : #include "ogrsf_frmts.h" 17 : #include "ili1reader.h" 18 : 19 : class OGRILI1DataSource; 20 : 21 : /************************************************************************/ 22 : /* OGRILI1Layer */ 23 : /************************************************************************/ 24 : 25 : class OGRILI1Layer final : public OGRLayer 26 : { 27 : private: 28 : #if 0 29 : OGRSpatialReference *poSRS; 30 : #endif 31 : OGRFeatureDefn *poFeatureDefn; 32 : GeomFieldInfos oGeomFieldInfos; 33 : 34 : int nFeatures; 35 : OGRFeature **papoFeatures; 36 : int nFeatureIdx; 37 : 38 : bool bGeomsJoined; 39 : 40 : OGRILI1DataSource *poDS; 41 : 42 : public: 43 : OGRILI1Layer(OGRFeatureDefn *poFeatureDefn, 44 : const GeomFieldInfos &oGeomFieldInfos, 45 : OGRILI1DataSource *poDS); 46 : 47 : ~OGRILI1Layer(); 48 : 49 : OGRErr AddFeature(OGRFeature *poFeature); 50 : 51 : void ResetReading() override; 52 : OGRFeature *GetNextFeature() override; 53 : OGRFeature *GetNextFeatureRef(); 54 : OGRFeature *GetFeatureRef(GIntBig nFid); 55 : OGRFeature *GetFeatureRef(const char *); 56 : 57 : GIntBig GetFeatureCount(int bForce = TRUE) override; 58 : 59 : OGRErr ICreateFeature(OGRFeature *poFeature) override; 60 : int GeometryAppend(OGRGeometry *poGeometry); 61 : 62 1234 : OGRFeatureDefn *GetLayerDefn() override 63 : { 64 1234 : return poFeatureDefn; 65 : } 66 : 67 : GeomFieldInfos GetGeomFieldInfos() 68 : { 69 : return oGeomFieldInfos; 70 : } 71 : 72 : OGRErr CreateField(const OGRFieldDefn *poField, 73 : int bApproxOK = TRUE) override; 74 : 75 : int TestCapability(const char *) override; 76 : 77 : GDALDataset *GetDataset() override; 78 : 79 : private: 80 : void JoinGeomLayers(); 81 : void JoinSurfaceLayer(OGRILI1Layer *poSurfaceLineLayer, 82 : int nSurfaceFieldIndex); 83 : OGRMultiPolygon *Polygonize(OGRGeometryCollection *poLines, 84 : bool fix_crossing_lines = false); 85 : void PolygonizeAreaLayer(OGRILI1Layer *poAreaLineLayer, int nAreaFieldIndex, 86 : int nPointFieldIndex); 87 : }; 88 : 89 : /************************************************************************/ 90 : /* OGRILI1DataSource */ 91 : /************************************************************************/ 92 : 93 : class OGRILI1DataSource final : public GDALDataset 94 : { 95 : private: 96 : ImdReader *poImdReader; 97 : IILI1Reader *poReader; 98 : VSILFILE *fpTransfer; 99 : char *pszTopic; 100 : int nLayers; 101 : OGRILI1Layer **papoLayers; 102 : 103 : CPL_DISALLOW_COPY_ASSIGN(OGRILI1DataSource) 104 : 105 : public: 106 : OGRILI1DataSource(); 107 : virtual ~OGRILI1DataSource(); 108 : 109 : int Open(const char *, char **papszOpenOptions, int bTestOpen); 110 : int Create(const char *pszFile, char **papszOptions); 111 : 112 64 : int GetLayerCount() override 113 : { 114 64 : return poReader ? poReader->GetLayerCount() : 0; 115 : } 116 : 117 : OGRLayer *GetLayer(int) override; 118 : OGRILI1Layer *GetLayerByName(const char *) override; 119 : 120 745 : VSILFILE *GetTransferFile() 121 : { 122 745 : return fpTransfer; 123 : } 124 : 125 : OGRLayer *ICreateLayer(const char *pszName, 126 : const OGRGeomFieldDefn *poGeomFieldDefn, 127 : CSLConstList papszOptions) override; 128 : 129 : int TestCapability(const char *) override; 130 : }; 131 : 132 : #endif /* OGR_ILI1_H_INCLUDED */