GDAL

cumulative.h
1/******************************************************************************
2 * (c) 2024 info@hobu.co
3 *
4 * SPDX-License-Identifier: MIT
5 ****************************************************************************/
6
7#ifndef VIEWSHED_CUMULATIVE_H_INCLUDED
8#define VIEWSHED_CUMULATIVE_H_INCLUDED
9
10#include <atomic>
11#include <vector>
12
13#include "notifyqueue.h"
14#include "progress.h"
15#include "viewshed_types.h"
16
17 namespace gdal
18{
19 namespace viewshed
20{
21
22 class Progress;
23
25 class Cumulative
26{
27 public:
28 CPL_DLL explicit Cumulative(const Options &opts);
29 // We define an explicit destructor, whose implementation is in libgdal,
30 // otherwise with gcc 9.4 of Ubuntu 20.04 in debug mode, this would need to
31 // redefinition of the NotifyQueue class in both libgdal and gdal_viewshed,
32 // leading to weird things related to mutex.
33 CPL_DLL ~Cumulative();
34 CPL_DLL bool run(const std::string &srcFilename,
35 GDALProgressFunc pfnProgress = GDALDummyProgress,
36 void *pProgressArg = nullptr);
37
38 private:
39 friend class Combiner; // Provides access to the queue types.
40
41 struct Location
42 {
43 int x;
44 int y;
45 };
46
47 using Buf32 = std::vector<uint32_t>;
48 using ObserverQueue = NotifyQueue<Location>;
49 using DatasetQueue = NotifyQueue<DatasetPtr>;
50
51 Window m_extent{};
52 Options m_opts;
53 ObserverQueue m_observerQueue{};
54 DatasetQueue m_datasetQueue{};
55 DatasetQueue m_rollupQueue{};
56 Buf32 m_finalBuf{};
57
58 void runExecutor(const std::string &srcFilename, Progress &progress,
59 std::atomic<bool> &err, std::atomic<int> &running,
60 std::atomic<bool> &hasFoundNoData);
61 void rollupRasters();
62 void scaleOutput();
63 bool writeOutput(DatasetPtr pDstDS);
64
65 Cumulative(const Cumulative &) = delete;
66 Cumulative &operator=(const Cumulative &) = delete;
67};
68
69} // namespace viewshed
70} // namespace gdal
71
72#endif
gdal::viewshed::Combiner
Reads completed viewshed rasters and sums them together.
Definition combiner.h:22
gdal::viewshed::Cumulative
Generates a cumulative viewshed from a matrix of observers.
Definition cumulative.h:26
gdal::viewshed::Cumulative::run
bool run(const std::string &srcFilename, GDALProgressFunc pfnProgress=GDALDummyProgress, void *pProgressArg=nullptr)
Compute the cumulative viewshed of a raster band.
Definition cumulative.cpp:42
gdal::viewshed::Cumulative::~Cumulative
~Cumulative()
Destructor.
gdal::viewshed::NotifyQueue
This is a thread-safe queue.
Definition notifyqueue.h:26
gdal::viewshed::Options
Options for viewshed generation.
Definition viewshed_types.h:59
gdal::viewshed::Window
A window in a raster including pixels in [xStart, xStop) and [yStart, yStop).
Definition viewshed_types.h:116