Line data Source code
1 : /******************************************************************************
2 : *
3 : * Project: SXF Translator
4 : * Purpose: Include file defining classes for OGR SXF driver, datasource and
5 : *layers. Author: Ben Ahmed Daho Ali, bidandou(at)yahoo(dot)fr Dmitry
6 : *Baryshnikov, polimax@mail.ru Alexandr Lisovenko, alexander.lisovenko@gmail.com
7 : *
8 : ******************************************************************************
9 : * Copyright (c) 2011, Ben Ahmed Daho Ali
10 : * Copyright (c) 2013, NextGIS
11 : *
12 : * SPDX-License-Identifier: MIT
13 : ****************************************************************************/
14 :
15 : #ifndef OGR_SXF_H_INCLUDED
16 : #define OGR_SXF_H_INCLUDED
17 :
18 : #include <set>
19 : #include <vector>
20 : #include <map>
21 :
22 : #include "ogrsf_frmts.h"
23 : #include "org_sxf_defs.h"
24 :
25 : #define CHECK_BIT(var, pos) (((var) & (1 << (pos))) != 0)
26 : constexpr double TO_DEGREES = 180.0 / M_PI;
27 : constexpr double TO_RADIANS = M_PI / 180.0;
28 :
29 : /************************************************************************/
30 : /* OGRSXFLayer */
31 : /************************************************************************/
32 : class OGRSXFLayer final : public OGRLayer
33 : {
34 : protected:
35 : OGRFeatureDefn *poFeatureDefn;
36 : VSILFILE *fpSXF;
37 : GByte nLayerID;
38 : std::map<unsigned, CPLString> mnClassificators;
39 : std::map<long, vsi_l_offset> mnRecordDesc;
40 : std::map<long, vsi_l_offset>::const_iterator oNextIt;
41 : SXFMapDescription stSXFMapDescription;
42 : std::set<GUInt16> snAttributeCodes;
43 : int m_nSXFFormatVer;
44 : CPLString sFIDColumn_;
45 : CPLMutex **m_hIOMutex;
46 : double m_dfCoeff;
47 : virtual OGRFeature *GetNextRawFeature(long nFID);
48 :
49 : GUInt32 TranslateXYH(const SXFRecordDescription &certifInfo,
50 : const char *psBuff, GUInt32 nBufLen, double *dfX,
51 : double *dfY, double *dfH = nullptr);
52 :
53 : OGRFeature *TranslatePoint(const SXFRecordDescription &certifInfo,
54 : const char *psRecordBuf, GUInt32 nBufLen);
55 : OGRFeature *TranslateText(const SXFRecordDescription &certifInfo,
56 : const char *psBuff, GUInt32 nBufLen);
57 : OGRFeature *TranslatePolygon(const SXFRecordDescription &certifInfo,
58 : const char *psBuff, GUInt32 nBufLen);
59 : OGRFeature *TranslateLine(const SXFRecordDescription &certifInfo,
60 : const char *psBuff, GUInt32 nBufLen);
61 : OGRFeature *TranslateVetorAngle(const SXFRecordDescription &certifInfo,
62 : const char *psBuff, GUInt32 nBufLen);
63 :
64 : public:
65 : OGRSXFLayer(VSILFILE *fp, CPLMutex **hIOMutex, GByte nID,
66 : const char *pszLayerName, int nVer,
67 : const SXFMapDescription &sxfMapDesc);
68 : virtual ~OGRSXFLayer();
69 :
70 : virtual void ResetReading() override;
71 : virtual OGRFeature *GetNextFeature() override;
72 : virtual OGRErr SetNextByIndex(GIntBig nIndex) override;
73 : virtual OGRFeature *GetFeature(GIntBig nFID) override;
74 :
75 8220 : virtual OGRFeatureDefn *GetLayerDefn() override
76 : {
77 8220 : return poFeatureDefn;
78 : }
79 :
80 : virtual int TestCapability(const char *) override;
81 :
82 : virtual GIntBig GetFeatureCount(int bForce = TRUE) override;
83 : virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce = TRUE) override;
84 :
85 36 : virtual OGRErr GetExtent(int iGeomField, OGREnvelope *psExtent,
86 : int bForce) override
87 : {
88 36 : return OGRLayer::GetExtent(iGeomField, psExtent, bForce);
89 : }
90 :
91 : virtual OGRSpatialReference *GetSpatialRef() override;
92 : virtual const char *GetFIDColumn() override;
93 :
94 18820 : virtual GByte GetId() const
95 : {
96 18820 : return nLayerID;
97 : }
98 :
99 : virtual void AddClassifyCode(unsigned nClassCode,
100 : const char *szName = nullptr);
101 : virtual bool AddRecord(long nFID, unsigned nClassCode, vsi_l_offset nOffset,
102 : bool bHasSemantic, size_t nSemanticsSize);
103 :
104 : private:
105 : static int CanRecode(const char *pszEncoding);
106 : };
107 :
108 : /************************************************************************/
109 : /* OGRSXFDataSource */
110 : /************************************************************************/
111 :
112 : class OGRSXFDataSource final : public GDALDataset
113 : {
114 : SXFPassport oSXFPassport;
115 :
116 : std::vector<std::unique_ptr<OGRSXFLayer>> m_apoLayers{};
117 :
118 : VSILFILE *fpSXF = nullptr;
119 : CPLMutex *hIOMutex = nullptr;
120 : void FillLayers();
121 : void CreateLayers();
122 : void CreateLayers(VSILFILE *fpRSC, const char *const *papszOpenOpts);
123 : static OGRErr ReadSXFInformationFlags(VSILFILE *fpSXF,
124 : SXFPassport &passport);
125 : OGRErr ReadSXFDescription(VSILFILE *fpSXF, SXFPassport &passport);
126 : static void SetVertCS(const long iVCS, SXFPassport &passport,
127 : const char *const *papszOpenOpts);
128 : static OGRErr ReadSXFMapDescription(VSILFILE *fpSXF, SXFPassport &passport,
129 : const char *const *papszOpenOpts);
130 : OGRSXFLayer *GetLayerById(GByte);
131 :
132 : public:
133 : OGRSXFDataSource();
134 : virtual ~OGRSXFDataSource();
135 :
136 : int Open(const char *pszFilename, bool bUpdate,
137 : const char *const *papszOpenOpts = nullptr);
138 :
139 1878 : virtual int GetLayerCount() override
140 : {
141 1878 : return static_cast<int>(m_apoLayers.size());
142 : }
143 :
144 : virtual OGRLayer *GetLayer(int) override;
145 :
146 : virtual int TestCapability(const char *) override;
147 : void CloseFile();
148 : };
149 :
150 : #endif
|