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

osgEarth::UnifiedCubeProfile Class Reference

Inheritance diagram for osgEarth::UnifiedCubeProfile:
Collaboration diagram for osgEarth::UnifiedCubeProfile:

List of all members.

Public Member Functions

 UnifiedCubeProfile ()
virtual void getIntersectingTiles (const GeoExtent &extent, std::vector< TileKey > &out_intersectingKeys) const

Static Public Member Functions

static int getFace (const TileKey &key)

Private Member Functions

GeoExtent transformGcsExtentOnFace (const GeoExtent &gcsExtent, int face) const

Private Attributes

GeoExtent _faceExtent_gcs [6]

Detailed Description

Custom profile for the unified cube tile layout.

This is a whole-earth profile consisting of 6 cube faces. The first 4 faces represent the equatorial regions between -45 and 45 degrees latitude. The lat 2 faces represent the polar regions.

The face extents in lat/long are: (lat,lon min => lat,lon max)

Face 0 : (-180, -45 => -90, 45) Face 1 : (-90, -45 => 0, 45) Face 2 : (0, -45 => 90, 45) Face 3 : (90, -45 => 180, 45 ) Face 4 : (-180, 45 => 180, 90) Face 5 : (-180, -90 => 180, -45)

Each face was a local unit coordinate system of (0.0, 0.0 => 1.0, 1.0). The profile lays the 6 faces out in a row, making a cube coordinate system of (0.0, 0.0 => 6.0, 1.0).

NOTE! This profile is non-contiguous and cannot be created as a single rectangular domain.

Definition at line 168 of file Cube.


Constructor & Destructor Documentation

UnifiedCubeProfile::UnifiedCubeProfile ( )

Definition at line 578 of file Cube.cpp.

                                       :
Profile(SpatialReference::create( "unified-cube" ),
        0.0, 0.0, 6.0, 1.0,
        -180.0, -90.0, 180.0, 90.0,
        0L, // let it automatically create a VSRS
        6, 1 )

{
    const SpatialReference* srs = getSRS()->getGeographicSRS();

    // set up some constant extents
    _faceExtent_gcs[0] = GeoExtent( srs, -180, -45, -90,  45 );
    _faceExtent_gcs[1] = GeoExtent( srs,  -90, -45,   0,  45 );
    _faceExtent_gcs[2] = GeoExtent( srs,    0, -45,  90,  45 );
    _faceExtent_gcs[3] = GeoExtent( srs,   90, -45, 180,  45 );
    _faceExtent_gcs[4] = GeoExtent( srs, -180,  45, 180,  90 ); // north polar
    _faceExtent_gcs[5] = GeoExtent( srs, -180, -90, 180, -45 ); // south polar
}

Here is the call graph for this function:


Member Function Documentation

int UnifiedCubeProfile::getFace ( const TileKey key) [static]

Gets the cube face associated with a tile key (in cube srs).

Definition at line 616 of file Cube.cpp.

{
    return key.getTileX() >> key.getLevelOfDetail();
}

Here is the call graph for this function:

void UnifiedCubeProfile::getIntersectingTiles ( const GeoExtent extent,
std::vector< TileKey > &  out_intersectingKeys 
) const [virtual]

Gets the intersecting tiles of this Profile with the given extents

Reimplemented from osgEarth::Profile.

Definition at line 664 of file Cube.cpp.

{
    if ( getSRS()->isEquivalentTo( remoteExtent.getSRS() ) )
    {
        addIntersectingTiles( remoteExtent, out_intersectingKeys );
    }
    else
    {
        // the cube profile is non-contiguous. so there may be multiple local extents required
        // to fully intersect the remote extent.

        // first transform the remote extent to lat/long.
        GeoExtent remoteExtent_gcs = remoteExtent.getSRS()->isGeographic()
            ? remoteExtent
            : remoteExtent.transform( remoteExtent.getSRS()->getGeographicSRS() );

        // Chop the input extent into three separate extents: for the equatorial, north polar,
        // and south polar tile regions.
        for( int face=0; face<6; ++face )
        {
            GeoExtent partExtent_gcs = _faceExtent_gcs[face].intersectionSameSRS( remoteExtent_gcs.bounds() );
            if ( partExtent_gcs.isValid() )
            {
                GeoExtent partExtent = transformGcsExtentOnFace( partExtent_gcs, face );
                addIntersectingTiles( partExtent, out_intersectingKeys );
            }
        }
    }
}

Here is the call graph for this function:

GeoExtent UnifiedCubeProfile::transformGcsExtentOnFace ( const GeoExtent gcsExtent,
int  face 
) const [private]

Definition at line 622 of file Cube.cpp.

{
    if ( face < 4 )
    {
        const GeoExtent& fex = _faceExtent_gcs[face];

        return GeoExtent(
            getSRS(),
            (double)face + (gcsExtent.xMin()-fex.xMin()) / fex.width(),
            (gcsExtent.yMin()-fex.yMin()) / fex.height(),
            (double)face + (gcsExtent.xMax()-fex.xMin()) / fex.width(),
            (gcsExtent.yMax()-fex.yMin()) / fex.height() );
    }
    else
    {
        // transform all 4 corners; then do the min/max for x/y.
        double lon[4] = { gcsExtent.xMin(), gcsExtent.xMax(), gcsExtent.xMax(), gcsExtent.xMin() };
        double lat[4] = { gcsExtent.yMin(), gcsExtent.yMin(), gcsExtent.yMax(), gcsExtent.yMax() };
        double x[4], y[4];

        for( int i=0; i<4; ++i )
        {
            int dummy;
            if ( ! CubeUtils::latLonToFaceCoords( lat[i], lon[i], x[i], y[i], dummy, face ) )
            {
                OE_WARN << LC << "transformGcsExtentOnFace, ll2fc failed" << std::endl;
            }
        }

        double xmin = SMALLEST( x[0], x[1], x[2], x[3] );
        double xmax = LARGEST( x[0], x[1], x[2], x[3] );
        double ymin = SMALLEST( y[0], y[1], y[2], y[3] );
        double ymax = LARGEST( y[0], y[1], y[2], y[3] );

        CubeUtils::faceToCube( xmin, ymin, face );
        CubeUtils::faceToCube( xmax, ymax, face );

        return GeoExtent( getSRS(), xmin, ymin, xmax, ymax );
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:


Member Data Documentation

Definition at line 188 of file Cube.


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