/** * @RDE_HEADER@ * LocationToElevationBulk * $Id$ * $HeadURL$ * $Author$ */ // Own #include "location_to_elevation_bulk.h" #include #include "Map/situation_map_utils.h" #include "location_to_elevation_helper.h" // to get define USE_ELEVATION_MAP_AS_WORKAROUND // ESRI #include #include // Qt #include #include //---------------------------------------------------------------------------- namespace SituationMap { //---------------------------------------------------------------------------- class LocationToElevationBulk::Private { public: Private() = default; ~Private() = default; // ESRI data: QPointer m_surface; // for ESRI-Surface-based calculation QPointer m_map; // for ElevationMap-based calculation Esri::ArcGISRuntime::Point m_location; Esri::ArcGISRuntime::SpatialReference m_spatialReference; QVector> m_locationDataCont; int m_progressCount = 0; }; //---------------------------------------------------------------------------- LocationToElevationBulk::LocationToElevationBulk(QObject *parent) : BaseClass(parent) , m_logger(getLogger("LocationToElevationBulk")) , d(new Private) { TRACE_LOG(m_logger) << LOGFUNCTION << " START"; reset(); TRACE_LOG(m_logger) << LOGFUNCTION << " END"; } LocationToElevationBulk::~LocationToElevationBulk() { TRACE_LOG(m_logger) << LOGFUNCTION << " START"; this->stop(); delete d; TRACE_LOG(m_logger) << LOGFUNCTION << " END"; } bool LocationToElevationBulk::init(Map *map, Esri::ArcGISRuntime::Surface *surface) { this->reset(); if (!map) { ERROR_LOG(m_logger) << LOGFUNCTION << " no map"; return false; } d->m_map = map; connect(d->m_map.data(), &Map::beginDestroy, this, &LocationToElevationBulk::stop); MapImpl *mapImpl = static_cast(d->m_map.data()); d->m_spatialReference = mapImpl->getEsriSpatialReference(); DEBUG_LOG(m_logger) << LOGFUNCTION << " m_spatialReference.wkid = " << d->m_spatialReference.wkid(); // use ESRI-Surface-based OR ElevationMap-based: #ifdef USE_ELEVATION_MAP_AS_WORKAROUND Q_UNUSED(surface); d->m_surface.clear(); auto elevationMap = static_cast(d->m_map.data())->getElevationMapManager(); if (!elevationMap) { ERROR_LOG(m_logger) << LOGFUNCTION << " no ElevationMapManager"; return false; } #else d->m_surface = surface; if (!d->m_surface) return false; if (d->m_surface) { // be prepared in case of destruction: connect(d->m_surface.data(), &Esri::ArcGISRuntime::Surface::destroyed, this, &LocationToElevationBulk::stop); } #endif // USE_ELEVATION_MAP_AS_WORKAROUND return true; } void LocationToElevationBulk::addLocation(const Esri::ArcGISRuntime::Point &esriMapLocation) { d->m_locationDataCont.append(QSharedPointer(new LocationData(esriMapLocation))); } void LocationToElevationBulk::start() { d->m_progressCount = 0; #ifndef USE_ELEVATION_MAP_AS_WORKAROUND if (!d->m_surface || d->m_surface->loadStatus() != Esri::ArcGISRuntime::LoadStatus::Loaded) { ERROR_LOG(m_logger) << LOGFUNCTION << " no surface or surface not loaded yet" << " d->m_surface = " << d->m_surface.data(); return; } #endif // USE_ELEVATION_MAP_AS_WORKAROUND QMutableVectorIterator> vecIt(d->m_locationDataCont); while (vecIt.hasNext()) { QSharedPointer ld = vecIt.next(); if(!ld) continue; #ifdef USE_ELEVATION_MAP_AS_WORKAROUND ld->setMap(d->m_map); #else ld->setSurface(d->m_surface); #endif // USE_ELEVATION_MAP_AS_WORKAROUND connect(ld.data(), &LocationData::elevationCompleted, this, &LocationToElevationBulk::onLocationDataCompleted, Qt::UniqueConnection); if (!ld->startLocationToElevation()) ERROR_LOG(m_logger) << LOGFUNCTION << " startLocationToElevation failed"; } // while } void LocationToElevationBulk::stop() { QMutableVectorIterator> vecIt(d->m_locationDataCont); while (vecIt.hasNext()) { QSharedPointer ld = vecIt.next(); if(!ld) continue; if (!ld->cancel()) INFO_LOG(m_logger) << LOGFUNCTION << " LocationData.cancel failed"; } // while } void LocationToElevationBulk::reset() { stop(); d->m_locationDataCont.clear(); d->m_progressCount = 0; } int LocationToElevationBulk::size() const { return d->m_locationDataCont.size(); } QVector > LocationToElevationBulk::results() const { QVector > results; QVectorIterator> vecIt(d->m_locationDataCont); while (vecIt.hasNext()) { QSharedPointer ld = vecIt.next(); if(!ld) continue; const Esri::ArcGISRuntime::Point &location = ld->location(); QPair pair(QPointF(location.x(), location.y()), ld->elevation()); results.append(pair); } return results; } void LocationToElevationBulk::onLocationDataCompleted() { ++d->m_progressCount; if (d->m_progressCount >= d->m_locationDataCont.size()) { DEBUG_LOG(m_logger) << LOGFUNCTION << " emit locationsToElevationsCompleted"; emit locationsToElevationsCompleted(); } } } // namespace SituationMap