/* -*-c++-*- */ /* osgEarth - Geospatial SDK for OpenSceneGraph * Copyright 2020 Pelican Mapping * http://osgearth.org * * osgEarth is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see */ #ifndef OSGEARTHUTIL_TERRAINPROFILE #define OSGEARTHUTIL_TERRAINPROFILE #include #include #include namespace osgEarth { class MapNode; } namespace osgEarth { namespace Contrib { /** * Stores the results of a terrain profile calculation */ class OSGEARTH_EXPORT TerrainProfile { public: /** * Create a new TerrainProfile */ TerrainProfile(); /** * Copy constructor */ TerrainProfile(const TerrainProfile& profile); /** dtor */ virtual ~TerrainProfile() { } /** * Gets the distance at the given index * @param i * The index of the profile measurement */ double getDistance( int i ) const; /** * Gets the total distance covered by this TerrainProfile */ double getTotalDistance() const; /** * Gets the min and max elevations of this TerrainProfile * @param min * The minimum elevation in meters of this TerrainProfile * @param max * The maximum elevation in meters of this TerrainProfile */ void getElevationRanges(double &min, double &max ) const; /** * Gets the elevation at the given index * @param i * The index of the profile measurement */ double getElevation( int i ) const; /** * Gets the number of elevation measurements in this TerrainProfile */ unsigned int getNumElevations() const; /** * Add an elevation measurement to this TerrainProfile */ void addElevation( double distance, double elevation ); /** * Clears all measurements from this TerrainProfile */ void clear(); private: double _spacing; typedef std::pair DistanceHeight; typedef std::vector DistanceHeightList; DistanceHeightList _elevations; }; /** * Computes a TerrainProfile between two points. Monitors the scene graph for changes * to elevation and updates the profile. */ class OSGEARTH_EXPORT TerrainProfileCalculator : public TerrainCallback { public: /** * Callback that is fired when the profile changes */ struct ChangedCallback : public osg::Referenced { public: virtual void onChanged(const TerrainProfileCalculator* sender) {}; virtual ~ChangedCallback() { } }; typedef std::list< osg::observer_ptr > ChangedCallbackList; /** * Creates a new TerrainProfileCalculator * @param mapNode * The MapNode to compute the terrain profile against * @param start * The start point of the profile * @param end * The end point of the profile */ TerrainProfileCalculator(osgEarth::MapNode* mapNode, const osgEarth::GeoPoint& start, const osgEarth::GeoPoint& end); /** * Creates a new TerrainProfileCalculator * @param mapNode * The MapNode to compute the terrain profile against */ TerrainProfileCalculator(osgEarth::MapNode* mapNode); /** dtor */ virtual ~TerrainProfileCalculator(); /** * Set the MapNode to compute the terrain profile against */ void setMapNode( osgEarth::MapNode* mapNode ); /** * Add a ChangedCallback */ void addChangedCallback( ChangedCallback* callback ); /** * Remove a ChangedCallback */ void removeChangedCallback( ChangedCallback* callback ); /** * Gets the computed TerrainProfile */ const TerrainProfile& getProfile() const; /** * Gets the start point of the terrain profile */ const GeoPoint& getStart() const; /** * Gets the start point of the terrain profile */ GeoPoint getStart(AltitudeMode altMode) const; /** * Gets the end point of the terrain profile */ const GeoPoint& getEnd() const; /** * Gets the end point of the terrain profile */ GeoPoint getEnd(AltitudeMode altMode) const; /** * Sets the start and end points of the terrain profile */ void setStartEnd(const osgEarth::GeoPoint& start, const osgEarth::GeoPoint& end); virtual void onTileUpdate(const osgEarth::TileKey& tileKey, osg::Node* graph, TerrainCallbackContext&); /** * Recomputes the terrain profile */ void recompute(); /** * Utility to directly compute a terrain profile * @param mapNode * The MapNode to compute the terrain profile one * @param start * The start point of the terrain profile * @param end * The end point of the terrain profile * @param numSamples * The number of samples to compute * @param profile * The resulting TerrainProfile */ static void computeTerrainProfile( osgEarth::MapNode* mapNode, const osgEarth::GeoPoint& start, const osgEarth::GeoPoint& end, TerrainProfile& profile); private: osgEarth::GeoPoint _start; osgEarth::GeoPoint _end; TerrainProfile _profile; osg::ref_ptr< osgEarth::MapNode > _mapNode; ChangedCallbackList _changedCallbacks; }; } } // namespace osgEarth::Tools #endif // OSGEARTHUTIL_TERRAINPROFILE