DYT/Tool/OpenSceneGraph-3.6.5/include/osgEarth/TerrainProfile

229 lines
6.7 KiB
Plaintext
Raw Permalink Normal View History

2024-12-24 23:49:36 +00:00
/* -*-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 <http://www.gnu.org/licenses/>
*/
#ifndef OSGEARTHUTIL_TERRAINPROFILE
#define OSGEARTHUTIL_TERRAINPROFILE
#include <osgEarth/Common>
#include <osgEarth/Terrain>
#include <osgSim/ElevationSlice>
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<double,double> DistanceHeight;
typedef std::vector<DistanceHeight> 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<ChangedCallback> > 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