- 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>
121 lines
4.1 KiB
C++
Executable File
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
|
|
|
|
|
|
|
|
|
|
|