本文整理汇总了C++中TileKey::getExtent方法的典型用法代码示例。如果您正苦于以下问题:C++ TileKey::getExtent方法的具体用法?C++ TileKey::getExtent怎么用?C++ TileKey::getExtent使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类TileKey
的用法示例。
在下文中一共展示了TileKey::getExtent方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: lock
GeoImage
ElevationProxyImageLayer::createImage(const TileKey& key, ProgressCallback* progress)
{
if ( _mapf.needsSync() )
{
Threading::ScopedMutexLock lock(_mapfMutex);
if ( _mapf.needsSync() )
{
_mapf.sync();
}
}
osg::ref_ptr<osg::HeightField> hf = HeightFieldUtils::createReferenceHeightField(key.getExtent(), 257,257, true );
if ( _mapf.populateHeightField(hf, key, true, 0L) )
{
// encode the heightfield as a 16-bit normalized LUNIMANCE image
osg::Image* image = new osg::Image();
image->allocateImage(hf->getNumColumns(), hf->getNumRows(), 1, GL_LUMINANCE, GL_UNSIGNED_SHORT);
image->setInternalTextureFormat( GL_LUMINANCE16 );
const osg::FloatArray* floats = hf->getFloatArray();
for( unsigned int i = 0; i < floats->size(); ++i )
{
int col = i % hf->getNumColumns();
int row = i / hf->getNumColumns();
*(unsigned short*)image->data( col, row ) = (unsigned short)(32768 + (short)floats->at(i));
}
return GeoImage( image, key.getExtent() );
}
else
{
return GeoImage::INVALID;
}
}
示例2: sharedLock
void
OSGTileFactory::addPlaceholderHeightfieldLayer(StreamingTile* tile,
StreamingTile* ancestorTile,
GeoLocator* defaultLocator,
const TileKey& key,
const TileKey& ancestorKey)
{
osgTerrain::HeightFieldLayer* newHFLayer = 0L;
if ( ancestorTile && ancestorKey.valid() )
{
osg::ref_ptr<osgTerrain::HeightFieldLayer> ancestorLayer;
{
Threading::ScopedReadLock sharedLock( ancestorTile->getTileLayersMutex() );
ancestorLayer = dynamic_cast<osgTerrain::HeightFieldLayer*>(ancestorTile->getElevationLayer());
}
if ( ancestorLayer.valid() )
{
osg::ref_ptr<osg::HeightField> ancestorHF = ancestorLayer->getHeightField();
if ( ancestorHF.valid() )
{
osg::HeightField* newHF = HeightFieldUtils::createSubSample(
ancestorHF.get(),
ancestorKey.getExtent(),
key.getExtent());
newHFLayer = new osgTerrain::HeightFieldLayer( newHF );
newHFLayer->setLocator( defaultLocator );
// lock to set the elevation layerdata:
{
Threading::ScopedWriteLock exclusiveLock( tile->getTileLayersMutex() );
tile->setElevationLayer( newHFLayer );
tile->setElevationLOD( ancestorTile->getElevationLOD() );
}
}
}
}
// lock the tile to write the elevation data.
{
Threading::ScopedWriteLock exclusiveLock( tile->getTileLayersMutex() );
if ( !newHFLayer )
{
newHFLayer = new osgTerrain::HeightFieldLayer();
newHFLayer->setHeightField( createEmptyHeightField( key, 8, 8 ) );
newHFLayer->setLocator( defaultLocator );
tile->setElevationLOD( -1 );
}
if ( newHFLayer )
{
tile->setElevationLayer( newHFLayer );
}
}
}
示例3: reclamp
void Dragger::reclamp( const TileKey& key, osg::Node* tile, const Terrain* terrain )
{
GeoPoint p;
_position.transform( key.getExtent().getSRS(), p );
// first verify that the control position intersects the tile:
if ( key.getExtent().contains( p.x(), p.y() ) )
{
updateTransform( tile );
}
}
示例4: intersects
bool
TileMap::intersectsKey(const TileKey& tilekey)
{
osg::Vec3d keyMin, keyMax;
//double keyMinX, keyMinY, keyMaxX, keyMaxY;
//Check to see if the key overlaps the bounding box using lat/lon. This is necessary to check even in
//Mercator situations in case the BoundingBox is described using lat/lon coordinates such as those produced by GDAL2Tiles
//This should be considered a bug on the TMS production side, but we can work around it for now...
tilekey.getExtent().getBounds(keyMin.x(), keyMin.y(), keyMax.x(), keyMax.y());
//tilekey.getExtent().getBounds(keyMinX, keyMinY, keyMaxX, keyMaxY);
bool inter = intersects(_minX, _minY, _maxX, _maxY, keyMin.x(), keyMin.y(), keyMax.x(), keyMax.y() ); //keyMinX, keyMinY, keyMaxX, keyMaxY);
if (!inter && tilekey.getProfile()->getSRS()->isSphericalMercator())
{
tilekey.getProfile()->getSRS()->transform(keyMin, tilekey.getProfile()->getSRS()->getGeographicSRS(), keyMin );
tilekey.getProfile()->getSRS()->transform(keyMax, tilekey.getProfile()->getSRS()->getGeographicSRS(), keyMax );
inter = intersects(_minX, _minY, _maxX, _maxY, keyMin.x(), keyMin.y(), keyMax.x(), keyMax.y() );
//tilekey.getProfile()->getSRS()->transform2D(keyMinX, keyMinY, tilekey.getProfile()->getSRS()->getGeographicSRS(), keyMinX, keyMinY);
//tilekey.getProfile()->getSRS()->transform2D(keyMaxX, keyMaxY, tilekey.getProfile()->getSRS()->getGeographicSRS(), keyMaxX, keyMaxY);
//inter = intersects(_minX, _minY, _maxX, _maxY, keyMinX, keyMinY, keyMaxX, keyMaxY);
}
return inter;
}
示例5: GeoImage
GeoImage
ElevationProxyImageLayer::createImage(const TileKey& key, ProgressCallback* progress, bool forceFallback)
{
osg::ref_ptr<Map> map = _sourceMap.get();
if ( map.valid() )
{
osg::ref_ptr<osg::HeightField> hf;
if ( map->getHeightField( key, true, hf ) )
{
// encode the heightfield as a 16-bit normalized LUNIMANCE image
osg::Image* image = new osg::Image();
image->allocateImage(hf->getNumColumns(), hf->getNumRows(), 1, GL_LUMINANCE, GL_UNSIGNED_SHORT);
image->setInternalTextureFormat( GL_LUMINANCE16 );
const osg::FloatArray* floats = hf->getFloatArray();
for( unsigned int i = 0; i < floats->size(); ++i )
{
int col = i % hf->getNumColumns();
int row = i / hf->getNumColumns();
*(unsigned short*)image->data( col, row ) = (unsigned short)(32768 + (short)floats->at(i));
}
return GeoImage( image, key.getExtent() );
}
}
return GeoImage::INVALID;
}
示例6: addChild
SurfaceNode::SurfaceNode(const TileKey& tilekey,
const MapInfo& mapinfo,
const RenderBindings& bindings,
TileDrawable* drawable)
{
_tileKey = tilekey;
_drawable = drawable;
_surfaceGeode = new osg::Geode();
_surfaceGeode->addDrawable( drawable );
// Create the final node.
addChild( _surfaceGeode.get() );
// Establish a local reference frame for the tile:
GeoPoint centroid;
tilekey.getExtent().getCentroid(centroid);
osg::Matrix local2world;
centroid.createLocalToWorld( local2world );
setMatrix( local2world );
_matrix = new osg::RefMatrix( local2world );
// Initialize the cached bounding box.
setElevationRaster( 0L, osg::Matrixf::identity() );
}
示例7: addChild
SurfaceNode::SurfaceNode(const TileKey& tilekey,
const MapInfo& mapinfo,
const RenderBindings& bindings,
TileDrawable* drawable)
: _debugNodeVisible(false)
{
_tileKey = tilekey;
_drawable = drawable;
_surfaceGeode = new osg::Geode();
_surfaceGeode->addDrawable( drawable );
// Create the final node.
addChild( _surfaceGeode.get() );
// Establish a local reference frame for the tile:
osg::Vec3d centerWorld;
GeoPoint centroid;
tilekey.getExtent().getCentroid(centroid);
centroid.toWorld(centerWorld);
osg::Matrix local2world;
centroid.createLocalToWorld( local2world );
setMatrix( local2world );
_worldCorners.resize(8);
_childrenCorners.resize(4);
for(size_t i = 0; i < _childrenCorners.size(); ++i)
{
_childrenCorners[i].resize(8);
}
// Initialize the cached bounding box.
setElevationExtrema(osg::Vec2f(0, 0));
}
示例8:
// This will be called by AnnotationNode when a new terrain tile comes in.
void
FeatureNode::onTileAdded(const TileKey& key,
osg::Node* graph,
TerrainCallbackContext& context)
{
if (!_clampDirty)
{
bool needsClamp;
if (key.valid())
{
osg::Polytope tope;
key.getExtent().createPolytope(tope);
needsClamp = tope.contains(this->getBound());
}
else
{
// without a valid tilekey we don't know the extent of the change,
// so clamping is required.
needsClamp = true;
}
if (needsClamp)
{
_clampDirty = true;
ADJUST_UPDATE_TRAV_COUNT(this, +1);
//clamp(graph, context.getTerrain());
}
}
}
示例9: getBounds
osg::BoundingSphere SimplePager::getBounds(const TileKey& key) const
{
int samples = 6;
GeoExtent extent = key.getExtent();
double xSample = extent.width() / (double)samples;
double ySample = extent.height() / (double)samples;
osg::BoundingSphere bs;
for (int c = 0; c < samples+1; c++)
{
double x = extent.xMin() + (double)c * xSample;
for (int r = 0; r < samples+1; r++)
{
double y = extent.yMin() + (double)r * ySample;
osg::Vec3d world;
GeoPoint samplePoint(extent.getSRS(), x, y, 0, ALTMODE_ABSOLUTE);
GeoPoint wgs84 = samplePoint.transform(osgEarth::SpatialReference::create("epsg:4326"));
wgs84.toWorld(world);
bs.expandBy(world);
}
}
return bs;
}
示例10: assembleImage
GeoImage
ImageLayer::createImageFromTileSource(const TileKey& key,
ProgressCallback* progress)
{
TileSource* source = getTileSource();
if ( !source )
return GeoImage::INVALID;
// If the profiles are different, use a compositing method to assemble the tile.
if ( !key.getProfile()->isHorizEquivalentTo( getProfile() ) )
{
return assembleImage( key, progress );
}
// Good to go, ask the tile source for an image:
osg::ref_ptr<TileSource::ImageOperation> op = getOrCreatePreCacheOp();
// Fail is the image is blacklisted.
if ( source->getBlacklist()->contains(key) )
{
OE_DEBUG << LC << "createImageFromTileSource: blacklisted(" << key.str() << ")" << std::endl;
return GeoImage::INVALID;
}
if (!mayHaveData(key))
{
OE_DEBUG << LC << "createImageFromTileSource: mayHaveData(" << key.str() << ") == false" << std::endl;
return GeoImage::INVALID;
}
//if ( !source->hasData( key ) )
//{
// OE_DEBUG << LC << "createImageFromTileSource: hasData(" << key.str() << ") == false" << std::endl;
// return GeoImage::INVALID;
//}
// create an image from the tile source.
osg::ref_ptr<osg::Image> result = source->createImage( key, op.get(), progress );
// Process images with full alpha to properly support MP blending.
if (result.valid() &&
options().featherPixels() == true)
{
ImageUtils::featherAlphaRegions( result.get() );
}
// If image creation failed (but was not intentionally canceled and
// didn't time out or end for any other recoverable reason), then
// blacklist this tile for future requests.
if (result == 0L)
{
if ( progress == 0L ||
( !progress->isCanceled() && !progress->needsRetry() ) )
{
source->getBlacklist()->add( key );
}
}
return GeoImage(result.get(), key.getExtent());
}
示例11: updateTransforms
void
OrthoNode::reclamp( const TileKey& key, osg::Node* tile, const Terrain* terrain )
{
// first verify that the label position intersects the tile:
if ( key.getExtent().contains( _mapPosition.x(), _mapPosition.y() ) )
{
updateTransforms( _mapPosition, tile );
}
}
示例12: applyBlast
static void applyBlast(GeoPoint& center, double radius, double offset, const TileKey& key, osg::HeightField* heightField)
{
//Get the extents of the tile
double xmin, ymin, xmax, ymax;
key.getExtent().getBounds(xmin, ymin, xmax, ymax);
int tileSize = heightField->getNumColumns();
// Iterate over the output heightfield and sample the data that was read into it.
double dx = (xmax - xmin) / (tileSize-1);
double dy = (ymax - ymin) / (tileSize-1);
const SpatialReference* srs = SpatialReference::create("wgs84");
for (int c = 0; c < tileSize; ++c)
{
double geoX = xmin + (dx * (double)c);
for (int r = 0; r < tileSize; ++r)
{
double geoY = ymin + (dy * (double)r);
GeoPoint geo(srs, geoX, geoY, center.z(), ALTMODE_ABSOLUTE);
double distance = geo.distanceTo( center );
double ratio = distance / radius;
if (ratio <= 1.0)
{
double weight = 1.0 - osg::clampBetween(ratio, 0.0, 1.0);
if (weight > 0)
{
float h = center.z() + offset * weight;
heightField->setHeight(c, r, h);
}
}
/*
if ( boundary->contains2D(geo.x(), geo.y()) )
{
float h = heightField->getHeight( c, r );
if (h == NO_DATA_VALUE)
{
//h = deformation._offset;
}
else
{
//h += deformation._offset;
h = deformation._offset;
}
heightField->setHeight(c, r, h);
}
*/
}
}
}
示例13:
void
GeometryPool::createKeyForTileKey(const TileKey& tileKey,
unsigned size,
const MapInfo& mapInfo,
GeometryPool::GeometryKey& out) const
{
out.lod = tileKey.getLOD();
out.yMin = mapInfo.isGeocentric()? tileKey.getExtent().yMin() : 0.0;
out.size = size;
}
示例14: getProfile
bool
TerrainLayer::isKeyInLegalRange(const TileKey& key) const
{
if ( !key.valid() )
{
return false;
}
// We must use the equivalent lod b/c the input key can be in any profile.
unsigned localLOD = getProfile() ?
getProfile()->getEquivalentLOD(key.getProfile(), key.getLOD()) :
key.getLOD();
// First check the key against the min/max level limits, it they are set.
if ((options().maxLevel().isSet() && localLOD > options().maxLevel().value()) ||
(options().minLevel().isSet() && localLOD < options().minLevel().value()))
{
return false;
}
// Next check the maxDataLevel if that is set.
if (options().maxDataLevel().isSet() && localLOD > options().maxDataLevel().get())
{
return false;
}
// Next, check against resolution limits (based on the source tile size).
if (options().minResolution().isSet() || options().maxResolution().isSet())
{
const Profile* profile = getProfile();
if ( profile )
{
// calculate the resolution in the layer's profile, which can
// be different that the key's profile.
double resKey = key.getExtent().width() / (double)getTileSize();
double resLayer = key.getProfile()->getSRS()->transformUnits(resKey, profile->getSRS());
if (options().maxResolution().isSet() &&
options().maxResolution().value() > resLayer)
{
return false;
}
if (options().minResolution().isSet() &&
options().minResolution().value() < resLayer)
{
return false;
}
}
}
return true;
}
示例15: while
bool
ElevationPool::fetchTileFromMap(const TileKey& key, MapFrame& frame, Tile* tile)
{
tile->_loadTime = osg::Timer::instance()->tick();
osg::ref_ptr<osg::HeightField> hf = new osg::HeightField();
hf->allocate( _tileSize, _tileSize );
// Initialize the heightfield to nodata
hf->getFloatArray()->assign( hf->getFloatArray()->size(), NO_DATA_VALUE );
TileKey keyToUse = key;
while( !tile->_hf.valid() && keyToUse.valid() )
{
bool ok;
if (_layers.empty())
{
OE_TEST << LC << "Populating from FULL MAP (" << keyToUse.str() << ")\n";
ok = frame.populateHeightField(hf, keyToUse, false /*heightsAsHAE*/, 0L);
}
else
{
OE_TEST << LC << "Populating from layers (" << keyToUse.str() << ")\n";
ok = _layers.populateHeightFieldAndNormalMap(hf.get(), 0L, keyToUse, 0L, INTERP_BILINEAR, 0L);
}
if (ok)
{
tile->_hf = GeoHeightField( hf.get(), keyToUse.getExtent() );
tile->_bounds = keyToUse.getExtent().bounds();
}
else
{
keyToUse = keyToUse.createParentKey();
}
}
return tile->_hf.valid();
}