OGS
FileIO::AsciiRasterInterface Class Reference

Detailed Description

Interface for reading and writing a number of ASCII raster formats. Currently supported are reading and writing of Esri asc-files and reading of Surfer grd-files.

Definition at line 19 of file AsciiRasterInterface.h.

#include <AsciiRasterInterface.h>

Static Public Member Functions

static GeoLib::RasterreadRaster (std::string const &fname)
static GeoLib::RastergetRasterFromASCFile (std::string const &fname)
 Reads an ArcGis ASC raster file.
static GeoLib::RastergetRasterFromSurferFile (std::string const &fname)
 Reads a Surfer GRD raster file.
static GeoLib::RastergetRasterFromXyzFile (std::string const &fname)
 Reads a XYZ raster file.
static void writeRasterAsASC (GeoLib::Raster const &raster, std::string const &file_name)
 Writes an Esri asc-file.

Member Function Documentation

◆ getRasterFromASCFile()

GeoLib::Raster * FileIO::AsciiRasterInterface::getRasterFromASCFile ( std::string const & fname)
static

Reads an ArcGis ASC raster file.

Definition at line 121 of file AsciiRasterInterface.cpp.

123{
124 std::ifstream in(fname.c_str());
125
126 if (!in.is_open())
127 {
128 WARN("Raster::getRasterFromASCFile(): Could not open file {:s}.",
129 fname);
130 return nullptr;
131 }
132
133 auto const header = readASCHeader(in);
134 if (!header)
135 {
136 WARN(
137 "Raster::getRasterFromASCFile(): Could not read header of file "
138 "{:s}",
139 fname);
140 return nullptr;
141 }
142
143 std::vector<double> values(header->n_cols * header->n_rows);
144 // read the data into the double-array
145 for (std::size_t j(0); j < header->n_rows; ++j)
146 {
147 const std::size_t idx((header->n_rows - j - 1) * header->n_cols);
148 for (std::size_t i(0); i < header->n_cols; ++i)
149 {
150 values[idx + i] = readDoubleFromStream(in);
151 }
152 }
153
154 return new GeoLib::Raster(*header, values.begin(), values.end());
155}
void WARN(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:34
static std::optional< GeoLib::RasterHeader > readASCHeader(std::ifstream &in)
static double readDoubleFromStream(std::istream &in)
Reads a double replacing comma by point.

References FileIO::readASCHeader(), FileIO::readDoubleFromStream(), and WARN().

Referenced by VtkRaster::loadImage(), main(), MainWindow::mapGeometry(), and readRaster().

◆ getRasterFromSurferFile()

GeoLib::Raster * FileIO::AsciiRasterInterface::getRasterFromSurferFile ( std::string const & fname)
static

Reads a Surfer GRD raster file.

Definition at line 200 of file AsciiRasterInterface.cpp.

202{
203 std::ifstream in(fname.c_str());
204
205 if (!in.is_open())
206 {
207 ERR("Raster::getRasterFromSurferFile() - Could not open file {:s}",
208 fname);
209 return nullptr;
210 }
211
212 auto const optional_header = readSurferHeader(in);
213 if (!optional_header)
214 {
215 ERR("Raster::getRasterFromASCFile() - could not read header of file "
216 "{:s}",
217 fname);
218 return nullptr;
219 }
220
221 auto const [header, min, max] = *optional_header;
222 std::vector<double> values(header.n_cols * header.n_rows);
223 // read the data into the double-array
224 for (std::size_t j(0); j < header.n_rows; ++j)
225 {
226 const std::size_t idx(j * header.n_cols);
227 for (std::size_t i(0); i < header.n_cols; ++i)
228 {
229 const double val = readDoubleFromStream(in);
230 values[idx + i] = (val > max || val < min) ? header.no_data : val;
231 }
232 }
233
234 return new GeoLib::Raster(header, values.begin(), values.end());
235}
void ERR(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:40
static std::optional< std::tuple< GeoLib::RasterHeader, double, double > > readSurferHeader(std::ifstream &in)

References ERR(), FileIO::readDoubleFromStream(), and FileIO::readSurferHeader().

Referenced by VtkRaster::loadImage(), and readRaster().

◆ getRasterFromXyzFile()

GeoLib::Raster * FileIO::AsciiRasterInterface::getRasterFromXyzFile ( std::string const & fname)
static

Reads a XYZ raster file.

Definition at line 304 of file AsciiRasterInterface.cpp.

306{
307 std::ifstream in(fname.c_str());
308 if (!in.is_open())
309 {
310 ERR("Raster::getRasterFromXyzFile() - Could not open file {:s}", fname);
311 return nullptr;
312 }
313
314 auto const string_lines = readFile(in);
315 in.close();
316
317 auto const header = getXyzHeader(string_lines);
318 if (header.n_cols == 0 && header.n_rows == 0)
319 {
320 return nullptr;
321 }
322
323 std::optional<std::array<double, 3>> coords;
324 std::vector<double> values(header.n_cols * header.n_rows, -9999);
325 std::size_t const n_lines(string_lines.size());
326 for (std::size_t i = 0; i < n_lines; ++i)
327 {
328 coords = readXyzCoordinates(string_lines[i]);
329 std::size_t const idx = static_cast<std::size_t>(
330 (header.n_cols *
331 (((*coords)[1] - header.origin[1]) / header.cell_size)) +
332 (((*coords)[0] - header.origin[0]) / header.cell_size));
333 values[idx] = (*coords)[2];
334 }
335 return new GeoLib::Raster(header, values.begin(), values.end());
336}
std::optional< std::array< double, 3 > > readXyzCoordinates(std::string const &line)
std::vector< std::string > readFile(std::istream &in)
GeoLib::RasterHeader getXyzHeader(std::vector< std::string > const &lines)
constexpr ranges::views::view_closure coords
Definition Mesh.h:223

References ERR(), FileIO::getXyzHeader(), FileIO::readFile(), and FileIO::readXyzCoordinates().

Referenced by VtkRaster::loadImage(), and readRaster().

◆ readRaster()

GeoLib::Raster * FileIO::AsciiRasterInterface::readRaster ( std::string const & fname)
static

Reads raster file by detecting type based on extension and then calling the appropriate method

Definition at line 16 of file AsciiRasterInterface.cpp.

17{
18 std::string ext(BaseLib::getFileExtension(fname));
19 std::transform(ext.begin(), ext.end(), ext.begin(), tolower);
20 if (ext == ".asc")
21 {
22 return getRasterFromASCFile(fname);
23 }
24 if (ext == ".grd")
25 {
26 return getRasterFromSurferFile(fname);
27 }
28 if (ext == ".xyz")
29 {
30 return getRasterFromXyzFile(fname);
31 }
32 return nullptr;
33}
static GeoLib::Raster * getRasterFromXyzFile(std::string const &fname)
Reads a XYZ raster file.
static GeoLib::Raster * getRasterFromSurferFile(std::string const &fname)
Reads a Surfer GRD raster file.
static GeoLib::Raster * getRasterFromASCFile(std::string const &fname)
Reads an ArcGis ASC raster file.
std::string getFileExtension(const std::string &path)

References BaseLib::getFileExtension(), getRasterFromASCFile(), getRasterFromSurferFile(), and getRasterFromXyzFile().

Referenced by DirectConditionGenerator::directToSurfaceNodes(), DirectConditionGenerator::directWithSurfaceIntegration(), main(), MeshView::openMap2dMeshDialog(), MeshView::openRasterDataToMeshDialog(), and anonymous_namespace{NetCDFRasterReader.cpp}::readRasterFromFile().

◆ writeRasterAsASC()

void FileIO::AsciiRasterInterface::writeRasterAsASC ( GeoLib::Raster const & raster,
std::string const & file_name )
static

Writes an Esri asc-file.

Definition at line 338 of file AsciiRasterInterface.cpp.

340{
341 GeoLib::RasterHeader header(raster.getHeader());
342 MathLib::Point3d const& origin(header.origin);
343 unsigned const nCols(header.n_cols);
344 unsigned const nRows(header.n_rows);
345
346 // write header
347 std::ofstream out(file_name);
348 out << "ncols " << nCols << "\n";
349 out << "nrows " << nRows << "\n";
350 auto const default_precision = out.precision();
351 out.precision(std::numeric_limits<double>::max_digits10);
352 out << "xllcorner " << origin[0] << "\n";
353 out << "yllcorner " << origin[1] << "\n";
354 out << "cellsize " << header.cell_size << "\n";
355 out.precision(default_precision);
356 out << "NODATA_value " << header.no_data << "\n";
357
358 // write data
359 for (unsigned row(0); row < nRows; ++row)
360 {
361 for (unsigned col(0); col < nCols - 1; ++col)
362 {
363 out << raster.data()[(nRows - row - 1) * nCols + col] << " ";
364 }
365 out << raster.data()[(nRows - row) * nCols - 1] << "\n";
366 }
367 out.close();
368}

References GeoLib::RasterHeader::cell_size, GeoLib::Raster::data(), GeoLib::Raster::getHeader(), GeoLib::RasterHeader::n_cols, GeoLib::RasterHeader::n_rows, GeoLib::RasterHeader::no_data, and GeoLib::RasterHeader::origin.

Referenced by convert(), main(), and VtkVisImageItem::writeAsRaster().


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