30 std::multimap<std::string, netCDF::NcVar>
const& variables)
35 double cell_size_y = 0;
39 for (
auto [variable_name, variable] : variables)
41 if (variable.isNull())
43 OGS_FATAL(
"Variable '{}' not found in file.", variable_name);
45 auto const& attributes = variable.getAtts();
46 for (
auto [name, attribute] : attributes)
48 if (name ==
"GeoTransform")
50 std::vector<char> attribute_values;
51 attribute_values.resize(attribute.getAttLength());
52 attribute.getValues(attribute_values.data());
53 std::string
const str_attribute_values(attribute_values.begin(),
54 attribute_values.end());
56 header.
origin[0] = std::stod(strings[0]);
58 header.
origin[1] = std::stod(strings[3]);
59 cell_size_y = std::stod(strings[5]);
61 "GeoTransform attribute values: origin_x: {}, origin_y: "
62 "{}, cell_size_x: {}, cell_size_y: {}",
66 if (name ==
"_FillValue")
68 attribute.getValues(&header.
no_data);
77 std::multimap<std::string, netCDF::NcVar>
const& variables,
78 std::string_view
const var_name, std::size_t
const dimension_number,
82 std::vector<double> raster_data;
83 for (
auto [variable_name, variable] : variables)
87 if (variable_name == var_name)
89 auto const n_dims = variable.getDimCount();
96 std::vector<std::size_t> counts(n_dims, 1);
97 for (
int i = 0; i < n_dims; ++i)
99 counts[i] = variable.getDim(i).getSize();
102 std::vector<std::size_t> start(n_dims, 0);
103 if (dimension_number > counts[0])
106 "variable '{}' has {} dimensions, requested dimension "
108 variable_name, counts[0], dimension_number);
111 start[0] = dimension_number;
122 counts[2] =
static_cast<int>(
123 std::ceil((min_max_points.
max[0] - min_max_points.
min[0]) /
126 counts[1] =
static_cast<int>(
127 std::ceil((min_max_points.
max[1] - min_max_points.
min[1]) /
131 start[2] =
static_cast<int>(std::floor(
134 start[1] =
static_cast<int>(std::floor(
142 header.
n_cols = counts[2];
143 header.
n_rows = counts[1];
147 std::size_t
const total_length =
148 std::accumulate(counts.cbegin(), counts.cend(), 1,
149 std::multiplies<std::size_t>());
150 raster_data.resize(total_length);
151 variable.getVar(start, counts, raster_data.data());
153 std::replace(raster_data.begin(), raster_data.end(), header.
no_data,
161 std::filesystem::path
const& filepath,
162 std::string_view
const var_name,
163 std::size_t
const dimension_number,
166 netCDF::NcFile dataset(filepath.string(), netCDF::NcFile::read);
167 if (dataset.isNull())
169 OGS_FATAL(
"Error opening file '{}'.", filepath.string());
172 auto const& variables = dataset.getVars();
175 variables, var_name, dimension_number, min_max_points, header);
177 return std::make_unique<GeoLib::Raster>(header, raster_data.begin(),
183 std::filesystem::path
const& path,
184 std::filesystem::path filename,
185 std::string
const& var_name,
186 std::size_t
const dimension_number,
189 INFO(
"readRasterFromFile: '{}/{}'", path.string(), filename.string());
191 if (filename.extension() ==
".nc")
194 auto raster =
readNetCDF(path / filename, var_name, dimension_number,
199 std::to_string(dimension_number),
202 OGS_FATAL(
"OGS was not build with NetCDF support. Can not read {}",
203 (path / filename).
string());
206 auto raster = std::unique_ptr<GeoLib::Raster>(
208 if (raster ==
nullptr)
210 OGS_FATAL(
"Could not read raster from file '{}'.",
211 (path / filename).
string());
215 std::to_string(dimension_number),