Added support for tracing the resolutions that are required by the destination data.

This commit is contained in:
Robert Osfield
2003-12-17 17:02:23 +00:00
parent c6cd8edf3f
commit 01f171f133
2 changed files with 115 additions and 7 deletions

View File

@@ -738,6 +738,9 @@ void DataSet::Source::buildOverviews()
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
DataSet::DestinationTile::DestinationTile():
_imagery_maxNumColumns(4096),
_imagery_maxNumRows(4096),
@@ -755,6 +758,7 @@ DataSet::DestinationTile::DestinationTile():
}
}
void DataSet::DestinationTile::computeMaximumSourceResolution(CompositeSource* sourceGraph)
{
for(CompositeSource::source_iterator itr(sourceGraph);itr.valid();++itr)
@@ -800,6 +804,43 @@ void DataSet::DestinationTile::computeMaximumSourceResolution(CompositeSource* s
}
}
bool DataSet::DestinationTile::computeImageResolution(double& resX, double& resY)
{
if (_imagery_maxSourceResolutionX!=0.0f && _imagery_maxSourceResolutionY!=0.0f &&
_imagery_maxNumColumns!=0 && _imagery_maxNumRows!=0)
{
unsigned int numColumnsAtFullRes = 1+(unsigned int)ceilf((_extents.xMax()-_extents.xMin())/_imagery_maxSourceResolutionX);
unsigned int numRowsAtFullRes = 1+(unsigned int)ceilf((_extents.yMax()-_extents.yMin())/_imagery_maxSourceResolutionY);
unsigned int texture_numColumns = osg::minimum(_imagery_maxNumColumns,numColumnsAtFullRes);
unsigned int texture_numRows = osg::minimum(_imagery_maxNumRows,numRowsAtFullRes);
resX = (_extents.xMax()-_extents.xMin())/(double)(texture_numColumns-1);
resY = (_extents.yMax()-_extents.yMin())/(double)(texture_numRows-1);
return true;
}
return false;
}
bool DataSet::DestinationTile::computeTerrainResolution(double& resX, double& resY)
{
if (_terrain_maxSourceResolutionX!=0.0f && _terrain_maxSourceResolutionY!=0.0f &&
_terrain_maxNumColumns!=0 && _terrain_maxNumRows!=0)
{
unsigned int numColumnsAtFullRes = 1+(unsigned int)ceilf((_extents.xMax()-_extents.xMin())/_terrain_maxSourceResolutionX);
unsigned int numRowsAtFullRes = 1+(unsigned int)ceilf((_extents.yMax()-_extents.yMin())/_terrain_maxSourceResolutionY);
unsigned int dem_numColumns = osg::minimum(_terrain_maxNumColumns,numColumnsAtFullRes);
unsigned int dem_numRows = osg::minimum(_terrain_maxNumRows,numRowsAtFullRes);
resX = (_extents.xMax()-_extents.xMin())/(double)(dem_numColumns-1);
resY = (_extents.yMax()-_extents.yMin())/(double)(dem_numRows-1);
return true;
}
return false;
}
void DataSet::DestinationTile::allocate()
{
@@ -1281,6 +1322,50 @@ void DataSet::DestinationTile::readFrom(CompositeSource* sourceGraph)
}
}
void DataSet::DestinationTile::addRequiredResolutions(CompositeSource* sourceGraph)
{
for(CompositeSource::source_iterator itr(sourceGraph);itr.valid();++itr)
{
Source* source = itr->get();
if (_imagery.valid() && source->getType()==Source::IMAGE)
{
double resX, resY;
if (computeImageResolution(resX,resY))
{
source->addRequiredResolution(resX,resY);
}
}
if (_terrain.valid() && source->getType()==Source::HEIGHT_FIELD)
{
double resX, resY;
if (computeTerrainResolution(resX,resY))
{
source->addRequiredResolution(resX,resY);
}
}
}
}
void DataSet::CompositeDestination::addRequiredResolutions(CompositeSource* sourceGraph)
{
// handle leaves
for(TileList::iterator titr=_tiles.begin();
titr!=_tiles.end();
++titr)
{
(*titr)->addRequiredResolutions(sourceGraph);
}
// handle chilren
for(ChildList::iterator citr=_children.begin();
citr!=_children.end();
++citr)
{
(*citr)->addRequiredResolutions(sourceGraph);
}
}
void DataSet::CompositeDestination::readFrom(CompositeSource* sourceGraph)
{
// handle leaves
@@ -1602,6 +1687,12 @@ void DataSet::updateSourcesForDestinationGraphNeeds()
}
}
// compute the resolutions of the source that are required.
{
_destinationGraph->addRequiredResolutions(_sourceGraph.get());
}
// do sampling of data to required values.
{
for(CompositeSource::source_iterator itr(_sourceGraph.get());itr.valid();++itr)

View File

@@ -22,6 +22,8 @@
#include <osgTerrain/CoordinateSystem>
#include <set>
#include <gdal_priv.h>
class DataSet : public osg::Referenced
@@ -188,6 +190,7 @@ class DataSet : public osg::Referenced
SourceData* getSourceData() { return _sourceData.get(); }
void loadSourceData();
bool needReproject(const osgTerrain::CoordinateSystem* cs) const;
@@ -196,6 +199,18 @@ class DataSet : public osg::Referenced
Source* doReproject(const std::string& filename, osgTerrain::CoordinateSystem* cs, double targetResolution=0.0) const;
void buildOverviews();
typedef std::pair<double,double> ResolutionPair;
typedef std::set<ResolutionPair> ResolutionList;
void addRequiredResolution(double resX, double resY) { _requiredResolutions.insert(ResolutionPair(resX,resY)); }
void setRequiredResolutions(ResolutionList& resolutions) { _requiredResolutions = resolutions; }
ResolutionList& getRequiredResolutions() { return _requiredResolutions; }
const ResolutionList& getRequiredResolutions() const { return _requiredResolutions; }
protected:
@@ -211,6 +226,8 @@ class DataSet : public osg::Referenced
ParameterPolicy _geoTransformPolicy;
osg::ref_ptr<SourceData> _sourceData;
ResolutionList _requiredResolutions;
};
@@ -383,13 +400,6 @@ class DataSet : public osg::Referenced
inline bool advance()
{
return advanceToNextChild(*_composite,_index);
// if (_index+1 < (int)_composite->_children.size())
// {
// ++_index;
// return valid();
// }
// return false;
}
inline bool isActive(const CompositeSource& composite,int index)
@@ -609,8 +619,13 @@ class DataSet : public osg::Referenced
void computeMaximumSourceResolution(CompositeSource* sourceGraph);
bool computeImageResolution(double& resX, double& resY);
bool computeTerrainResolution(double& resX, double& resY);
void allocate();
void addRequiredResolutions(CompositeSource* sourceGraph);
void readFrom(CompositeSource* sourceGraph);
void equalizeCorner(Position position);
@@ -648,6 +663,8 @@ class DataSet : public osg::Referenced
{
public:
void addRequiredResolutions(CompositeSource* sourceGraph);
void readFrom(CompositeSource* sourceGraph);
void equalizeBoundaries();