LCOV - code coverage report
Current view: top level - alg/viewshed - util.cpp (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 31 33 93.9 %
Date: 2024-11-21 22:18:42 Functions: 2 2 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  * (c) 2024 info@hobu.co
       3             :  *
       4             :  * SPDX-License-Identifier: MIT
       5             :  ****************************************************************************/
       6             : 
       7             : #include <array>
       8             : 
       9             : #include "gdal_priv.h"
      10             : #include "util.h"
      11             : #include "viewshed_types.h"
      12             : 
      13             : namespace gdal
      14             : {
      15             : namespace viewshed
      16             : {
      17             : 
      18             : /// Get the band size
      19             : ///
      20             : /// @param  band Raster band
      21             : /// @return  The raster band size.
      22         585 : size_t bandSize(GDALRasterBand &band)
      23             : {
      24         585 :     return static_cast<size_t>(band.GetXSize()) * band.GetYSize();
      25             : }
      26             : 
      27             : /// Create the output dataset.
      28             : ///
      29             : /// @param  srcBand  Source raster band.
      30             : /// @param  opts  Options.
      31             : /// @param  extent  Output dataset extent.
      32             : /// @return  The output dataset to be filled with data.
      33          38 : DatasetPtr createOutputDataset(GDALRasterBand &srcBand, const Options &opts,
      34             :                                const Window &extent)
      35             : {
      36          38 :     GDALDriverManager *hMgr = GetGDALDriverManager();
      37          38 :     GDALDriver *hDriver = hMgr->GetDriverByName(opts.outputFormat.c_str());
      38          38 :     if (!hDriver)
      39             :     {
      40           1 :         CPLError(CE_Failure, CPLE_AppDefined, "Cannot get driver");
      41           1 :         return nullptr;
      42             :     }
      43             : 
      44             :     /* create output raster */
      45             :     DatasetPtr dataset(hDriver->Create(
      46             :         opts.outputFilename.c_str(), extent.xSize(), extent.ySize(), 1,
      47          37 :         opts.outputMode == OutputMode::Normal ? GDT_Byte : GDT_Float64,
      48          74 :         const_cast<char **>(opts.creationOpts.List())));
      49          37 :     if (!dataset)
      50             :     {
      51           1 :         CPLError(CE_Failure, CPLE_AppDefined, "Cannot create dataset for %s",
      52             :                  opts.outputFilename.c_str());
      53           1 :         return nullptr;
      54             :     }
      55             : 
      56             :     /* copy srs */
      57          36 :     dataset->SetSpatialRef(srcBand.GetDataset()->GetSpatialRef());
      58             : 
      59             :     std::array<double, 6> adfSrcTransform;
      60             :     std::array<double, 6> adfDstTransform;
      61          36 :     srcBand.GetDataset()->GetGeoTransform(adfSrcTransform.data());
      62          36 :     adfDstTransform[0] = adfSrcTransform[0] +
      63          36 :                          adfSrcTransform[1] * extent.xStart +
      64          36 :                          adfSrcTransform[2] * extent.yStart;
      65          36 :     adfDstTransform[1] = adfSrcTransform[1];
      66          36 :     adfDstTransform[2] = adfSrcTransform[2];
      67          36 :     adfDstTransform[3] = adfSrcTransform[3] +
      68          36 :                          adfSrcTransform[4] * extent.xStart +
      69          36 :                          adfSrcTransform[5] * extent.yStart;
      70          36 :     adfDstTransform[4] = adfSrcTransform[4];
      71          36 :     adfDstTransform[5] = adfSrcTransform[5];
      72          36 :     dataset->SetGeoTransform(adfDstTransform.data());
      73             : 
      74          36 :     GDALRasterBand *pBand = dataset->GetRasterBand(1);
      75          36 :     if (!pBand)
      76             :     {
      77           0 :         CPLError(CE_Failure, CPLE_AppDefined, "Cannot get band for %s",
      78             :                  opts.outputFilename.c_str());
      79           0 :         return nullptr;
      80             :     }
      81             : 
      82          36 :     if (opts.nodataVal >= 0)
      83           6 :         GDALSetRasterNoDataValue(pBand, opts.nodataVal);
      84          36 :     return dataset;
      85             : }
      86             : 
      87             : }  // namespace viewshed
      88             : }  // namespace gdal

Generated by: LCOV version 1.14