DYT/Tool/OpenSceneGraph-3.6.5/include/osgEarth/VerticalDatum
2024-12-25 07:49:36 +08:00

152 lines
4.7 KiB
C++

/* -*-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_VERTICAL_DATUM_H
#define OSGEARTH_VERTICAL_DATUM_H 1
#include <osgEarth/Common>
#include <osgEarth/Geoid>
#include <osgEarth/Units>
#include <osg/Shape>
namespace osgEarth
{
class OSGEARTH_EXPORT GeoExtent;
/**
* Reference information for vertical (height) information.
*/
class OSGEARTH_EXPORT VerticalDatum : public osg::Object
{
public:
META_Object(osgEarth, VerticalDatum);
/**
* Creates an vertical datum from an initialization string. This method
* uses an internal cache so that there is only ever one instance or each
* unique vertical datum.
*/
static VerticalDatum* get( const std::string& init );
public: // static transform methods
/**
* Transforms a Z coordinate from one vertical datum to another.
*/
static bool transform(
const VerticalDatum* from,
const VerticalDatum* to,
double lat_deg,
double lon_deg,
double& in_out_z );
/**
* Transforms a Z coordinate from one vertical datum to another.
*/
static bool transform(
const VerticalDatum* from,
const VerticalDatum* to,
double lat_deg,
double lon_deg,
float& in_out_z );
/**
* Transforms the values in a height field from one vertical datum to another.
*/
static bool transform(
const VerticalDatum* from,
const VerticalDatum* to,
const GeoExtent& extent,
osg::HeightField* hf );
public: // raw transformations
/**
* Converts an MSL value (height relative to a mean sea level model) to the
* corresponding HAE value (height above the model's reference ellipsoid)
*/
virtual double msl2hae( double lat_deg, double lon_deg, double msl ) const;
/**
* Converts an HAE value (height above the model's reference ellipsoid) to the
* corresponding MSL value (height relative to a mean sea level model)
*/
virtual double hae2msl(double lat_deg, double lon_deg, double hae) const;
public: // properties
/** Gets the readable name of this SRS. */
const std::string& getName() const { return _name; }
/** Gets the linear units of height values */
const UnitsType& getUnits() const { return _units; }
/** Gets the string that was used to initialize this SRS */
const std::string& getInitString() const { return _initString; }
/** Gets the underlying geoid */
const Geoid* getGeoid() const { return _geoid.get(); }
/** Tests this SRS for equivalence with another. */
virtual bool isEquivalentTo( const VerticalDatum* rhs ) const;
public:
/** Creates a geoid-based VSRS. */
VerticalDatum(
const std::string& name,
const std::string& initString,
Geoid* geoid =0L );
/** Creates a simple ellipsoidal VSRS. */
VerticalDatum( const UnitsType& units );
/** dtor */
virtual ~VerticalDatum() { }
protected:
// required by META_Object, but not used.
VerticalDatum() { }
VerticalDatum(const VerticalDatum& rhs, const osg::CopyOp& op) { }
std::string _name;
std::string _initString;
osg::ref_ptr<Geoid> _geoid;
UnitsType _units;
};
//--------------------------------------------------------------------
namespace Util
{
/**
* Creates a geoid instance based on an initialization string.
*/
class OSGEARTH_EXPORT VerticalDatumFactory
{
public:
static VerticalDatum* create( const std::string& id );
};
}
}
#endif // OSGEARTH_VERTICAL_DATUM_H