osgEarth 2.1.1
Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes

osgEarth::VerticalSpatialReference Class Reference

Inheritance diagram for osgEarth::VerticalSpatialReference:
Collaboration diagram for osgEarth::VerticalSpatialReference:

List of all members.

Public Types

typedef std::map< std::string,
osg::ref_ptr< const Geoid > > 
GeoidRegistry

Public Member Functions

bool transform (const VerticalSpatialReference *toVSRS, double lat_deg, double lon_deg, double z, double &out_z) const
bool canTransform (const VerticalSpatialReference *toVSRS) const
osg::HeightField * createReferenceHeightField (const GeoExtent &extent, int cols, int rows) const
const std::string & getName () const
const UnitsgetUnits () const
const std::string & getInitString () const
virtual bool isEquivalentTo (const VerticalSpatialReference *rhs) const
 VerticalSpatialReference (const std::string &name, const std::string &initString, const Geoid *geoid)
 VerticalSpatialReference (const Units &units)

Static Public Member Functions

static VerticalSpatialReferencecreate (const std::string &init)
static void registerGeoid (const Geoid *geoid)
static bool canTransform (const VerticalSpatialReference *from, const VerticalSpatialReference *toVSRS)

Public Attributes

std::string _name
std::string _initString
osg::ref_ptr< const Geoid_geoid
Units _units

Static Public Attributes

static GeoidRegistry_geoidRegistry = 0L

Detailed Description

Reference information for vertical (height) information.

Definition at line 34 of file VerticalSpatialReference.


Member Typedef Documentation

typedef std::map<std::string, osg::ref_ptr<const Geoid> > osgEarth::VerticalSpatialReference::GeoidRegistry

Definition at line 103 of file VerticalSpatialReference.


Constructor & Destructor Documentation

VerticalSpatialReference::VerticalSpatialReference ( const std::string &  name,
const std::string &  initString,
const Geoid geoid 
)

Creates a geoid-based VSRS.

Definition at line 75 of file VerticalSpatialReference.cpp.

                                                                        :
_name( name ),
_initString( initString ),
_geoid( geoid ),
_units( Units::METERS )
{
    if ( _geoid.valid() )
        _units = _geoid->getUnits();
}

Here is the caller graph for this function:

VerticalSpatialReference::VerticalSpatialReference ( const Units units)

Creates a simple ellipsoidal VSRS.

Definition at line 87 of file VerticalSpatialReference.cpp.

                                                                       :
_name( units.getName() ),
_initString( units.getName() ),
_units( units )
{
    //nop
}

Member Function Documentation

bool VerticalSpatialReference::canTransform ( const VerticalSpatialReference toVSRS) const

Returns true if transformation from this VSRS to the target VSRS is both possible and necessary.

Definition at line 96 of file VerticalSpatialReference.cpp.

{
    return toVSRS && !isEquivalentTo( toVSRS );
}

Here is the call graph for this function:

Here is the caller graph for this function:

bool VerticalSpatialReference::canTransform ( const VerticalSpatialReference from,
const VerticalSpatialReference toVSRS 
) [static]

Returns true if transformation from one VRS to another is possible and necessary

Definition at line 102 of file VerticalSpatialReference.cpp.

{
    return fromVSRS && fromVSRS->canTransform( toVSRS );
}

Here is the call graph for this function:

VerticalSpatialReference * VerticalSpatialReference::create ( const std::string &  init) [static]

Creates an V-SRS from an initialization string.

Definition at line 33 of file VerticalSpatialReference.cpp.

{
    static OpenThreads::Mutex s_mutex;
    OpenThreads::ScopedLock<OpenThreads::Mutex> exclusiveLock(s_mutex);

    if ( !_geoidRegistry )
    {
        // initialize the registry the first time through.
        registerGeoid( new EGM96Geoid() );
    }

    std::string s = toLower( initString );

    GeoidRegistry::const_iterator i = (*_geoidRegistry).find( s );
    if ( i != (*_geoidRegistry).end() )
    {
        const Geoid* geoid = i->second.get();
        return new VerticalSpatialReference( geoid->getName(), initString, geoid );
    }
    else if ( s == "meters" || s == "metres" || s == "meter" || s == "metre" )
        return new VerticalSpatialReference( Units::METERS );
    else if ( startsWith( s, "feet" ) || startsWith( s, "foot" ) )
        return new VerticalSpatialReference( Units::FEET );

    return 0L;
}

Here is the call graph for this function:

Here is the caller graph for this function:

osg::HeightField * VerticalSpatialReference::createReferenceHeightField ( const GeoExtent extent,
int  cols,
int  rows 
) const

Creates a heightfield containing the "zero" refernce values relative to the ellipsoid. For a vanilla ellipsoidal VSRS, the HF will be all zeros. for an orthometric (geoid) VSRS, it will contain the raw geoid offsets.

Definition at line 151 of file VerticalSpatialReference.cpp.

