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