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 : bool m_bEOF = false;
48 : OGRFeature *GetNextRawFeature(long nFID);
49 :
50 : GUInt32 TranslateXYH(const SXFRecordDescription &certifInfo,
51 : const char *psBuff, GUInt32 nBufLen, double *dfX,
52 : double *dfY, double *dfH = nullptr);
53 :
54 : OGRFeature *TranslatePoint(const SXFRecordDescription &certifInfo,
55 : const char *psRecordBuf, GUInt32 nBufLen);
56 : OGRFeature *TranslateText(const SXFRecordDescription &certifInfo,
57 : const char *psBuff, GUInt32 nBufLen);
58 : OGRFeature *TranslatePolygon(const SXFRecordDescription &certifInfo,
59 : const char *psBuff, GUInt32 nBufLen);
60 : OGRFeature *TranslateLine(const SXFRecordDescription &certifInfo,
61 : const char *psBuff, GUInt32 nBufLen);
62 : OGRFeature *TranslateVetorAngle(const SXFRecordDescription &certifInfo,
63 : const char *psBuff, GUInt32 nBufLen);
64 :
65 : CPL_DISALLOW_COPY_ASSIGN(OGRSXFLayer)
66 :
67 : public:
68 : OGRSXFLayer(VSILFILE *fp, CPLMutex **hIOMutex, GByte nID,
69 : const char *pszLayerName, int nVer,
70 : const SXFMapDescription &sxfMapDesc);
71 : ~OGRSXFLayer() override;
72 :
73 : void ResetReading() override;
74 : OGRFeature *GetNextFeature() override;
75 : OGRErr SetNextByIndex(GIntBig nIndex) override;
76 : OGRFeature *GetFeature(GIntBig nFID) override;
77 :
78 8148 : const OGRFeatureDefn *GetLayerDefn() const override
79 : {
80 8148 : return poFeatureDefn;
81 : }
82 :
83 : int TestCapability(const char *) const override;
84 :
85 : GIntBig GetFeatureCount(int bForce = TRUE) override;
86 : OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent,
87 : bool bForce) override;
88 :
89 : const OGRSpatialReference *GetSpatialRef() const override;
90 : const char *GetFIDColumn() const override;
91 :
92 18820 : GByte GetId() const
93 : {
94 18820 : return nLayerID;
95 : }
96 :
97 : void AddClassifyCode(unsigned nClassCode, const char *szName = nullptr);
98 : bool AddRecord(long nFID, unsigned nClassCode, vsi_l_offset nOffset,
99 : bool bHasSemantic, size_t nSemanticsSize);
100 :
101 : private:
102 : static int CanRecode(const char *pszEncoding);
103 : };
104 :
105 : /************************************************************************/
106 : /* OGRSXFDataSource */
107 : /************************************************************************/
108 :
109 : class OGRSXFDataSource final : public GDALDataset
110 : {
111 : SXFPassport oSXFPassport{};
112 :
113 : std::vector<std::unique_ptr<OGRSXFLayer>> m_apoLayers{};
114 :
115 : VSILFILE *fpSXF = nullptr;
116 : CPLMutex *hIOMutex = nullptr;
117 : void FillLayers();
118 : void CreateLayers();
119 : void CreateLayers(VSILFILE *fpRSC, const char *const *papszOpenOpts);
120 : static OGRErr ReadSXFInformationFlags(VSILFILE *fpSXF,
121 : SXFPassport &passport);
122 : OGRErr ReadSXFDescription(VSILFILE *fpSXF, SXFPassport &passport);
123 : static void SetVertCS(const long iVCS, SXFPassport &passport,
124 : const char *const *papszOpenOpts);
125 : static OGRErr ReadSXFMapDescription(VSILFILE *fpSXF, SXFPassport &passport,
126 : const char *const *papszOpenOpts);
127 : OGRSXFLayer *GetLayerById(GByte);
128 :
129 : CPL_DISALLOW_COPY_ASSIGN(OGRSXFDataSource)
130 :
131 : public:
132 : OGRSXFDataSource();
133 : ~OGRSXFDataSource() override;
134 :
135 : int Open(const char *pszFilename, bool bUpdate,
136 : const char *const *papszOpenOpts = nullptr);
137 :
138 1878 : int GetLayerCount() const override
139 : {
140 1878 : return static_cast<int>(m_apoLayers.size());
141 : }
142 :
143 : const OGRLayer *GetLayer(int) const override;
144 :
145 : int TestCapability(const char *) const override;
146 : void CloseFile();
147 : };
148 :
149 : #endif
|