本文整理汇总了C++中osgearth::TileKey类的典型用法代码示例。如果您正苦于以下问题:C++ TileKey类的具体用法?C++ TileKey怎么用?C++ TileKey使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了TileKey类的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: sprintf
std::string
DiskCache::getFilename(const osgEarth::TileKey& key, const CacheSpec& spec ) const
{
unsigned int level, x, y;
level = key.getLevelOfDetail() +1;
key.getTileXY( x, y );
unsigned int numCols, numRows;
key.getProfile()->getNumTiles(level, numCols, numRows);
// need to invert the y-tile index
y = numRows - y - 1;
char buf[2048];
sprintf( buf, "%s/%s/%02d/%03d/%03d/%03d/%03d/%03d/%03d.%s",
getPath().c_str(),
spec.cacheId().c_str(),
level,
(x / 1000000),
(x / 1000) % 1000,
(x % 1000),
(y / 1000000),
(y / 1000) % 1000,
(y % 1000),
spec.format().c_str());
return buf;
}
示例2: onTileAdded
virtual void onTileAdded(const osgEarth::TileKey& tileKey, osg::Node* terrain, TerrainCallbackContext&)
{
if ((int)tileKey.getLevelOfDetail() > _minLevel && _maxLevel < (int)tileKey.getLevelOfDetail())
{
osg::Vec3d position = _locator->getLocator()->getPosition();
if (tileKey.getExtent().contains(position.x(), position.y()))
{
//Compute our location in geocentric
const osg::EllipsoidModel* ellipsoid = tileKey.getProfile()->getSRS()->getEllipsoid();
double x, y, z;
ellipsoid->convertLatLongHeightToXYZ(
osg::DegreesToRadians(position.y()), osg::DegreesToRadians(position.x()), 0,
x, y, z);
//Compute the up vector
osg::Vec3d up = ellipsoid->computeLocalUpVector(x, y, z );
up.normalize();
osg::Vec3d world(x, y, z);
double segOffset = 50000;
osg::Vec3d start = world + (up * segOffset);
osg::Vec3d end = world - (up * segOffset);
osgUtil::LineSegmentIntersector* i = new osgUtil::LineSegmentIntersector( start, end );
osgUtil::IntersectionVisitor iv;
iv.setIntersector( i );
terrain->accept( iv );
osgUtil::LineSegmentIntersector::Intersections& results = i->getIntersections();
if ( !results.empty() )
{
const osgUtil::LineSegmentIntersector::Intersection& result = *results.begin();
osg::Vec3d hit = result.getWorldIntersectPoint();
double lat, lon, height;
ellipsoid->convertXYZToLatLongHeight(hit.x(), hit.y(), hit.z(),
lat, lon, height);
position.z() = height;
//OE_NOTICE << "Got hit, setting new height to " << height << std::endl;
_maxLevel = tileKey.getLevelOfDetail();
_locator->getLocator()->setPosition( position );
}
}
}
}
示例3: updateSamples
void
PolyhedralLineOfSightNode::terrainChanged(const osgEarth::TileKey& tileKey,
osg::Node* patch)
{
if ( tileKey.getExtent().intersects(_extent) )
{
updateSamples();
}
}
示例4: lock
bool
MemCache::isCached(const osgEarth::TileKey& key, const CacheSpec& spec) const
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock( const_cast<MemCache*>(this)->_mutex);
std::string id = key.str() + spec.cacheId();
return _keyToIterMap.find(id) != _keyToIterMap.end();
//osg::ref_ptr<osg::Image> image = getImage(key,spec);
//return image.valid();
}
示例5:
bool
TileSource::hasData(const osgEarth::TileKey& key) const
{
//If no data extents are provided, just return true
if (_dataExtents.size() == 0) return true;
const osgEarth::GeoExtent& keyExtent = key.getExtent();
bool intersectsData = false;
for (DataExtentList::const_iterator itr = _dataExtents.begin(); itr != _dataExtents.end(); ++itr)
{
if (keyExtent.intersects( *itr ) && key.getLevelOfDetail() >= itr->getMinLevel() && key.getLevelOfDetail() <= itr->getMaxLevel())
{
intersectsData = true;
break;
}
}
return intersectsData;
}
示例6: getProfile
bool
TileSource::hasData(const osgEarth::TileKey& key) const
{
//sematics: "might have data"
if ( !key.valid() )
return false;
// If no data extents are provided, and there's no data level override,
// return true because there might be data but there's no way to tell.
if (_dataExtents.size() == 0 && !_options.maxDataLevel().isSet())
{
return true;
}
unsigned int lod = key.getLevelOfDetail();
// Remap the lod to an appropriate lod if it's not in the same SRS
if (!key.getProfile()->isHorizEquivalentTo( getProfile() ) )
{
lod = getProfile()->getEquivalentLOD( key.getProfile(), key.getLevelOfDetail() );
}
// If there's an explicit LOD override and we've exceeded it, no data.
if (_options.maxDataLevel().isSet() && lod > _options.maxDataLevel().value())
{
return false;
}
// If there are no extents to check, there might be data.
if (_dataExtents.size() == 0)
{
return true;
}
bool intersectsData = false;
const osgEarth::GeoExtent& keyExtent = key.getExtent();
for (DataExtentList::const_iterator itr = _dataExtents.begin(); itr != _dataExtents.end(); ++itr)
{
if ((keyExtent.intersects( *itr )) &&
(!itr->minLevel().isSet() || itr->minLevel() <= lod ) &&
(!itr->maxLevel().isSet() || itr->maxLevel() >= lod ))
{
intersectsData = true;
break;
}
}
return intersectsData;
}
示例7: if
bool
TileSource::getBestAvailableTileKey(const osgEarth::TileKey& key,
osgEarth::TileKey& output) const
{
// trivial reject
if ( !key.valid() )
return false;
// trivial accept: no data extents = not enough info.
if (_dataExtents.size() == 0)
{
output = key;
return true;
}
// trivial reject: key doesn't intersect the union of data extents at all.
if ( !getDataExtentsUnion().intersects(key.getExtent()) )
{
return false;
}
bool intersects = false;
unsigned highestLOD = 0;
// We must use the equivalent lod b/c the key can be in any profile.
int layerLOD = getProfile()->getEquivalentLOD( key.getProfile(), key.getLOD() );
for (DataExtentList::const_iterator itr = _dataExtents.begin(); itr != _dataExtents.end(); ++itr)
{
// check for 2D intersection:
if (key.getExtent().intersects( *itr ))
{
// check that the extent isn't higher-resolution than our key:
if ( !itr->minLevel().isSet() || layerLOD >= itr->minLevel().get() )
{
// Got an intersetion; now test the LODs:
intersects = true;
// Is the high-LOD set? If not, there's not enough information
// so just assume our key might be good.
if ( itr->maxLevel().isSet() == false )
{
output = key;
return true;
}
// Is our key at a lower or equal LOD than the max key in this extent?
// If so, our key is good.
else if ( layerLOD <= itr->maxLevel().get() )
{
output = key;
return true;
}
// otherwise, record the highest encountered LOD that
// intersects our key.
else if ( itr->maxLevel().get() > highestLOD )
{
highestLOD = itr->maxLevel().get();
}
}
}
}
if ( intersects )
{
output = key.createAncestorKey( highestLOD );
return true;
}
else
{
return false;
}
}