OGS
GeoLib::Raster Class Referencefinal

Detailed Description

Class Raster is used for managing raster data.

A raster consists of the meta data like number of columns and rows, the lower left point, the size of a raster pixel and a value for invalid data pixels. Additional the object needs the raster data itself. The raster data will be copied from the constructor. The destructor will release the memory.

Definition at line 48 of file Raster.h.

#include <Raster.h>

Collaboration diagram for GeoLib::Raster:
[legend]

Public Member Functions

template<typename InputIterator >
 Raster (RasterHeader header, InputIterator begin, InputIterator end)
 Constructor for an object of class Raster. The raster data have to be handed over via input iterators. Deploying iterators has the advantage that the use of the class is independent from the input container.
 
 Raster (Raster const &)=default
 
 Raster (Raster &&)=default
 
Rasteroperator= (Raster const &)=default
 
Rasteroperator= (Raster &&)=default
 
 ~Raster ()=default
 
RasterHeader const & getHeader () const
 Returns the complete header information.
 
void refineRaster (std::size_t scaling)
 
std::vector< double >::const_iterator begin () const
 
std::vector< double >::const_iterator end () const
 
double const * data () const
 
double const & operator() (std::size_t const row, std::size_t const col) const
 
double & operator() (std::size_t const row, std::size_t const col)
 
double getValueAtPoint (const MathLib::Point3d &pnt) const
 
double interpolateValueAtPoint (const MathLib::Point3d &pnt) const
 
bool isPntOnRaster (MathLib::Point3d const &pnt) const
 
bool operator== (Raster const &) const =default
 

Private Member Functions

void setCellSize (double cell_size)
 
void setNoDataVal (double no_data_val)
 

Private Attributes

GeoLib::RasterHeader _header
 
std::vector< double > _raster_data
 

Constructor & Destructor Documentation

◆ Raster() [1/3]

template<typename InputIterator >
GeoLib::Raster::Raster ( RasterHeader header,
InputIterator begin,
InputIterator end )
inline

Constructor for an object of class Raster. The raster data have to be handed over via input iterators. Deploying iterators has the advantage that the use of the class is independent from the input container.

Parameters
headermeta-information about the raster (height, width, etc.)
begininput iterator pointing to the first element of the data
endinput iterator pointing to the last element of the data, end have to be reachable from begin

Definition at line 62 of file Raster.h.

63 : _header(std::move(header)),
65 {
66 unsigned long const number_of_input_values =
67 static_cast<unsigned long>(std::distance(begin, end));
68 if (number_of_input_values != _header.n_cols * _header.n_rows)
69 {
70 throw std::out_of_range(
71 "Number of raster data mismatch, need " +
72 std::to_string(_header.n_cols * _header.n_rows) +
73 " values, but got " + std::to_string(number_of_input_values));
74 }
75 std::copy(begin, end, _raster_data.begin());
76 }
GeoLib::RasterHeader _header
Definition Raster.h:150
std::vector< double > _raster_data
Definition Raster.h:151
std::vector< double >::const_iterator begin() const
Definition Raster.h:96
std::vector< double >::const_iterator end() const
Definition Raster.h:106
std::size_t n_cols
Definition Raster.h:29
std::size_t n_rows
Definition Raster.h:30

References _header, _raster_data, begin(), end(), GeoLib::RasterHeader::n_cols, and GeoLib::RasterHeader::n_rows.

◆ Raster() [2/3]

GeoLib::Raster::Raster ( Raster const & )
default

◆ Raster() [3/3]

GeoLib::Raster::Raster ( Raster && )
default

◆ ~Raster()

GeoLib::Raster::~Raster ( )
default

Member Function Documentation

◆ begin()

std::vector< double >::const_iterator GeoLib::Raster::begin ( ) const
inline

Constant iterator that is pointing to the first raster pixel value.

Returns
constant iterator

Definition at line 96 of file Raster.h.

97 {
98 return _raster_data.begin();
99 }

References _raster_data.

Referenced by Raster(), and LayeredMeshGenerator::calcEpsilon().

◆ data()

double const * GeoLib::Raster::data ( ) const
inline

Definition at line 111 of file Raster.h.

111{ return _raster_data.data(); }

References _raster_data.

Referenced by MeshToolsLib::RasterToMesh::convert(), and FileIO::AsciiRasterInterface::writeRasterAsASC().

◆ end()

std::vector< double >::const_iterator GeoLib::Raster::end ( ) const
inline

Iterator to the element following the last pixel element of the raster

Returns
constant iterator

Definition at line 106 of file Raster.h.

107 {
108 return _raster_data.end();
109 }

References _raster_data.

