24 std::multimap<std::string, netCDF::NcVar>
const& variables)
29 double cell_size_y = 0;
33 for (
auto [variable_name, variable] : variables)
35 if (variable.isNull())
37 OGS_FATAL(
"Variable '{}' not found in file.", variable_name);
39 auto const& attributes = variable.getAtts();
40 for (
auto [name, attribute] : attributes)
42 if (name ==
"GeoTransform")
44 std::vector<char> attribute_values;
45 attribute_values.resize(attribute.getAttLength());
46 attribute.getValues(attribute_values.data());
47 std::string
const str_attribute_values(attribute_values.begin(),
48 attribute_values.end());
50 header.
origin[0] = std::stod(strings[0]);
52 header.
origin[1] = std::stod(strings[3]);
53 cell_size_y = std::stod(strings[5]);
55 "GeoTransform attribute values: origin_x: {}, origin_y: "
56 "{}, cell_size_x: {}, cell_size_y: {}",
60 if (name ==
"_FillValue")
62 attribute.getValues(&header.
no_data);
71 std::multimap<std::string, netCDF::NcVar>
const& variables,
72 std::string_view
const var_name, std::size_t
const dimension_number,
76 std::vector<double> raster_data;
77 for (
auto [variable_name, variable] : variables)
81 if (variable_name == var_name)
83 auto const n_dims = variable.getDimCount();
90 std::vector<std::size_t> counts(n_dims, 1);
91 for (
int i = 0; i < n_dims; ++i)
93 counts[i] = variable.getDim(i).getSize();
96 std::vector<std::size_t> start(n_dims, 0);
97 if (dimension_number > counts[0])
100 "variable '{}' has {} dimensions, requested dimension "
102 variable_name, counts[0], dimension_number);
105 start[0] = dimension_number;
116 counts[2] =
static_cast<int>(
117 std::ceil((min_max_points.
max[0] - min_max_points.
min[0]) /
120 counts[1] =
static_cast<int>(
121 std::ceil((min_max_points.
max[1] - min_max_points.
min[1]) /
125 start[2] =
static_cast<int>(std::floor(
128 start[1] =
static_cast<int>(std::floor(
136 header.
n_cols = counts[2];
137 header.
n_rows = counts[1];
141 std::size_t
const total_length =
142 std::accumulate(counts.cbegin(), counts.cend(), 1,
143 std::multiplies<std::size_t>());
144 raster_data.resize(total_length);
145 variable.getVar(start, counts, raster_data.data());
147 std::replace(raster_data.begin(), raster_data.end(), header.
no_data,
155 std::filesystem::path
const& filepath,
156 std::string_view
const var_name,
157 std::size_t
const dimension_number,
160 netCDF::NcFile dataset(filepath.string(), netCDF::NcFile::read);
161 if (dataset.isNull())
163 OGS_FATAL(
"Error opening file '{}'.", filepath.string());
166 auto const& variables = dataset.getVars();
169 variables, var_name, dimension_number, min_max_points, header);
171 return std::make_unique<GeoLib::Raster>(header, raster_data.begin(),
177 std::filesystem::path
const& path,
178 std::filesystem::path filename,
179 std::string
const& var_name,
180 std::size_t
const dimension_number,
183 INFO(
"readRasterFromFile: '{}/{}'", path.string(), filename.string());
185 if (filename.extension() ==
".nc")
188 auto raster =
readNetCDF(path / filename, var_name, dimension_number,
193 std::to_string(dimension_number),
196 OGS_FATAL(
"OGS was not build with NetCDF support. Can not read {}",
197 (path / filename).
string());
200 auto raster = std::unique_ptr<GeoLib::Raster>(
202 if (raster ==
nullptr)
204 OGS_FATAL(
"Could not read raster from file '{}'.",
205 (path / filename).
string());
209 std::to_string(dimension_number),