Files
qt-migration-legatus/qt6-after/qt6-migrated-legatus/Lts/Viewer/SituationMap/MapImpl/viewshed_analysis.cpp
T
torstenandCopilot 124fbb4de8 Fix Qt6 deprecated APIs: QCheckBox::checkStateChanged, ExploratoryLocationViewshed
- Replace QCheckBox::stateChanged with checkStateChanged in:
  - lts_dialog.cpp
  - simple_esri_layer.cpp (2 occurrences)
  - layer_control_widget.cpp
  - symbol_dialog.cpp
- Replace LocationViewshed with ExploratoryLocationViewshed (ArcGIS SDK v300):
  - viewshed_analysis.h/.cpp
  - ViewshedLocation.h/.cpp
  - function_dialog.cpp (include)
- Update ViewshedLocation member variable type to ExploratoryLocationViewshed

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-13 14:41:33 +02:00

121 lines
4.1 KiB
C++
Executable File

/**
* @RDE_HEADER@
* ViewshedAnalysis
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include <Map/situation_map_utils.h>
#include "viewshed_analysis.h"
// ESRI
#include <SceneGraphicsView.h>
#include <AnalysisOverlay.h>
#include <AnalysisListModel.h>
#include <ExploratoryLocationViewshed.h>
// Qt
#include <QDebug>
namespace SituationMap
{
ViewshedAnalysis::ViewshedAnalysis(Esri::ArcGISRuntime::SceneGraphicsView *sceneGraphicsView, QObject *parent)
: ViewshedBase(parent)
, m_analysisOverlayModel(sceneGraphicsView->analysisOverlays())
, m_analysisOverlay(new Esri::ArcGISRuntime::AnalysisOverlay(this))
, m_viewsheds(3) // ESRI viewshed support 120 degree maximum, merge 3 of them
, m_logger(getLogger("ViewshedAnalysis")) // P.S.: from release 100.3 ESRI supports 360 degree viewshed
{
m_analysisOverlay->setVisible(true);
for (int i = 0; i < m_viewsheds.size(); ++i)
m_viewsheds[i] = nullptr;
QObject::connect(m_analysisOverlay->analyses(), &Esri::ArcGISRuntime::AnalysisListModel::errorOccurred, this, &ViewshedAnalysis::onErrorOccured);
m_analysisOverlayModel->append(m_analysisOverlay);
} // ViewshedAnalysis::ViewshedAnalysis
ViewshedAnalysis::~ViewshedAnalysis()
{
for (int i = 0; i < m_viewsheds.size(); ++i)
{
delete m_viewsheds[i];
m_viewsheds[i] = nullptr;
}
m_analysisOverlayModel->removeOne(m_analysisOverlay);
delete m_analysisOverlay;
} // ViewshedAnalysis::~ViewshedAnalysis()
bool ViewshedAnalysis::execute(const QPointF &viewshedPoint_map_degree, double outerRadius, double observerOffset)
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START"
<< " viewshedPoint_map_degree= " << viewshedPoint_map_degree
<< " outerRadius= " << outerRadius
<< " observerOffset= " << observerOffset;
if (!m_analysisOverlay)
return false;
Esri::ArcGISRuntime::Point viewshedCenter(viewshedPoint_map_degree.x(), viewshedPoint_map_degree.y(), observerOffset);
double heading(0.0);
double deltaHeading(360.0 / m_viewsheds.size());
// ToDo:
// Keep in mind that the number of viewsheds is restricted to 8 on mobile devices and 16 on desktop devices.
// The horizontal angle have to be less than 120 degree.
for (int i = 0; i < m_viewsheds.size(); ++i)
{
Esri::ArcGISRuntime::ExploratoryLocationViewshed *viewshed = m_viewsheds[i];
if (viewshed)
{
m_analysisOverlay->analyses()->removeOne(viewshed);
delete viewshed;
}
viewshed = new Esri::ArcGISRuntime::ExploratoryLocationViewshed(viewshedCenter
, heading
, 90.0 // pitch limited to 180
, deltaHeading // horizontalAngle limited to 120, from release 100.3 maximum is 360 here
, 90.0 // verticalAngle limited to 120
, 10.0 // minDistance
, outerRadius // maxDistance
, this);
viewshed->setVisible(true);
viewshed->setFrustumOutlineVisible(false);
viewshed->setFrustumOutlineColor(QColor(0, 0, 255, 255));
// Add the Viewshed to the Analysis Overlay
m_analysisOverlay->analyses()->append(viewshed);
m_viewsheds[i] = viewshed;
heading += deltaHeading;
} // for
return true;
} // bool ViewshedAnalysis::execute(const QPointF &viewshedPoint_map, double outerRadius, double observerOffset)
} // namespace SituationMap
namespace SituationMap
{
void ViewshedAnalysis::onErrorOccured(const Esri::ArcGISRuntime::Error &error)
{
ERROR_LOG(m_logger) << LOGFUNCTION << " EsriError occured: " << error;
// qCritical() << "Error reported from ESRI Analyse Overlay:" << error.message() << " code:" << error.code();
} // void ViewshedAnalysis::onErrorOccured(const Esri::ArcGISRuntime::Error &error)
} // namespace SituationMap