{
    osg::HeightField* hf = new osg::HeightField();
    hf->allocate( numCols, numRows );
    hf->setOrigin( osg::Vec3d( ex.xMin(), ex.yMin(), 0.0 ) );
    hf->setXInterval( (ex.xMax() - ex.xMin())/(double)(numCols-1) );
    hf->setYInterval( (ex.yMax() - ex.yMin())/(double)(numRows-1) );

    if ( _geoid.valid() && _geoid->isValid() )
    {
        // need the lat/long extent for geoid queries:
        GeoExtent geodeticExtent = ex.getSRS()->isGeographic() ? ex : ex.transform( ex.getSRS()->getGeographicSRS() );
        double latMin = geodeticExtent.yMin();
        double lonMin = geodeticExtent.xMin();
        double lonInterval = geodeticExtent.width() / (double)(numCols-1);
        double latInterval = geodeticExtent.height() / (double)(numRows-1);

        for( int r=0; r<numRows; ++r )
        {            
            double lat = latMin + latInterval*(double)r;
            for( int c=0; c<numCols; ++c )
            {
                double lon = lonMin + lonInterval*(double)c;
                double offset = _geoid->getOffset( lat, lon );
                hf->setHeight( c, r, offset );
            }
        }
    }
    else
    {
        for(unsigned int i=0; i<hf->getHeightList().size(); i++ )
            hf->getHeightList()[i] = 0.0;
    }

    hf->setBorderWidth( 0 );
    return hf;    
}

Here is the call graph for this function:

Here is the caller graph for this function:

const std::string& osgEarth::VerticalSpatialReference::getInitString ( ) const [inline]

Gets the string that was used to initialize this SRS

Definition at line 83 of file VerticalSpatialReference.

{ return _initString; }

Here is the caller graph for this function:

const std::string& osgEarth::VerticalSpatialReference::getName ( ) const [inline]

Gets the readable name of this SRS.

Definition at line 77 of file VerticalSpatialReference.

{ return _name; }
const Units& osgEarth::VerticalSpatialReference::getUnits ( ) const [inline]

Gets the linear units of height values

Definition at line 80 of file VerticalSpatialReference.

{ return _units; }

Here is the caller graph for this function:

bool VerticalSpatialReference::isEquivalentTo ( const VerticalSpatialReference rhs) const [virtual]

Tests this SRS for equivalence with another.

Definition at line 190 of file VerticalSpatialReference.cpp.

{
    if ( this == rhs )
        return true;

    if ( _units != rhs->_units )
        return false;

    if ( _geoid.valid() != rhs->_geoid.valid() )
        return false;
    
    if ( _geoid.valid() && !_geoid->isEquivalentTo( *rhs->_geoid.get() ) )
        return false;

    //TODO - add comparisons as necessary

    return true;
}

Here is the caller graph for this function:

void VerticalSpatialReference::registerGeoid ( const Geoid geoid) [static]

Adds a new geoid to the VSRS registry. You can thereafter create a VSRS based on this geoid with the VSRS::create() method, passing in the name of the geoid.

Definition at line 61 of file VerticalSpatialReference.cpp.

{
    if ( !_geoidRegistry )
        _geoidRegistry = new GeoidRegistry();

    if ( geoid )
        (*_geoidRegistry)[geoid->getName()] = geoid;
}

Here is the call graph for this function:

Here is the caller graph for this function:

bool VerticalSpatialReference::transform ( const VerticalSpatialReference toVSRS,
double  lat_deg,
double  lon_deg,
double  z,
double &  out_z 
) const

Transform a height value (at the specified lat/long location) to another VSRS. The output height value will be in "to_srs" units.

Definition at line 109 of file VerticalSpatialReference.cpp.

{    
    if ( this->isEquivalentTo( toSRS ) )
    {
        out_z = in_z;
    }
    else
    {
        double workZ = in_z;

        // transform out of the source VSRS (this):
        if ( _geoid.valid() )
        {
            if ( !_geoid->isValid() )
                return false;

            float offset = _geoid->getOffset( lat_deg, lon_deg, INTERP_BILINEAR );
            workZ -= offset;
        }

        // convert the value to output units:
        Units::convert( getUnits(), toSRS->getUnits(), workZ, workZ );

        // transform into the target VSRS:
        if ( toSRS->_geoid.valid() )
        {
            if ( !toSRS->_geoid->isValid() )
                return false;
        
            float offset = toSRS->_geoid->getOffset( lat_deg, lon_deg, INTERP_BILINEAR );
            workZ += offset;
        }

        out_z = workZ;
    }

    return true;
}

Here is the call graph for this function:


Member Data Documentation

Definition at line 100 of file VerticalSpatialReference.

Definition at line 104 of file VerticalSpatialReference.

Definition at line 99 of file VerticalSpatialReference.

Definition at line 98 of file VerticalSpatialReference.

Definition at line 101 of file VerticalSpatialReference.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines