QGIS/external/mdal/mdal_data_model.hpp

289 lines
8.7 KiB
C++
Raw Normal View History

/*
MDAL - Mesh Data Abstraction Library (MIT License)
Copyright (C) 2018 Peter Petrik (zilolv at gmail dot com)
*/
2018-12-04 17:28:05 +01:00
#ifndef MDAL_DATA_MODEL_HPP
#define MDAL_DATA_MODEL_HPP
#include <stddef.h>
#include <vector>
2018-05-16 11:20:25 +02:00
#include <memory>
#include <map>
2018-09-10 23:12:00 +02:00
#include <string>
#include <limits>
2018-12-04 17:28:05 +01:00
#include "mdal.h"
#include "mdal_datetime.hpp"
2018-07-18 09:00:34 +02:00
namespace MDAL
{
2018-07-18 09:00:34 +02:00
class DatasetGroup;
2018-12-04 17:28:05 +01:00
class Mesh;
2018-07-18 09:00:34 +02:00
struct BBox
{
BBox() {}
BBox( double lx, double ux, double ly, double uy ): minX( lx ), maxX( ux ), minY( ly ), maxY( uy ) {}
double minX;
double maxX;
double minY;
double maxY;
};
2018-05-16 11:20:25 +02:00
typedef struct
{
2018-12-04 17:28:05 +01:00
double minimum = std::numeric_limits<double>::quiet_NaN();
double maximum = std::numeric_limits<double>::quiet_NaN();
} Statistics;
2018-05-16 11:20:25 +02:00
2018-07-18 09:00:34 +02:00
typedef std::vector< std::pair< std::string, std::string > > Metadata;
typedef std::vector<std::pair<double, double>> Classification;
2018-07-18 09:00:34 +02:00
2018-05-16 11:20:25 +02:00
class Dataset
{
public:
2018-12-04 17:28:05 +01:00
Dataset( DatasetGroup *parent );
virtual ~Dataset();
size_t valuesCount() const;
//! For DataOnVertices or DataOnFaces
2018-12-04 17:28:05 +01:00
virtual size_t scalarData( size_t indexStart, size_t count, double *buffer ) = 0;
//! For DataOnVertices or DataOnFaces
2018-12-04 17:28:05 +01:00
virtual size_t vectorData( size_t indexStart, size_t count, double *buffer ) = 0;
//! For drivers that supports it, see supportsActiveFlag()
virtual size_t activeData( size_t indexStart, size_t count, int *buffer );
2018-05-16 11:20:25 +02:00
//! For DataOnVolumes
virtual size_t verticalLevelCountData( size_t indexStart, size_t count, int *buffer ) = 0;
//! For DataOnVolumes
virtual size_t verticalLevelData( size_t indexStart, size_t count, double *buffer ) = 0;
//! For DataOnVolumes
virtual size_t faceToVolumeData( 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 vectorVolumesData( size_t indexStart, size_t count, double *buffer ) = 0;
virtual size_t volumesCount() const = 0;
virtual size_t maximumVerticalLevelsCount() const = 0;
2018-12-04 17:28:05 +01:00
Statistics statistics() const;
void setStatistics( const Statistics &statistics );
2018-05-16 11:20:25 +02:00
2018-12-04 17:28:05 +01:00
bool isValid() const;
2018-05-16 11:20:25 +02:00
2018-12-04 17:28:05 +01:00
DatasetGroup *group() const;
Mesh *mesh() const;
double time( RelativeTimestamp::Unit unit ) const;
RelativeTimestamp timestamp() const;
void setTime( double time, RelativeTimestamp::Unit unit = RelativeTimestamp::hours );
void setTime( const RelativeTimestamp &time );
2018-12-04 17:28:05 +01:00
bool supportsActiveFlag() const;
void setSupportsActiveFlag( bool value );
2018-12-04 17:28:05 +01:00
private:
RelativeTimestamp mTime;
2018-12-04 17:28:05 +01:00
bool mIsValid = true;
bool mSupportsActiveFlag = false;
2018-12-04 17:28:05 +01:00
DatasetGroup *mParent = nullptr;
Statistics mStatistics;
2018-07-18 09:00:34 +02:00
};
2018-05-16 11:20:25 +02:00
class Dataset2D: public Dataset
{
public:
Dataset2D( DatasetGroup *parent );
virtual ~Dataset2D() override;
size_t verticalLevelCountData( size_t indexStart, size_t count, int *buffer ) override;
size_t verticalLevelData( size_t indexStart, size_t count, double *buffer ) override;
size_t faceToVolumeData( size_t indexStart, size_t count, int *buffer ) override;
size_t scalarVolumesData( size_t indexStart, size_t count, double *buffer ) override;
size_t vectorVolumesData( size_t indexStart, size_t count, double *buffer ) override;
size_t volumesCount() const override;
size_t maximumVerticalLevelsCount() const override;
};
class Dataset3D: public Dataset
{
public:
Dataset3D(
DatasetGroup *parent,
size_t volumes,
size_t maxVerticalLevelCount
);
virtual ~Dataset3D() override;
virtual size_t scalarData( size_t indexStart, size_t count, double *buffer ) override;
virtual size_t vectorData( size_t indexStart, size_t count, double *buffer ) override;
size_t volumesCount() const override;
size_t maximumVerticalLevelsCount() const override;
private:
size_t mVolumesCount = 0;
size_t mMaximumVerticalLevelsCount = 0;
};
2018-07-18 09:00:34 +02:00
typedef std::vector<std::shared_ptr<Dataset>> Datasets;
2018-05-16 11:20:25 +02:00
2018-07-18 09:00:34 +02:00
class DatasetGroup
{
public:
DatasetGroup( const std::string &driverName,
Mesh *parent,
const std::string &uri
);
2018-12-04 17:28:05 +01:00
DatasetGroup( const std::string &driverName,
Mesh *parent,
2018-12-04 17:28:05 +01:00
const std::string &uri,
const std::string &name );
2018-07-18 09:00:34 +02:00
~DatasetGroup();
std::string driverName() const;
2018-12-04 17:28:05 +01:00
std::string getMetadata( const std::string &key );
2018-07-18 09:00:34 +02:00
void setMetadata( const std::string &key, const std::string &val );
void setMetadata( const Metadata &metadata );
2018-07-18 09:00:34 +02:00
std::string name();
void setName( const std::string &name );
Metadata metadata;
Datasets datasets;
2018-12-04 17:28:05 +01:00
bool isScalar() const;
void setIsScalar( bool isScalar );
MDAL_DataLocation dataLocation() const;
void setDataLocation( MDAL_DataLocation dataLocation );
2018-12-04 17:28:05 +01:00
std::string uri() const;
void replaceUri( std::string uri );
2018-12-04 17:28:05 +01:00
Statistics statistics() const;
void setStatistics( const Statistics &statistics );
DateTime referenceTime() const;
void setReferenceTime( const DateTime &referenceTime );
2019-10-14 09:19:14 +02:00
2018-12-04 17:28:05 +01:00
Mesh *mesh() const;
size_t maximumVerticalLevelsCount() const;
bool isInEditMode() const;
void startEditing();
void stopEditing();
//! First value is the angle for full rotation and second value is the start angle
void setReferenceAngles( const std::pair<double, double> &referenceAngle );
std::pair<double, double> referenceAngles() const;
bool isPolar() const;
void setIsPolar( bool isPolar );
2018-12-04 17:28:05 +01:00
private:
bool mInEditMode = false;
const std::string mDriverName;
2018-12-04 17:28:05 +01:00
Mesh *mParent = nullptr;
bool mIsScalar = true;
bool mIsPolar = false;
std::pair<double, double> mReferenceAngles = {-360, 0}; //default full rotation is negative to be consistent with usual geographical clockwise
MDAL_DataLocation mDataLocation = MDAL_DataLocation::DataOnVertices;
2018-12-04 17:28:05 +01:00
std::string mUri; // file/uri from where it came
Statistics mStatistics;
DateTime mReferenceTime;
2018-05-16 11:20:25 +02:00
};
2018-07-18 09:00:34 +02:00
typedef std::vector<std::shared_ptr<DatasetGroup>> DatasetGroups;
2018-12-04 17:28:05 +01:00
class MeshVertexIterator
{
2018-12-04 17:28:05 +01:00
public:
virtual ~MeshVertexIterator();
2018-12-04 17:28:05 +01:00
virtual size_t next( size_t vertexCount, double *coordinates ) = 0;
};
class MeshEdgeIterator
{
public:
virtual ~MeshEdgeIterator();
virtual size_t next( size_t edgeCount,
int *startVertexIndices,
int *endVertexIndices ) = 0;
};
2018-12-04 17:28:05 +01:00
class MeshFaceIterator
{
public:
virtual ~MeshFaceIterator();
2018-08-29 12:10:03 +02:00
2018-12-04 17:28:05 +01:00
virtual size_t next( size_t faceOffsetsBufferLen,
int *faceOffsetsBuffer,
size_t vertexIndicesBufferLen,
int *vertexIndicesBuffer ) = 0;
2018-05-16 11:20:25 +02:00
};
2018-12-04 17:28:05 +01:00
class Mesh
{
public:
Mesh( const std::string &driverName,
2018-12-04 17:28:05 +01:00
size_t faceVerticesMaximumCount,
const std::string &uri );
2018-12-04 17:28:05 +01:00
virtual ~Mesh();
std::string driverName() const;
2018-12-04 17:28:05 +01:00
void setSourceCrs( const std::string &str );
void setSourceCrsFromWKT( const std::string &wkt );
void setSourceCrsFromEPSG( int code );
void setSourceCrsFromPrjFile( const std::string &filename );
2018-12-04 17:28:05 +01:00
virtual std::unique_ptr<MDAL::MeshVertexIterator> readVertices() = 0;
virtual std::unique_ptr<MDAL::MeshEdgeIterator> readEdges() = 0;
2018-12-04 17:28:05 +01:00
virtual std::unique_ptr<MDAL::MeshFaceIterator> readFaces() = 0;
DatasetGroups datasetGroups;
2019-05-03 10:33:13 +02:00
//! Find a dataset group by name
std::shared_ptr<DatasetGroup> group( const std::string &name );
virtual size_t verticesCount() const = 0;
virtual size_t edgesCount() const = 0;
virtual size_t facesCount() const = 0;
virtual BBox extent() const = 0;
2018-12-04 17:28:05 +01:00
std::string uri() const;
std::string crs() const;
size_t faceVerticesMaximumCount() const;
2020-08-25 08:59:11 +02:00
virtual void closeSource() {};
virtual bool isEditable() const {return false;}
virtual void addVertices( size_t vertexCount, double *coordinates );
virtual void addFaces( size_t faceCount, size_t driverMaxVerticesPerFace, int *faceSizes, int *vertexIndices );
protected:
void setFaceVerticesMaximumCount( const size_t &faceVerticesMaximumCount );
2018-12-04 17:28:05 +01:00
private:
const std::string mDriverName;
2018-12-04 17:28:05 +01:00
size_t mFaceVerticesMaximumCount = 0; //typically 3 or 4, sometimes up to 9
const std::string mUri; // file/uri from where it came
std::string mCrs;
};
} // namespace MDAL
2018-12-04 17:28:05 +01:00
#endif //MDAL_DATA_MODEL_HPP