Initial commit
This commit is contained in:
commit
b7d90b9afe
16245 files changed
+3396666
No files matched your search
+120
@@ -0,0 +1,120 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* ViewshedAnalysis
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
*/
|
||||
|
||||
// Own
|
||||
#include <Map/situation_map_utils.h>
|
||||
#include "viewshed_analysis.h"
|
||||
|
||||
|
||||
// ESRI
|
||||
#include <arcgis/SceneGraphicsView.h>
|
||||
|
||||
#include <arcgis/AnalysisOverlay.h>
|
||||
#include <arcgis/AnalysisListModel.h>
|
||||
#include <arcgis/LocationViewshed.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::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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user