Referenced by Raster(), and LayeredMeshGenerator::calcEpsilon().

◆ getHeader()

◆ getValueAtPoint()

double GeoLib::Raster::getValueAtPoint ( const MathLib::Point3d & pnt) const

Returns the raster value at the position of the given point.

Definition at line 56 of file Raster.cpp.

57{
58 if (pnt[0] >= _header.origin[0] &&
59 pnt[0] < (_header.origin[0] + (_header.cell_size * _header.n_cols)) &&
60 pnt[1] >= _header.origin[1] &&
61 pnt[1] < (_header.origin[1] + (_header.cell_size * _header.n_rows)))
62 {
63 auto cell_x = static_cast<int>(
64 std::floor((pnt[0] - _header.origin[0]) / _header.cell_size));
65 auto cell_y = static_cast<int>(
66 std::floor((pnt[1] - _header.origin[1]) / _header.cell_size));
67
68 // use raster boundary values if node is outside raster due to rounding
69 // errors or floating point arithmetic
70 cell_x = (cell_x < 0) ? 0
71 : ((cell_x > static_cast<int>(_header.n_cols))
72 ? static_cast<int>(_header.n_cols - 1)
73 : cell_x);
74 cell_y = (cell_y < 0) ? 0
75 : ((cell_y > static_cast<int>(_header.n_rows))
76 ? static_cast<int>(_header.n_rows - 1)
77 : cell_y);
78
79 const std::size_t index = cell_y * _header.n_cols + cell_x;
80 return _raster_data[index];
81 }
82 return _header.no_data;
83}
MathLib::Point3d origin
Definition Raster.h:32

References _header, _raster_data, GeoLib::RasterHeader::cell_size, GeoLib::RasterHeader::n_cols, GeoLib::RasterHeader::n_rows, GeoLib::RasterHeader::no_data, and GeoLib::RasterHeader::origin.

Referenced by DirectConditionGenerator::directToSurfaceNodes(), and MeshToolsLib::MeshLayerMapper::layerMapping().

◆ interpolateValueAtPoint()

double GeoLib::Raster::interpolateValueAtPoint ( const MathLib::Point3d & pnt) const

Interpolates the elevation of the given point based on the 8-neighbourhood of the raster cell it is located on

Definition at line 85 of file Raster.cpp.

86{
87 // position in raster
88 double const xPos((pnt[0] - _header.origin[0]) / _header.cell_size);
89 double const yPos((pnt[1] - _header.origin[1]) / _header.cell_size);
90 // raster cell index
91 double const xIdx(std::floor(xPos)); // carry out computions in double
92 double const yIdx(std::floor(yPos)); // so not to over- or underflow.
93
94 // weights for bilinear interpolation
95 double const xShift = std::abs((xPos - xIdx) - 0.5);
96 double const yShift = std::abs((yPos - yIdx) - 0.5);
97 Eigen::Vector4d weight = {(1 - xShift) * (1 - yShift),
98 xShift * (1 - yShift), xShift * yShift,
99 (1 - xShift) * yShift};
100
101 // neighbors to include in interpolation
102 int const xShiftIdx = (xPos - xIdx >= 0.5) ? 1 : -1;
103 int const yShiftIdx = (yPos - yIdx >= 0.5) ? 1 : -1;
104 std::array<int, 4> const x_nb = {{0, xShiftIdx, xShiftIdx, 0}};
105 std::array<int, 4> const y_nb = {{0, 0, yShiftIdx, yShiftIdx}};
106
107 // get pixel values
108 Eigen::Vector4d pix_val{};
109 unsigned no_data_count(0);
110 for (unsigned j = 0; j < 4; ++j)
111 {
112 // check if neighbour pixel is still on the raster, otherwise substitute
113 // a no data value. This also allows the cast to unsigned type.
114 if ((xIdx + x_nb[j]) < 0 || (yIdx + y_nb[j]) < 0 ||
115 (xIdx + x_nb[j]) > (_header.n_cols - 1) ||
116 (yIdx + y_nb[j]) > (_header.n_rows - 1))
117 {
118 pix_val[j] = _header.no_data;
119 }
120 else
121 {
122 pix_val[j] = _raster_data[static_cast<std::size_t>(yIdx + y_nb[j]) *
124 static_cast<std::size_t>(xIdx + x_nb[j])];
125 }
126
127 // remove no data values
128 if (std::abs(pix_val[j] - _header.no_data) <
129 std::numeric_limits<double>::epsilon())
130 {
131 weight[j] = 0;
132 no_data_count++;
133 }
134 }
135
136 // adjust weights if necessary
137 if (no_data_count > 0)
138 {
139 if (no_data_count == 4)
140 { // if there is absolutely no data just use the default value
141 return _header.no_data;
142 }
143
144 weight /= weight.sum();
145 }
146
147 // new value
148 return weight.dot(pix_val);
149}

