MDAL
mdal_data_model.hpp
1 /*
2  MDAL - Mesh Data Abstraction Library (MIT License)
3  Copyright (C) 2018 Peter Petrik (zilolv at gmail dot com)
4 */
5 
6 #ifndef MDAL_DATA_MODEL_HPP
7 #define MDAL_DATA_MODEL_HPP
8 
9 #include <stddef.h>
10 #include <vector>
11 #include <memory>
12 #include <map>
13 #include <string>
14 #include <limits>
15 #include "mdal.h"
16 #include "mdal_datetime.hpp"
17 
18 namespace MDAL
19 {
20  class DatasetGroup;
21  class Mesh;
22 
23  struct BBox
24  {
25  BBox() {}
26  BBox( double lx, double ux, double ly, double uy ): minX( lx ), maxX( ux ), minY( ly ), maxY( uy ) {}
27 
28  double minX = std::numeric_limits<double>::max();
29  double maxX = -std::numeric_limits<double>::max();
30  double minY = std::numeric_limits<double>::max();
31  double maxY = -std::numeric_limits<double>::max();
32  };
33 
34  typedef struct StatisticsType
35  {
36  double minimum = std::numeric_limits<double>::quiet_NaN();
37  double maximum = std::numeric_limits<double>::quiet_NaN();
38  } Statistics;
39 
40  typedef std::vector< std::pair< std::string, std::string > > Metadata;
41  typedef std::vector<std::pair<double, double>> Classification;
42 
43  class Dataset
44  {
45  public:
46  Dataset( DatasetGroup *parent );
47  virtual ~Dataset();
48 
49  size_t valuesCount() const;
50 
52  virtual size_t scalarData( size_t indexStart, size_t count, double *buffer ) = 0;
54  virtual size_t vectorData( size_t indexStart, size_t count, double *buffer ) = 0;
56  virtual size_t activeData( size_t indexStart, size_t count, int *buffer );
57 
59  virtual size_t verticalLevelCountData( size_t indexStart, size_t count, int *buffer ) = 0;
61  virtual size_t verticalLevelData( size_t indexStart, size_t count, double *buffer ) = 0;
63  virtual size_t faceToVolumeData( size_t indexStart, size_t count, int *buffer ) = 0;
65  virtual size_t scalarVolumesData( size_t indexStart, size_t count, double *buffer ) = 0;
67  virtual size_t vectorVolumesData( size_t indexStart, size_t count, double *buffer ) = 0;
68 
69  virtual size_t volumesCount() const = 0;
70  virtual size_t maximumVerticalLevelsCount() const = 0;
71 
72  Statistics statistics() const;
73  void setStatistics( const Statistics &statistics );
74 
75  bool isValid() const;
76 
77  DatasetGroup *group() const;
78  Mesh *mesh() const;
79 
80  double time( RelativeTimestamp::Unit unit ) const;
81  RelativeTimestamp timestamp() const;
82  void setTime( double time, RelativeTimestamp::Unit unit = RelativeTimestamp::hours );
83  void setTime( const RelativeTimestamp &time );
84 
85  bool supportsActiveFlag() const;
86  void setSupportsActiveFlag( bool value );
87 
88  private:
89  RelativeTimestamp mTime;
90  bool mIsValid = true;
91  bool mSupportsActiveFlag = false;
92  DatasetGroup *mParent = nullptr;
93  Statistics mStatistics;
94  };
95 
96  class Dataset2D: public Dataset
97  {
98  public:
99  Dataset2D( DatasetGroup *parent );
100  virtual ~Dataset2D() override;
101 
102  size_t verticalLevelCountData( size_t indexStart, size_t count, int *buffer ) override;
103  size_t verticalLevelData( size_t indexStart, size_t count, double *buffer ) override;
104  size_t faceToVolumeData( size_t indexStart, size_t count, int *buffer ) override;
105  size_t scalarVolumesData( size_t indexStart, size_t count, double *buffer ) override;
106  size_t vectorVolumesData( size_t indexStart, size_t count, double *buffer ) override;
107 
108  size_t volumesCount() const override;
109  size_t maximumVerticalLevelsCount() const override;
110  };
111 
112  class Dataset3D: public Dataset
113  {
114  public:
115  Dataset3D(
116  DatasetGroup *parent,
117  size_t volumes,
118  size_t maxVerticalLevelCount
119  );
120  virtual ~Dataset3D() override;
121 
122  virtual size_t scalarData( size_t indexStart, size_t count, double *buffer ) override;
123  virtual size_t vectorData( size_t indexStart, size_t count, double *buffer ) override;
124 
125  size_t volumesCount() const override;
126  size_t maximumVerticalLevelsCount() const override;
127 
128  private:
129  size_t mVolumesCount = 0;
130  size_t mMaximumVerticalLevelsCount = 0;
131  };
132 
133 
134  typedef std::vector<std::shared_ptr<Dataset>> Datasets;
135 
137  {
138  public:
139  DatasetGroup( const std::string &driverName,
140  Mesh *parent,
141  const std::string &uri
142  );
143 
144  DatasetGroup( const std::string &driverName,
145  Mesh *parent,
146  const std::string &uri,
147  const std::string &name );
148 
149  ~DatasetGroup();
150 
151  std::string driverName() const;
152 
153  std::string getMetadata( const std::string &key );
154  void setMetadata( const std::string &key, const std::string &val );
155  void setMetadata( const Metadata &new_metadata );
156 
157  std::string name();
158  void setName( const std::string &name );
159 
160  Metadata metadata;
161  Datasets datasets;
162 
163  bool isScalar() const;
164  void setIsScalar( bool isScalar );
165 
166  MDAL_DataLocation dataLocation() const;
167  void setDataLocation( MDAL_DataLocation dataLocation );
168 
169  std::string uri() const;
170  void replaceUri( std::string uri );
171 
172  Statistics statistics() const;
173  void setStatistics( const Statistics &statistics );
174 
175  DateTime referenceTime() const;
176  void setReferenceTime( const DateTime &referenceTime );
177 
178  Mesh *mesh() const;
179 
180  size_t maximumVerticalLevelsCount() const;
181 
182  bool isInEditMode() const;
183  void startEditing();
184  void stopEditing();
185 
187  void setReferenceAngles( const std::pair<double, double> &referenceAngle );
188  std::pair<double, double> referenceAngles() const;
189 
190  bool isPolar() const;
191  void setIsPolar( bool isPolar );
192  private:
193  bool mInEditMode = false;
194 
195  const std::string mDriverName;
196  Mesh *mParent = nullptr;
197  bool mIsScalar = true;
198  bool mIsPolar = false;
199  std::pair<double, double> mReferenceAngles = { -360, 0}; //default full rotation is negative to be consistent with usual geographical clockwise
200  MDAL_DataLocation mDataLocation = MDAL_DataLocation::DataOnVertices;
201  std::string mUri; // file/uri from where it came
202  Statistics mStatistics;
203  DateTime mReferenceTime;
204  };
205 
206  typedef std::vector<std::shared_ptr<DatasetGroup>> DatasetGroups;
207 
209  {
210  public:
211  virtual ~MeshVertexIterator();
212 
213  virtual size_t next( size_t vertexCount, double *coordinates ) = 0;
214  };
215 
217  {
218  public:
219  virtual ~MeshEdgeIterator();
220 
221  virtual size_t next( size_t edgeCount,
222  int *startVertexIndices,
223  int *endVertexIndices ) = 0;
224  };
225 
227  {
228  public:
229  virtual ~MeshFaceIterator();
230 
231  virtual size_t next( size_t faceOffsetsBufferLen,
232  int *faceOffsetsBuffer,
233  size_t vertexIndicesBufferLen,
234  int *vertexIndicesBuffer ) = 0;
235  };
236 
237  class Mesh
238  {
239  public:
240  Mesh( const std::string &driverName,
241  size_t faceVerticesMaximumCount,
242  const std::string &uri );
243 
244  virtual ~Mesh();
245 
246  std::string driverName() const;
247 
248  void setSourceCrs( const std::string &str );
249  void setSourceCrsFromWKT( const std::string &wkt );
250  void setSourceCrsFromEPSG( int code );
251  void setSourceCrsFromPrjFile( const std::string &filename );
252 
253  virtual std::unique_ptr<MDAL::MeshVertexIterator> readVertices() = 0;
254  virtual std::unique_ptr<MDAL::MeshEdgeIterator> readEdges() = 0;
255  virtual std::unique_ptr<MDAL::MeshFaceIterator> readFaces() = 0;
256 
257  DatasetGroups datasetGroups;
258 
260  std::shared_ptr<DatasetGroup> group( const std::string &name );
261 
262  virtual size_t verticesCount() const = 0;
263  virtual size_t edgesCount() const = 0;
264  virtual size_t facesCount() const = 0;
265  virtual BBox extent() const = 0;
266  std::string uri() const;
267  std::string crs() const;
268  size_t faceVerticesMaximumCount() const;
269 
270  std::string getMetadata( const std::string &key );
271  void setMetadata( const std::string &key, const std::string &val );
272  void setMetadata( const Metadata &new_metadata );
273 
274  Metadata metadata;
275 
276  virtual void closeSource() {};
277 
278  virtual bool isEditable() const {return false;}
279 
280  virtual void addVertices( size_t vertexCount, double *coordinates );
281  virtual void addFaces( size_t faceCount, size_t driverMaxVerticesPerFace, int *faceSizes, int *vertexIndices );
282  virtual void addEdges( size_t edgeCount, int *startVertexIndices, int *endVertexIndices );
283 
284 
285  protected:
286  void setFaceVerticesMaximumCount( const size_t &faceVerticesMaximumCount );
287 
288  private:
289  const std::string mDriverName;
290  size_t mFaceVerticesMaximumCount = 0; //typically 3 or 4, sometimes up to 9
291  const std::string mUri; // file/uri from where it came
292  std::string mCrs;
293  };
294 } // namespace MDAL
295 #endif //MDAL_DATA_MODEL_HPP
296 
Definition: mdal_data_model.hpp:97
size_t vectorVolumesData(size_t indexStart, size_t count, double *buffer) override
For DataOnVolumes.
Definition: mdal_data_model.cpp:114
size_t scalarVolumesData(size_t indexStart, size_t count, double *buffer) override
For DataOnVolumes.
Definition: mdal_data_model.cpp:112
size_t faceToVolumeData(size_t indexStart, size_t count, int *buffer) override
For DataOnVolumes.
Definition: mdal_data_model.cpp:110
size_t verticalLevelCountData(size_t indexStart, size_t count, int *buffer) override
For DataOnVolumes.
Definition: mdal_data_model.cpp:106
size_t verticalLevelData(size_t indexStart, size_t count, double *buffer) override
For DataOnVolumes.
Definition: mdal_data_model.cpp:108
Definition: mdal_data_model.hpp:113
virtual size_t scalarData(size_t indexStart, size_t count, double *buffer) override
For DataOnVertices or DataOnFaces.
Definition: mdal_data_model.cpp:135
virtual size_t vectorData(size_t indexStart, size_t count, double *buffer) override
For DataOnVertices or DataOnFaces.
Definition: mdal_data_model.cpp:137
Definition: mdal_data_model.hpp:137
void setReferenceAngles(const std::pair< double, double > &referenceAngle)
First value is the angle for full rotation and second value is the start angle.
Definition: mdal_data_model.cpp:273
Definition: mdal_data_model.hpp:44
virtual size_t vectorVolumesData(size_t indexStart, size_t count, double *buffer)=0
For DataOnVolumes.
virtual size_t activeData(size_t indexStart, size_t count, int *buffer)
For drivers that supports it, see supportsActiveFlag()
Definition: mdal_data_model.cpp:34
virtual size_t faceToVolumeData(size_t indexStart, size_t count, int *buffer)=0
For DataOnVolumes.
virtual size_t scalarData(size_t indexStart, size_t count, double *buffer)=0
For DataOnVertices or DataOnFaces.
virtual size_t verticalLevelCountData(size_t indexStart, size_t count, int *buffer)=0
For DataOnVolumes.
virtual size_t scalarVolumesData(size_t indexStart, size_t count, double *buffer)=0
For DataOnVolumes.
virtual size_t vectorData(size_t indexStart, size_t count, double *buffer)=0
For DataOnVertices or DataOnFaces.
virtual size_t verticalLevelData(size_t indexStart, size_t count, double *buffer)=0
For DataOnVolumes.
Definition: mdal_datetime.hpp:48
Definition: mdal_data_model.hpp:217
Definition: mdal_data_model.hpp:227
Definition: mdal_data_model.hpp:209
Definition: mdal_data_model.hpp:238
std::shared_ptr< DatasetGroup > group(const std::string &name)
Find a dataset group by name.
Definition: mdal_data_model.cpp:335
Definition: mdal_datetime.hpp:18
Definition: mdal_data_model.hpp:24
Definition: mdal_data_model.hpp:35