iLand
layeredgrid.h
Go to the documentation of this file.
1/********************************************************************************************
2** iLand - an individual based forest landscape and disturbance model
3** http://iland-model.org
4** Copyright (C) 2009- Werner Rammer, Rupert Seidl
5**
6** This program is free software: you can redistribute it and/or modify
7** it under the terms of the GNU General Public License as published by
8** the Free Software Foundation, either version 3 of the License, or
9** (at your option) any later version.
10**
11** This program is distributed in the hope that it will be useful,
12** but WITHOUT ANY WARRANTY; without even the implied warranty of
13** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14** GNU General Public License for more details.
15**
16** You should have received a copy of the GNU General Public License
17** along with this program. If not, see <http://www.gnu.org/licenses/>.
18********************************************************************************************/
19
20#ifndef LAYEREDGRID_H
21#define LAYEREDGRID_H
22
23#include "grid.h"
24
32{
33public:
34 // layer description element
36 public:
38 LayerElement(QString aname, QString adesc, GridViewType type): name(aname), description(adesc), view_type(type) {}
39 QString name;
40 QString description;
42 };
43 virtual ~LayeredGridBase() {}
44
45 // access to properties
46 virtual int sizeX() const=0;
47 virtual int sizeY() const=0;
48 virtual QRectF metricRect() const=0;
49 virtual QRectF cellRect(const QPoint &p) const=0;
50 virtual bool onClick(const QPointF &world_coord) const { Q_UNUSED(world_coord); return false; /*false: not handled*/ }
51 // available variables
53 virtual const QVector<LayeredGridBase::LayerElement> &names()=0;
55 virtual int indexOf(const QString &layer_name)
56 {
57 for(int i=0;i<names().count();++i)
58 if (names().at(i).name == layer_name)
59 return i;
60 return -1;
61 }
62 virtual QStringList layerNames() {
63 QStringList l;
64 for(int i=0;i<names().count();++i)
65 l.append(names().at(i).name);
66 return l;
67 }
68
69 // statistics
71 virtual void range(double &rMin, double &rMax, const int index) const=0;
72
73 // data access functions
74 virtual double value(const float x, const float y, const int index) const = 0;
75 virtual double value(const QPointF &world_coord, const int index) const = 0;
76 virtual double value(const int ix, const int iy, const int index) const = 0;
77 virtual double value(const int grid_index, const int index) const = 0;
78 // for classified values
79 virtual const QString labelvalue(const int value, const int index) const
80 {
81 Q_UNUSED(value)
82 Q_UNUSED(index)
83 return QLatin1Literal("-");
84 }
85
86};
87
93template <class T>
95{
96public:
97 LayeredGrid(const Grid<T>& grid) { mGrid = &grid; }
98 LayeredGrid() { mGrid = 0; }
99 bool isValid() const { return mGrid != 0; }
100 QRectF cellRect(const QPoint &p) const { return mGrid->cellRect(p); }
101 QRectF metricRect() const { return mGrid->metricRect(); }
102 float cellsize() const { return mGrid->cellsize(); }
103 int sizeX() const { return mGrid->sizeX(); }
104 int sizeY() const { return mGrid->sizeY();}
105
106 virtual double value(const T& data, const int index) const = 0;
107 double value(const T* ptr, const int index) const { return value(mGrid->constValueAtIndex(mGrid->indexOf(ptr)), index); }
108 double value(const int grid_index, const int index) const { return value(mGrid->constValueAtIndex(grid_index), index); }
109 double value(const float x, const float y, const int index) const { return value(mGrid->constValueAt(x,y), index); }
110 double value(const QPointF &world_coord, const int index) const { return mGrid->coordValid(world_coord)?value(mGrid->constValueAt(world_coord), index) : 0.; }
111 double value(const int ix, const int iy, const int index) const { return value(mGrid->constValueAtIndex(ix, iy), index); }
112 void range(double &rMin, double &rMax, const int index) const { rMin=9999999999.; rMax=-99999999999.;
113 for (int i=0;i<mGrid->count(); ++i) {
114 rMin=qMin(rMin, value(i, index));
115 rMax=qMax(rMax, value(i,index));}}
116
119 Grid<double> *copyGrid(const int index) const
120 {
121 Grid<double> *data_grid= new Grid<double>(mGrid->metricRect(), mGrid->cellsize());
122 double *p = data_grid->begin();
123 for (int i=0;i<mGrid->count();++i)
124 *p++ = value(i, index);
125 return data_grid;
126 }
127
128
129protected:
131};
132
133void modelToWorld(const Vector3D &From, Vector3D &To);
134
138template <class T>
139 QString gridToESRIRaster(const LayeredGrid<T> &grid, const QString name)
140{
141 int index = const_cast<LayeredGrid<T> &>(grid).indexOf(name);
142 if (index<0)
143 return QString();
144 Vector3D model(grid.metricRect().left(), grid.metricRect().top(), 0.);
145 Vector3D world;
146 modelToWorld(model, world);
147 QString result = QString("ncols %1\r\nnrows %2\r\nxllcorner %3\r\nyllcorner %4\r\ncellsize %5\r\nNODATA_value %6\r\n")
148 .arg(grid.sizeX())
149 .arg(grid.sizeY())
150 .arg(world.x(),0,'f').arg(world.y(),0,'f')
151 .arg(grid.cellsize()).arg(-9999);
152
153 QString res;
154 QTextStream ts(&res);
155 QChar sep = QChar(' ');
156 for (int y=grid.sizeY()-1;y>=0;--y){
157 for (int x=0;x<grid.sizeX();x++){
158 ts << grid.value(x,y,index) << sep;
159 }
160 ts << "\r\n";
161 }
162
163 return result + res;
164}
165
166
167
168#endif // LAYEREDGRID_H
169
170
171
172
173
Grid class (template).
Definition: grid.h:44
T * begin() const
get "iterator" pointer
Definition: grid.h:150
Definition: layeredgrid.h:35
QString name
Definition: layeredgrid.h:39
GridViewType view_type
Definition: layeredgrid.h:41
LayerElement()
Definition: layeredgrid.h:37
LayerElement(QString aname, QString adesc, GridViewType type)
Definition: layeredgrid.h:38
QString description
Definition: layeredgrid.h:40
Definition: layeredgrid.h:32
virtual QStringList layerNames()
Definition: layeredgrid.h:62
virtual double value(const float x, const float y, const int index) const =0
virtual int sizeY() const =0
virtual const QString labelvalue(const int value, const int index) const
Definition: layeredgrid.h:79
virtual bool onClick(const QPointF &world_coord) const
Definition: layeredgrid.h:50
virtual void range(double &rMin, double &rMax, const int index) const =0
retrieve min and max of variable 'index'
virtual double value(const QPointF &world_coord, const int index) const =0
virtual QRectF cellRect(const QPoint &p) const =0
virtual int sizeX() const =0
virtual double value(const int ix, const int iy, const int index) const =0
virtual QRectF metricRect() const =0
virtual double value(const int grid_index, const int index) const =0
virtual int indexOf(const QString &layer_name)
get layer index by name of the layer. returns -1 if layer is not available.
Definition: layeredgrid.h:55
virtual const QVector< LayeredGridBase::LayerElement > & names()=0
list of stored layers
virtual ~LayeredGridBase()
Definition: layeredgrid.h:43
This is the base class for multi-layer grids in iLand.
Definition: layeredgrid.h:95
float cellsize() const
Definition: layeredgrid.h:102
double value(const int ix, const int iy, const int index) const
Definition: layeredgrid.h:111
int sizeX() const
Definition: layeredgrid.h:103
Grid< double > * copyGrid(const int index) const
extract a (newly created) grid filled with the value of the variable given by 'index' caller need to ...
Definition: layeredgrid.h:119
void range(double &rMin, double &rMax, const int index) const
retrieve min and max of variable 'index'
Definition: layeredgrid.h:112
bool isValid() const
Definition: layeredgrid.h:99
double value(const int grid_index, const int index) const
Definition: layeredgrid.h:108
int sizeY() const
Definition: layeredgrid.h:104
LayeredGrid(const Grid< T > &grid)
Definition: layeredgrid.h:97
const Grid< T > * mGrid
Definition: layeredgrid.h:130
LayeredGrid()
Definition: layeredgrid.h:98
double value(const QPointF &world_coord, const int index) const
Definition: layeredgrid.h:110
double value(const T *ptr, const int index) const
Definition: layeredgrid.h:107
double value(const float x, const float y, const int index) const
Definition: layeredgrid.h:109
QRectF metricRect() const
Definition: layeredgrid.h:101
QRectF cellRect(const QPoint &p) const
Definition: layeredgrid.h:100
virtual double value(const T &data, const int index) const =0
simple 3d vector.
Definition: grid.h:249
double y() const
get y-coordinate
Definition: grid.h:254
double x() const
get x-coordinate
Definition: grid.h:253
GridViewType
Definition: grid.h:193
void modelToWorld(const Vector3D &From, Vector3D &To)
Definition: gisgrid.cpp:54
QString gridToESRIRaster(const LayeredGrid< T > &grid, const QString name)
translate
Definition: layeredgrid.h:139