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

142 lines
4.9 KiB
Plaintext
Raw 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.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* 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 OSGEARTH_ELEVATION_QUERY_H
#define OSGEARTH_ELEVATION_QUERY_H 1
#include <osgEarth/ElevationPool>
#include <osgEarth/Containers>
#include <osgEarth/ModelLayer>
#include <osgUtil/LineSegmentIntersector>
namespace osgEarth { namespace Util
{
/**
* @deprecated after 2.10 - Use ElevationPool instead, via Map::getElevationPool to
* query elevation data, and use Terrain::getHeight to query the in-scene
* terrain graph.
*
* ElevationQuery (EQ) lets you query the elevation at any point on a map.
*
* Rather than intersecting with a loadeEd scene graph, EQ uses the osgEarth
* engine to directly access the best terrain tile for elevation query. You
* give it the DEM resolution at which you want an elevation point, and it will
* access the necessary tile and sample it.
*
* NOTE: EQ does NOT take into account rendering properties like vertical scale or
* skirts. If you need a vertical scale, for example, simply scale the resulting
* elevation value.
*
* ElevationQuery is not thread-safe. So not use the same instance of ElevationQuery
* from multiple threads without mutexing.
*/
class OSGEARTH_EXPORT ElevationQuery
{
public:
ElevationQuery();
/**
* Constructs a new elevation manager.
*
* @param map
* Map against which to perform elevation queries.
*/
ElevationQuery(const Map* map);
/**
* Sets a new map
*/
void setMap(const Map* map);
/**
* @deprecated
*
* Gets the elevation data at a point, given a terrain resolution.
*
* @param point
* Coordinates for which to query elevation.
* @param desiredResolution
* Optimal resolution of elevation data to use for the query (if available).
* Pass in 0 (zero) to use the best available resolution.
* @param out_resolution
* Resolution of the resulting elevation value (if the method returns true).
*
* @return Sampled elevation value (or NO_DATA_VALUE)
*/
float getElevation(
const GeoPoint& point,
double desiredResolution =0.0,
double* out_actualResolution =0L );
/**
* Gets elevations for a whole array of points, storing the result in the
* "z" element. If "ignoreZ" is false, the new Z value will be offset by
* the original Z value.
*/
bool getElevations(
std::vector<osg::Vec3d>& points,
const SpatialReference* pointsSRS,
bool ignoreZ = true,
double desiredResolution =0.0 );
/**
* Gets elevations for a whole array of points, storing the results in the
* "out_elevations" vector.
*/
bool getElevations(
const std::vector<osg::Vec3d>& points,
const SpatialReference* pointsSRS,
std::vector<float>& out_elevations,
double desiredResolution =0.0 );
/** dtor */
virtual ~ElevationQuery() { }
private:
// Map model layers marked as terrain patches
LayerVector _terrainModelLayers;
ElevationLayerVector _elevationLayers;
// Intersector to query the patch layers
osg::ref_ptr<osgUtil::LineSegmentIntersector> _lsi;
// Callback to force the intersector to materialize paged model nodes
osg::ref_ptr<osgUtil::IntersectionVisitor::ReadCallback> _ivrc;
private:
void reset();
void sync();
void gatherTerrainModelLayers(const Map*);
bool getElevationImpl(
const GeoPoint& point,
float& out_elevation,
double desiredResolution,
double* out_actualResolution );
osg::observer_ptr<const Map> _map;
Revision _mapRevision;
ElevationPool::WorkingSet _workingSet;
};
} }
#endif // OSGEARTH_ELEVATION_QUERY_H