/** * @RDE_HEADER@ * ViewshedAnalysis * $Id$ * $HeadURL$ * $Author$ */ // Own #include #include "viewshed_analysis.h" // ESRI #include #include #include #include // Qt #include 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::LocationViewshed *viewshed = m_viewsheds[i]; if (viewshed) { m_analysisOverlay->analyses()->removeOne(viewshed); delete viewshed; } viewshed = new Esri::ArcGISRuntime::LocationViewshed(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