OGS
Raster.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include <array>
7#include <stdexcept>
8#include <utility>
9
10#include "BaseLib/Error.h"
11#include "MathLib/Point3d.h"
12
13namespace GeoLib
14{
15
17struct RasterHeader final
18{
19 std::size_t n_cols; // width
20 std::size_t n_rows; // height
21 std::size_t n_depth; // depth (for 3d image)
22 MathLib::Point3d origin; // lower left corner
23 double cell_size; // edge length of each pixel
24 double no_data; // no data value
25
26 bool operator==(RasterHeader const&) const = default;
27};
28
38class Raster final
39{
40public:
51 template <typename InputIterator>
52 Raster(RasterHeader header, InputIterator begin, InputIterator end)
53 : _header(std::move(header)),
54 _raster_data(_header.n_cols * _header.n_rows)
55 {
56 unsigned long const number_of_input_values =
57 static_cast<unsigned long>(std::distance(begin, end));
58 if (number_of_input_values != _header.n_cols * _header.n_rows)
59 {
60 throw std::out_of_range(
61 "Number of raster data mismatch, need " +
62 std::to_string(_header.n_cols * _header.n_rows) +
63 " values, but got " + std::to_string(number_of_input_values));
64 }
65 std::copy(begin, end, _raster_data.begin());
66 }
67
68 Raster(Raster const&) = default;
69 Raster(Raster&&) = default;
70 Raster& operator=(Raster const&) = default;
71 Raster& operator=(Raster&&) = default;
72 ~Raster() = default;
73
75 RasterHeader const& getHeader() const { return _header; }
76
80 void refineRaster(std::size_t scaling);
81
86 std::vector<double>::const_iterator begin() const
87 {
88 return _raster_data.begin();
89 }
90
96 std::vector<double>::const_iterator end() const
97 {
98 return _raster_data.end();
99 }
100
101 double const* data() const { return _raster_data.data(); }
102
106 double const& operator()(std::size_t const row, std::size_t const col) const
107 {
108 if (row >= _header.n_rows || col >= _header.n_cols)
109 {
110 OGS_FATAL(
111 "Raster pixel ({}, {}) doesn't exist. Raster size is {} x {}.",
112 row, col, _header.n_rows, _header.n_cols);
113 }
114 return _raster_data[(_header.n_rows - 1 - row) * _header.n_cols + col];
115 }
116 double& operator()(std::size_t const row, std::size_t const col)
117 {
118 return const_cast<double&>(std::as_const(*this)(row, col));
119 }
120
124 double getValueAtPoint(const MathLib::Point3d& pnt) const;
125
128 double interpolateValueAtPoint(const MathLib::Point3d& pnt) const;
129
132 bool isPntOnRaster(MathLib::Point3d const& pnt) const;
133
134 bool operator==(Raster const&) const = default;
135
136private:
137 void setCellSize(double cell_size);
138 void setNoDataVal(double no_data_val);
139
141 std::vector<double> _raster_data;
142};
143
145{
146 std::string raster_name;
147 std::unique_ptr<GeoLib::Raster> raster;
148};
149
150} // namespace GeoLib
#define OGS_FATAL(...)
Definition Error.h:19
Raster & operator=(Raster &&)=default
double & operator()(std::size_t const row, std::size_t const col)
Definition Raster.h:116
Raster(Raster &&)=default
GeoLib::RasterHeader _header
Definition Raster.h:140
std::vector< double > _raster_data
Definition Raster.h:141
std::vector< double >::const_iterator begin() const
Definition Raster.h:86
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...
Definition Raster.h:52
double const & operator()(std::size_t const row, std::size_t const col) const
Definition Raster.h:106
void setNoDataVal(double no_data_val)
void refineRaster(std::size_t scaling)
Definition Raster.cpp:15
bool operator==(Raster const &) const =default
double getValueAtPoint(const MathLib::Point3d &pnt) const
Definition Raster.cpp:46
double const * data() const
Definition Raster.h:101
bool isPntOnRaster(MathLib::Point3d const &pnt) const
Definition Raster.cpp:141
Raster & operator=(Raster const &)=default
double interpolateValueAtPoint(const MathLib::Point3d &pnt) const
Definition Raster.cpp:75
RasterHeader const & getHeader() const
Returns the complete header information.
Definition Raster.h:75
std::vector< double >::const_iterator end() const
Definition Raster.h:96
void setCellSize(double cell_size)
Raster(Raster const &)=default
~Raster()=default
std::unique_ptr< GeoLib::Raster > raster
Definition Raster.h:147
std::string raster_name
Definition Raster.h:146
Contains the relevant information when storing a geoscientific raster data.
Definition Raster.h:18
bool operator==(RasterHeader const &) const =default
std::size_t n_depth
Definition Raster.h:21
MathLib::Point3d origin
Definition Raster.h:22
std::size_t n_cols
Definition Raster.h:19
std::size_t n_rows
Definition Raster.h:20