本文整理汇总了C++中GeometryCompiler::options方法的典型用法代码示例。如果您正苦于以下问题:C++ GeometryCompiler::options方法的具体用法?C++ GeometryCompiler::options怎么用?C++ GeometryCompiler::options使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类GeometryCompiler
的用法示例。
在下文中一共展示了GeometryCompiler::options方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ts
osg::Node*
MGRSGraticule::buildSQIDTiles( const std::string& gzd )
{
const GeoExtent& extent = _gzd[gzd];
// parse the GZD into its components:
unsigned zone;
char letter;
sscanf( gzd.c_str(), "%u%c", &zone, &letter );
TextSymbol* textSym = _options->secondaryStyle()->get<TextSymbol>();
if ( !textSym )
textSym = _options->primaryStyle()->getOrCreate<TextSymbol>();
AltitudeSymbol* alt = _options->secondaryStyle()->get<AltitudeSymbol>();
double h = 0.0;
TextSymbolizer ts( textSym );
MGRSFormatter mgrs(MGRSFormatter::PRECISION_100000M);
osg::Geode* textGeode = new osg::Geode();
textGeode->getOrCreateStateSet()->setRenderBinDetails( 9999, "DepthSortedBin" );
textGeode->getOrCreateStateSet()->setAttributeAndModes( _depthAttribute, 1 );
const SpatialReference* ecefSRS = extent.getSRS()->getECEF();
osg::Vec3d centerMap, centerECEF;
extent.getCentroid(centerMap.x(), centerMap.y());
extent.getSRS()->transform(centerMap, ecefSRS, centerECEF);
//extent.getSRS()->transformToECEF(centerMap, centerECEF);
osg::Matrix local2world;
ecefSRS->createLocalToWorld( centerECEF, local2world ); //= ECEF::createLocalToWorld(centerECEF);
osg::Matrix world2local;
world2local.invert(local2world);
FeatureList features;
std::vector<GeoExtent> sqidExtents;
// UTM:
if ( letter > 'B' && letter < 'Y' )
{
// grab the SRS for the current UTM zone:
// TODO: AL/AA designation??
const SpatialReference* utm = SpatialReference::create(
Stringify() << "+proj=utm +zone=" << zone << " +north +units=m" );
// transform the four corners of the tile to UTM.
osg::Vec3d gzdUtmSW, gzdUtmSE, gzdUtmNW, gzdUtmNE;
extent.getSRS()->transform( osg::Vec3d(extent.xMin(),extent.yMin(),h), utm, gzdUtmSW );
extent.getSRS()->transform( osg::Vec3d(extent.xMin(),extent.yMax(),h), utm, gzdUtmNW );
extent.getSRS()->transform( osg::Vec3d(extent.xMax(),extent.yMin(),h), utm, gzdUtmSE );
extent.getSRS()->transform( osg::Vec3d(extent.xMax(),extent.yMax(),h), utm, gzdUtmNE );
// find the southern boundary of the first full SQID tile in the GZD tile.
double southSQIDBoundary = gzdUtmSW.y(); //extentUTM.yMin();
double remainder = fmod( southSQIDBoundary, 100000.0 );
if ( remainder > 0.0 )
southSQIDBoundary += (100000.0 - remainder);
// find the min/max X for this cell in UTM:
double xmin = extent.yMin() >= 0.0 ? gzdUtmSW.x() : gzdUtmNW.x();
double xmax = extent.yMin() >= 0.0 ? gzdUtmSE.x() : gzdUtmNE.x();
// Record the UTM extent of each SQID cell in this tile.
// Go from the south boundary northwards:
for( double y = southSQIDBoundary; y < gzdUtmNW.y(); y += 100000.0 )
{
// start at the central meridian (500K) and go west:
for( double x = 500000.0; x > xmin; x -= 100000.0 )
{
sqidExtents.push_back( GeoExtent(utm, x-100000.0, y, x, y+100000.0) );
}
// then start at the central meridian and go east:
for( double x = 500000.0; x < xmax; x += 100000.0 )
{
sqidExtents.push_back( GeoExtent(utm, x, y, x+100000.0, y+100000.0) );
}
}
for( std::vector<GeoExtent>::iterator i = sqidExtents.begin(); i != sqidExtents.end(); ++i )
{
GeoExtent utmEx = *i;
// now, clamp each of the points in the UTM SQID extent to the map-space
// boundaries of the GZD tile. (We only need to clamp in the X dimension,
// Y geometry is allowed to overflow.) Also, skip NE, we don't need it.
double r, xlimit;
osg::Vec3d sw(utmEx.xMin(), utmEx.yMin(), 0);
r = (sw.y()-gzdUtmSW.y())/(gzdUtmNW.y()-gzdUtmSW.y());
xlimit = gzdUtmSW.x() + r * (gzdUtmNW.x() - gzdUtmSW.x());
if ( sw.x() < xlimit ) sw.x() = xlimit;
osg::Vec3d nw(utmEx.xMin(), utmEx.yMax(), 0);
r = (nw.y()-gzdUtmSW.y())/(gzdUtmNW.y()-gzdUtmSW.y());
xlimit = gzdUtmSW.x() + r * (gzdUtmNW.x() - gzdUtmSW.x());
if ( nw.x() < xlimit ) nw.x() = xlimit;
osg::Vec3d se(utmEx.xMax(), utmEx.yMin(), 0);
//.........这里部分代码省略.........
示例2: context
osg::Node*
UTMGraticule::buildGZDTile( const std::string& name, const GeoExtent& extent )
{
osg::Group* group = new osg::Group();
Style lineStyle;
lineStyle.add( _options->primaryStyle()->get<LineSymbol>() );
lineStyle.add( _options->primaryStyle()->get<AltitudeSymbol>() );
//const Style& lineStyle = *_options->lineStyle();
//Style textStyle = *_options->textStyle();
bool hasText = _options->primaryStyle()->get<TextSymbol>() != 0L;
GeometryCompiler compiler;
osg::ref_ptr<Session> session = new Session( _mapNode->getMap() );
FilterContext context( session.get(), _featureProfile.get(), extent );
// make sure we get sufficient tessellation:
compiler.options().maxGranularity() = 1.0;
FeatureList features;
// longitudinal line:
LineString* lon = new LineString(2);
lon->push_back( osg::Vec3d(extent.xMin(), extent.yMax(), 0) );
lon->push_back( osg::Vec3d(extent.xMin(), extent.yMin(), 0) );
Feature* lonFeature = new Feature(lon, extent.getSRS());
lonFeature->geoInterp() = GEOINTERP_GREAT_CIRCLE;
features.push_back( lonFeature );
// latitudinal line:
LineString* lat = new LineString(2);
lat->push_back( osg::Vec3d(extent.xMin(), extent.yMin(), 0) );
lat->push_back( osg::Vec3d(extent.xMax(), extent.yMin(), 0) );
Feature* latFeature = new Feature(lat, extent.getSRS());
latFeature->geoInterp() = GEOINTERP_RHUMB_LINE;
features.push_back( latFeature );
// top lat line at 84N
if ( extent.yMax() == 84.0 )
{
LineString* lat = new LineString(2);
lat->push_back( osg::Vec3d(extent.xMin(), extent.yMax(), 0) );
lat->push_back( osg::Vec3d(extent.xMax(), extent.yMax(), 0) );
Feature* latFeature = new Feature(lat, extent.getSRS());
latFeature->geoInterp() = GEOINTERP_RHUMB_LINE;
features.push_back( latFeature );
}
osg::Node* geomNode = compiler.compile(features, lineStyle, context);
if ( geomNode )
group->addChild( geomNode );
// get the geocentric tile center:
osg::Vec3d tileCenter;
extent.getCentroid( tileCenter.x(), tileCenter.y() );
osg::Vec3d centerECEF;
extent.getSRS()->transformToECEF( tileCenter, centerECEF );
if ( hasText )
{
osg::Vec3d west, east;
extent.getSRS()->transformToECEF(osg::Vec3d(extent.xMin(),tileCenter.y(),0), west );
extent.getSRS()->transformToECEF(osg::Vec3d(extent.xMax(),tileCenter.y(),0), east );
TextSymbol* textSym = _options->primaryStyle()->getOrCreate<TextSymbol>();
textSym->size() = (west-east).length() / 3.0;
TextSymbolizer ts( textSym );
osg::Geode* textGeode = new osg::Geode();
textGeode->getOrCreateStateSet()->setRenderBinDetails( 9998, "DepthSortedBin" );
textGeode->getOrCreateStateSet()->setAttributeAndModes( _depthAttribute, 1 );
osg::Drawable* d = ts.create(name);
d->getOrCreateStateSet()->setRenderBinToInherit();
textGeode->addDrawable(d);
osg::MatrixTransform* mt = new osg::MatrixTransform(ECEF::createLocalToWorld(centerECEF));
mt->addChild(textGeode);
group->addChild(mt);
}
group = buildGZDChildren( group, name );
group = ClusterCullingFactory::createAndInstall( group, centerECEF )->asGroup();
return group;
}
示例3: context
osg::Group*
UTMData::buildGZDTile(const std::string& name, const GeoExtent& extent, const Style& style, const FeatureProfile* featureProfile, const Map* map)
{
osg::Group* group = new osg::Group();
Style lineStyle;
lineStyle.add( const_cast<LineSymbol*>(style.get<LineSymbol>()) );
lineStyle.add( const_cast<AltitudeSymbol*>(style.get<AltitudeSymbol>()) );
bool hasText = style.get<TextSymbol>() != 0L;
GeometryCompiler compiler;
osg::ref_ptr<Session> session = new Session(map);
FilterContext context( session.get(), featureProfile, extent );
// make sure we get sufficient tessellation:
compiler.options().maxGranularity() = 1.0;
FeatureList features;
// longitudinal line:
LineString* lon = new LineString(2);
lon->push_back( osg::Vec3d(extent.xMin(), extent.yMax(), 0) );
lon->push_back( osg::Vec3d(extent.xMin(), extent.yMin(), 0) );
Feature* lonFeature = new Feature(lon, extent.getSRS());
lonFeature->geoInterp() = GEOINTERP_GREAT_CIRCLE;
features.push_back( lonFeature );
// latitudinal line:
LineString* lat = new LineString(2);
lat->push_back( osg::Vec3d(extent.xMin(), extent.yMin(), 0) );
lat->push_back( osg::Vec3d(extent.xMax(), extent.yMin(), 0) );
Feature* latFeature = new Feature(lat, extent.getSRS());
latFeature->geoInterp() = GEOINTERP_RHUMB_LINE;
features.push_back( latFeature );
// top lat line at 84N
if ( extent.yMax() == 84.0 )
{
LineString* lat = new LineString(2);
lat->push_back( osg::Vec3d(extent.xMin(), extent.yMax(), 0) );
lat->push_back( osg::Vec3d(extent.xMax(), extent.yMax(), 0) );
Feature* latFeature = new Feature(lat, extent.getSRS());
latFeature->geoInterp() = GEOINTERP_RHUMB_LINE;
features.push_back( latFeature );
}
osg::Node* geomNode = compiler.compile(features, lineStyle, context);
if ( geomNode )
group->addChild( geomNode );
// get the geocentric tile center:
osg::Vec3d tileCenter;
extent.getCentroid( tileCenter.x(), tileCenter.y() );
const SpatialReference* ecefSRS = extent.getSRS()->getGeocentricSRS();
osg::Vec3d centerECEF;
extent.getSRS()->transform( tileCenter, ecefSRS, centerECEF );
if ( hasText )
{
osg::Vec3d west, east;
extent.getSRS()->transform( osg::Vec3d(extent.xMin(),tileCenter.y(),0), ecefSRS, west );
extent.getSRS()->transform( osg::Vec3d(extent.xMax(),tileCenter.y(),0), ecefSRS, east );
const TextSymbol* textSym_in = style.get<TextSymbol>();
osg::ref_ptr<TextSymbol> textSym = textSym_in ? new TextSymbol(*textSym_in) : new TextSymbol();
textSym->size() = (west-east).length() / 3.0;
TextSymbolizer ts(textSym.get());
osg::Geode* textGeode = new osg::Geode();
osg::Drawable* d = ts.create(name);
d->getOrCreateStateSet()->setRenderBinToInherit();
textGeode->addDrawable(d);
Registry::shaderGenerator().run(textGeode, Registry::stateSetCache());
osg::Matrixd centerL2W;
ecefSRS->createLocalToWorld( centerECEF, centerL2W );
osg::MatrixTransform* mt = new osg::MatrixTransform(centerL2W);
mt->addChild(textGeode);
group->addChild(mt);
}
//group = buildGZDChildren( group, name );
group = ClusterCullingFactory::createAndInstall( group, centerECEF )->asGroup();
return group;
}
示例4: s_llf
osg::Node*
GeodeticGraticule::buildTile( const TileKey& key, Map* map ) const
{
if ( _options->levels().size() <= key.getLevelOfDetail() )
{
OE_WARN << LC << "Tried to create cell at non-existant level " << key.getLevelOfDetail() << std::endl;
return 0L;
}
const GeodeticGraticuleOptions::Level& level = _options->levels()[key.getLevelOfDetail()]; //_levels[key.getLevelOfDetail()];
// the "-2" here is because normal tile paging gives you one subdivision already,
// so we only need to account for > 1 subdivision factor.
unsigned cellsPerTile = level._subdivisionFactor <= 2u ? 1u : 1u << (level._subdivisionFactor-2u);
unsigned cellsPerTileX = std::max(1u, cellsPerTile);
unsigned cellsPerTileY = std::max(1u, cellsPerTile);
GeoExtent tileExtent = key.getExtent();
FeatureList latLines;
FeatureList lonLines;
static LatLongFormatter s_llf(LatLongFormatter::FORMAT_DECIMAL_DEGREES);
double cellWidth = tileExtent.width() / cellsPerTileX;
double cellHeight = tileExtent.height() / cellsPerTileY;
const Style& lineStyle = level._lineStyle.isSet() ? *level._lineStyle : *_options->lineStyle();
const Style& textStyle = level._textStyle.isSet() ? *level._textStyle : *_options->textStyle();
bool hasText = textStyle.get<TextSymbol>() != 0L;
osg::ref_ptr<osg::Group> labels;
if ( hasText )
{
labels = new osg::Group();
//TODO: This is a bug, if you don't turn on decluttering the text labels are giant. Need to determine what is wrong with LabelNodes without decluttering.
Decluttering::setEnabled( labels->getOrCreateStateSet(), true );
}
// spatial ref for features:
const SpatialReference* geoSRS = tileExtent.getSRS()->getGeographicSRS();
// longitude lines
for( unsigned cx = 0; cx < cellsPerTileX; ++cx )
{
double clon = tileExtent.xMin() + cellWidth * (double)cx;
LineString* lon = new LineString(2);
lon->push_back( osg::Vec3d(clon, tileExtent.yMin(), 0) );
lon->push_back( osg::Vec3d(clon, tileExtent.yMax(), 0) );
lonLines.push_back( new Feature(lon, geoSRS) );
if ( hasText )
{
for( unsigned cy = 0; cy < cellsPerTileY; ++cy )
{
double clat = tileExtent.yMin() + (0.5*cellHeight) + cellHeight*(double)cy;
LabelNode* label = new LabelNode(
_mapNode.get(),
GeoPoint(geoSRS, clon, clat),
s_llf.format(clon),
textStyle );
labels->addChild( label );
}
}
}
// latitude lines
for( unsigned cy = 0; cy < cellsPerTileY; ++cy )
{
double clat = tileExtent.yMin() + cellHeight * (double)cy;
if ( clat == key.getProfile()->getExtent().yMin() )
continue;
LineString* lat = new LineString(2);
lat->push_back( osg::Vec3d(tileExtent.xMin(), clat, 0) );
lat->push_back( osg::Vec3d(tileExtent.xMax(), clat, 0) );
latLines.push_back( new Feature(lat, geoSRS) );
if ( hasText )
{
for( unsigned cx = 0; cx < cellsPerTileX; ++cx )
{
double clon = tileExtent.xMin() + (0.5*cellWidth) + cellWidth*(double)cy;
LabelNode* label = new LabelNode(
_mapNode.get(),
GeoPoint(geoSRS, clon, clat),
s_llf.format(clat),
textStyle );
labels->addChild( label );
}
}
}
osg::Group* group = new osg::Group();
GeometryCompiler compiler;
osg::ref_ptr<Session> session = new Session( map );
//.........这里部分代码省略.........