References _header, _raster_data, GeoLib::RasterHeader::cell_size, GeoLib::RasterHeader::n_cols, GeoLib::RasterHeader::n_rows, GeoLib::RasterHeader::no_data, and GeoLib::RasterHeader::origin.

Referenced by VtkImageDataToSurfacePointsFilter::createPointSurface(), LayeredMeshGenerator::getNewLayerNode(), and MeshToolsLib::MeshLayerMapper::layerMapping().

◆ isPntOnRaster()

bool GeoLib::Raster::isPntOnRaster ( MathLib::Point3d const & pnt) const

Checks if the given point is located within the (x,y)-extension of the raster.

Definition at line 151 of file Raster.cpp.

152{
153 return !(
154 (pnt[0] < _header.origin[0]) ||
155 (pnt[0] > _header.origin[0] + (_header.n_cols * _header.cell_size)) ||
156 (pnt[1] < _header.origin[1]) ||
157 (pnt[1] > _header.origin[1] + (_header.n_rows * _header.cell_size)));
158}

References _header, GeoLib::RasterHeader::cell_size, GeoLib::RasterHeader::n_cols, GeoLib::RasterHeader::n_rows, and GeoLib::RasterHeader::origin.

Referenced by MeshToolsLib::MeshLayerMapper::layerMapping().

◆ operator()() [1/2]

double & GeoLib::Raster::operator() ( std::size_t const row,
std::size_t const col )
inline

Definition at line 126 of file Raster.h.

127 {
128 return const_cast<double&>(std::as_const(*this)(row, col));
129 }

◆ operator()() [2/2]

double const & GeoLib::Raster::operator() ( std::size_t const row,
std::size_t const col ) const
inline

Access the pixel specified by row, col.

Definition at line 116 of file Raster.h.

117 {
118 if (row >= _header.n_rows || col >= _header.n_cols)
119 {
120 OGS_FATAL(
121 "Raster pixel ({}, {}) doesn't exist. Raster size is {} x {}.",
122 row, col, _header.n_rows, _header.n_cols);
123 }
124 return _raster_data[(_header.n_rows - 1 - row) * _header.n_cols + col];
125 }
#define OGS_FATAL(...)
Definition Error.h:26

References _header, _raster_data, GeoLib::RasterHeader::n_cols, GeoLib::RasterHeader::n_rows, and OGS_FATAL.

◆ operator=() [1/2]

Raster & GeoLib::Raster::operator= ( Raster && )
default

◆ operator=() [2/2]

Raster & GeoLib::Raster::operator= ( Raster const & )
default

◆ operator==()

bool GeoLib::Raster::operator== ( Raster const & ) const
default

◆ refineRaster()

void GeoLib::Raster::refineRaster ( std::size_t scaling)

Refine the raster using scaling as a refinement parameter.

Definition at line 25 of file Raster.cpp.

26{
27 std::vector<double> new_raster_data(_header.n_rows * _header.n_cols *
28 scaling * scaling);
29
30 for (std::size_t row(0); row < _header.n_rows; row++)
31 {
32 for (std::size_t col(0); col < _header.n_cols; col++)
33 {
34 const std::size_t idx(row * _header.n_cols + col);
35 for (std::size_t new_row(row * scaling);
36 new_row < (row + 1) * scaling;
37 new_row++)
38 {
39 const std::size_t idx0(new_row * _header.n_cols * scaling);
40 for (std::size_t new_col(col * scaling);
41 new_col < (col + 1) * scaling;
42 new_col++)
43 {
44 new_raster_data[idx0 + new_col] = _raster_data[idx];
45 }
46 }
47 }
48 }
49
50 std::swap(_raster_data, new_raster_data);
51 _header.cell_size /= scaling;
52 _header.n_cols *= scaling;
53 _header.n_rows *= scaling;
54}

References _header, _raster_data, GeoLib::RasterHeader::cell_size, GeoLib::RasterHeader::n_cols, and GeoLib::RasterHeader::n_rows.

◆ setCellSize()

void GeoLib::Raster::setCellSize ( double cell_size)
private

◆ setNoDataVal()

void GeoLib::Raster::setNoDataVal ( double no_data_val)
private

Member Data Documentation

◆ _header

GeoLib::RasterHeader GeoLib::Raster::_header
private

◆ _raster_data

std::vector<double> GeoLib::Raster::_raster_data
private

The documentation for this class was generated from the following files: