本文整理汇总了C++中featurelist::iterator类的典型用法代码示例。如果您正苦于以下问题:C++ iterator类的具体用法?C++ iterator怎么用?C++ iterator使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了iterator类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: parts
osg::Geode*
BuildGeometryFilter::processPoints(FeatureList& features, FilterContext& context)
{
osg::Geode* geode = new osg::Geode();
bool makeECEF = false;
const SpatialReference* featureSRS = 0L;
const SpatialReference* mapSRS = 0L;
// set up referencing information:
if ( context.isGeoreferenced() )
{
makeECEF = context.getSession()->getMapInfo().isGeocentric();
featureSRS = context.extent()->getSRS();
mapSRS = context.getSession()->getMapInfo().getProfile()->getSRS();
}
for( FeatureList::iterator f = features.begin(); f != features.end(); ++f )
{
Feature* input = f->get();
GeometryIterator parts( input->getGeometry(), true );
while( parts.hasMore() )
{
Geometry* part = parts.next();
// extract the required point symbol; bail out if not found.
const PointSymbol* point =
input->style().isSet() && input->style()->has<PointSymbol>() ? input->style()->get<PointSymbol>() :
_style.get<PointSymbol>();
if ( !point )
continue;
// resolve the color:
osg::Vec4f primaryColor = point->fill()->color();
osg::ref_ptr<osg::Geometry> osgGeom = new osg::Geometry();
//osgGeom->setUseVertexBufferObjects( true );
//osgGeom->setUseDisplayList( false );
// embed the feature name if requested. Warning: blocks geometry merge optimization!
if ( _featureNameExpr.isSet() )
{
const std::string& name = input->eval( _featureNameExpr.mutable_value(), &context );
osgGeom->setName( name );
}
// build the geometry:
osg::Vec3Array* allPoints = new osg::Vec3Array();
transformAndLocalize( part->asVector(), featureSRS, allPoints, mapSRS, _world2local, makeECEF );
osgGeom->addPrimitiveSet( new osg::DrawArrays(GL_POINTS, 0, allPoints->getNumElements()) );
osgGeom->setVertexArray( allPoints );
if ( input->style().isSet() )
{
//TODO: re-evaluate this. does it hinder geometry merging?
applyPointSymbology( osgGeom->getOrCreateStateSet(), point );
}
// assign the primary color (PER_VERTEX required for later optimization)
osg::Vec4Array* colors = new osg::Vec4Array;
colors->assign( osgGeom->getVertexArray()->getNumElements(), primaryColor );
osgGeom->setColorArray( colors );
osgGeom->setColorBinding( osg::Geometry::BIND_PER_VERTEX );
geode->addDrawable( osgGeom );
// record the geometry's primitive set(s) in the index:
if ( context.featureIndex() )
context.featureIndex()->tagDrawable( osgGeom, input );
// install clamping attributes if necessary
if (_style.has<AltitudeSymbol>() &&
_style.get<AltitudeSymbol>()->technique() == AltitudeSymbol::TECHNIQUE_GPU)
{
Clamping::applyDefaultClampingAttrs( osgGeom, input->getDouble("__oe_verticalOffset", 0.0) );
}
}
}
return geode;
}
开发者ID:makemefriendanshu,项目名称:osgearth,代码行数:85,代码来源:BuildGeometryFilter.cpp
示例2: polygonize
osg::Node*
PolygonizeLinesFilter::push(FeatureList& input, FilterContext& cx)
{
// compute the coordinate localization matrices.
computeLocalizers( cx );
// establish some things
bool makeECEF = false;
const SpatialReference* featureSRS = 0L;
const SpatialReference* mapSRS = 0L;
if ( cx.isGeoreferenced() )
{
makeECEF = cx.getSession()->getMapInfo().isGeocentric();
featureSRS = cx.extent()->getSRS();
mapSRS = cx.getSession()->getMapInfo().getProfile()->getSRS();
}
// The operator we'll use to make lines into polygons.
const LineSymbol* line = _style.get<LineSymbol>();
PolygonizeLinesOperator polygonize( line ? (*line->stroke()) : Stroke() );
// Geode to hold all the geometries.
osg::Geode* geode = new osg::Geode();
// iterate over all features.
for( FeatureList::iterator i = input.begin(); i != input.end(); ++i )
{
Feature* f = i->get();
// iterate over all the feature's geometry parts. We will treat
// them as lines strings.
GeometryIterator parts( f->getGeometry(), false );
while( parts.hasMore() )
{
Geometry* part = parts.next();
// skip empty geometry
if ( part->size() == 0 )
continue;
// transform the geometry into the target SRS and localize it about
// a local reference point.
osg::Vec3Array* verts = new osg::Vec3Array();
osg::Vec3Array* normals = new osg::Vec3Array();
transformAndLocalize( part->asVector(), featureSRS, verts, normals, mapSRS, _world2local, makeECEF );
// turn the lines into polygons.
osg::Geometry* geom = polygonize( verts, normals );
geode->addDrawable( geom );
// record the geometry's primitive set(s) in the index:
if ( cx.featureIndex() )
cx.featureIndex()->tagPrimitiveSets( geom, f );
}
}
// attempt to combine geometries for better performance
MeshConsolidator::run( *geode );
// GPU performance optimization:
VertexCacheOptimizer vco;
geode->accept( vco );
// If we're auto-scaling, we need a shader
float minPixels = line ? line->stroke()->minPixels().getOrUse( 0.0f ) : 0.0f;
if ( minPixels > 0.0f )
{
osg::StateSet* stateSet = geode->getOrCreateStateSet();
VirtualProgram* vp = VirtualProgram::getOrCreate(stateSet);
vp->setName( "osgEarth::PolygonizeLines" );
const char* vs =
"#version " GLSL_VERSION_STR "\n"
GLSL_DEFAULT_PRECISION_FLOAT "\n"
"attribute vec3 oe_polyline_center; \n"
"uniform float oe_polyline_scale; \n"
"uniform float oe_polyline_min_pixels; \n"
"uniform mat3 oe_WindowScaleMatrix; \n"
"void oe_polyline_scalelines(inout vec4 VertexMODEL) \n"
"{ \n"
" if ( oe_polyline_scale != 1.0 || oe_polyline_min_pixels > 0.0 ) \n"
" { \n"
" vec4 center_model = vec4(oe_polyline_center*VertexMODEL.w, VertexMODEL.w); \n"
" vec4 vector_model = VertexMODEL - center_model; \n"
" if ( length(vector_model.xyz) > 0.0 ) \n"
" { \n"
" float scale = oe_polyline_scale; \n"
" vec4 vertex_clip = gl_ModelViewProjectionMatrix * VertexMODEL; \n"
" vec4 center_clip = gl_ModelViewProjectionMatrix * center_model; \n"
" vec4 vector_clip = vertex_clip - center_clip; \n"
" if ( oe_polyline_min_pixels > 0.0 ) \n"
" { \n"
" vec3 vector_win = oe_WindowScaleMatrix * (vertex_clip.xyz/vertex_clip.w - center_clip.xyz/center_clip.w); \n"
" float min_scale = max( (0.5*oe_polyline_min_pixels)/length(vector_win.xy), 1.0 ); \n"
" scale = max( scale, min_scale ); \n"
//.........这里部分代码省略.........
开发者ID:jy4618272,项目名称:osgearth,代码行数:101,代码来源:PolygonizeLines.cpp
示例3: Point
FilterContext
BuildGeometryFilter::push( FeatureList& input, const FilterContext& context )
{
reset();
OE_DEBUG << LC
<< context.toString() << std::endl;
bool ok = true;
for( FeatureList::iterator i = input.begin(); i != input.end(); i++ )
if ( !push( i->get(), context ) )
ok = false;
// In a feature class with one point-per-feature, you end up with one geometry per point,
// which results is (a) very bad performance and (b) geometries with a zero bbox that therefore
// don't draw. This is not a total solution (won't work for a single point, isn't friendly for
// doing feature-selection, etc.) but is a workable temporary fix. In the future we're going
// to replace this filter anyway with something more highly optimized (a la osgGIS).
//
// however...seems that MERGE_GEOMETRY destroys almost everything except for points!!
if ( _mergeGeometry == true )
{
osgUtil::Optimizer optimizer;
optimizer.optimize( _geode.get(), osgUtil::Optimizer::MERGE_GEOMETRY );
}
if ( ok )
{
if ( !_style.empty() && _geode.valid() )
{
// could optimize this to only happen is lines or points were created ..
const LineSymbol* lineSymbol = _style.getSymbol<LineSymbol>();
float size = 1.0;
if (lineSymbol)
size = lineSymbol->stroke()->width().value();
_geode->getOrCreateStateSet()->setAttribute( new osg::Point(size), osg::StateAttribute::ON );
_geode->getOrCreateStateSet()->setAttribute( new osg::LineWidth(size), osg::StateAttribute::ON );
const PointSymbol* pointSymbol = _style.getSymbol<PointSymbol>();
if ( pointSymbol && pointSymbol->size().isSet() )
_geode->getOrCreateStateSet()->setAttribute(
new osg::Point( *pointSymbol->size() ), osg::StateAttribute::ON );
}
_result = _geode.release();
if ( context.hasReferenceFrame() )
{
osg::MatrixTransform* delocalizer = new osg::MatrixTransform( context.inverseReferenceFrame() );
delocalizer->addChild( _result.get() );
_result = delocalizer;
}
}
else
{
_result = 0L;
}
FilterContext outCx( context );
outCx.setReferenceFrame( osg::Matrixd::identity() ); // clear the ref frame.
return outCx;
}
开发者ID:korash,项目名称:osgearth,代码行数:63,代码来源:BuildGeometryFilter.cpp
示例4: temp
osg::Geode*
BuildGeometryFilter::processLines(FeatureList& features, FilterContext& context)
{
osg::Geode* geode = new osg::Geode();
bool makeECEF = false;
const SpatialReference* featureSRS = 0L;
const SpatialReference* mapSRS = 0L;
// set up referencing information:
if ( context.isGeoreferenced() )
{
makeECEF = context.getSession()->getMapInfo().isGeocentric();
featureSRS = context.extent()->getSRS();
mapSRS = context.getSession()->getMapInfo().getProfile()->getSRS();
}
for( FeatureList::iterator f = features.begin(); f != features.end(); ++f )
{
Feature* input = f->get();
// extract the required line symbol; bail out if not found.
const LineSymbol* line =
input->style().isSet() && input->style()->has<LineSymbol>() ? input->style()->get<LineSymbol>() :
_style.get<LineSymbol>();
if ( !line )
continue;
// run a symbol script if present.
if ( line->script().isSet() )
{
StringExpression temp( line->script().get() );
input->eval( temp, &context );
}
GeometryIterator parts( input->getGeometry(), true );
while( parts.hasMore() )
{
Geometry* part = parts.next();
// skip invalid geometry for lines.
if ( part->size() < 2 )
continue;
// if the underlying geometry is a ring (or a polygon), use a line loop; otherwise
// use a line strip.
GLenum primMode = dynamic_cast<Ring*>(part) ? GL_LINE_LOOP : GL_LINE_STRIP;
// resolve the color:
osg::Vec4f primaryColor = line->stroke()->color();
osg::ref_ptr<osg::Geometry> osgGeom = new osg::Geometry();
//osgGeom->setUseVertexBufferObjects( true );
//osgGeom->setUseDisplayList( false );
// embed the feature name if requested. Warning: blocks geometry merge optimization!
if ( _featureNameExpr.isSet() )
{
const std::string& name = input->eval( _featureNameExpr.mutable_value(), &context );
osgGeom->setName( name );
}
// build the geometry:
osg::Vec3Array* allPoints = new osg::Vec3Array();
transformAndLocalize( part->asVector(), featureSRS, allPoints, mapSRS, _world2local, makeECEF );
osgGeom->addPrimitiveSet( new osg::DrawArrays(primMode, 0, allPoints->getNumElements()) );
osgGeom->setVertexArray( allPoints );
if ( input->style().isSet() )
{
//TODO: re-evaluate this. does it hinder geometry merging?
applyLineSymbology( osgGeom->getOrCreateStateSet(), line );
}
// subdivide the mesh if necessary to conform to an ECEF globe;
// but if the tessellation is set to zero, or if the style specifies a
// tessellation size, skip this step.
if ( makeECEF && !line->tessellation().isSetTo(0) && !line->tessellationSize().isSet() )
{
double threshold = osg::DegreesToRadians( *_maxAngle_deg );
OE_DEBUG << "Running mesh subdivider with threshold " << *_maxAngle_deg << std::endl;
MeshSubdivider ms( _world2local, _local2world );
//ms.setMaxElementsPerEBO( INT_MAX );
if ( input->geoInterp().isSet() )
ms.run( *osgGeom, threshold, *input->geoInterp() );
else
ms.run( *osgGeom, threshold, *_geoInterp );
}
// assign the primary color (PER_VERTEX required for later optimization)
osg::Vec4Array* colors = new osg::Vec4Array;
colors->assign( osgGeom->getVertexArray()->getNumElements(), primaryColor );
osgGeom->setColorArray( colors );
osgGeom->setColorBinding( osg::Geometry::BIND_PER_VERTEX );
geode->addDrawable( osgGeom );
//.........这里部分代码省略.........
开发者ID:makemefriendanshu,项目名称:osgearth,代码行数:101,代码来源:BuildGeometryFilter.cpp
示例5: temp
void
AltitudeFilter::pushAndDontClamp( FeatureList& features, FilterContext& cx )
{
NumericExpression scaleExpr;
if ( _altitude.valid() && _altitude->verticalScale().isSet() )
scaleExpr = *_altitude->verticalScale();
NumericExpression offsetExpr;
if ( _altitude.valid() && _altitude->verticalOffset().isSet() )
offsetExpr = *_altitude->verticalOffset();
bool gpuClamping =
_altitude.valid() &&
_altitude->technique() == _altitude->TECHNIQUE_GPU;
for( FeatureList::iterator i = features.begin(); i != features.end(); ++i )
{
Feature* feature = i->get();
// run a symbol script if present.
if ( _altitude.valid() && _altitude->script().isSet() )
{
StringExpression temp( _altitude->script().get() );
feature->eval( temp, &cx );
}
double minHAT = DBL_MAX;
double maxHAT = -DBL_MAX;
double scaleZ = 1.0;
if ( _altitude.valid() && _altitude->verticalScale().isSet() )
scaleZ = feature->eval( scaleExpr, &cx );
double offsetZ = 0.0;
if ( _altitude.valid() && _altitude->verticalOffset().isSet() )
offsetZ = feature->eval( offsetExpr, &cx );
GeometryIterator gi( feature->getGeometry() );
while( gi.hasMore() )
{
Geometry* geom = gi.next();
for( Geometry::iterator g = geom->begin(); g != geom->end(); ++g )
{
if ( !gpuClamping )
{
g->z() *= scaleZ;
g->z() += offsetZ;
}
if ( g->z() < minHAT )
minHAT = g->z();
if ( g->z() > maxHAT )
maxHAT = g->z();
}
}
if ( minHAT != DBL_MAX )
{
feature->set( "__min_hat", minHAT );
feature->set( "__max_hat", maxHAT );
}
// encode the Z offset if
if ( gpuClamping )
{
feature->set("__oe_verticalScale", scaleZ);
feature->set("__oe_verticalOffset", offsetZ);
}
}
}
开发者ID:3dcl,项目名称:osgearth,代码行数:70,代码来源:AltitudeFilter.cpp
示例6: parts
bool
BuildGeometryFilter::process( FeatureList& features, const FilterContext& context )
{
bool makeECEF = false;
const SpatialReference* featureSRS = 0L;
const SpatialReference* mapSRS = 0L;
if ( context.isGeoreferenced() )
{
makeECEF = context.getSession()->getMapInfo().isGeocentric();
featureSRS = context.extent()->getSRS();
mapSRS = context.getSession()->getMapInfo().getProfile()->getSRS();
}
for( FeatureList::iterator f = features.begin(); f != features.end(); ++f )
{
Feature* input = f->get();
GeometryIterator parts( input->getGeometry(), false );
while( parts.hasMore() )
{
Geometry* part = parts.next();
// skip empty geometry
if ( part->size() == 0 )
continue;
const Style& myStyle = input->style().isSet() ? *input->style() : _style;
bool setLinePropsHere = input->style().isSet(); // otherwise it will be set globally, we assume
float width = 1.0f;
bool hasPolyOutline = false;
const PointSymbol* pointSymbol = myStyle.get<PointSymbol>();
const LineSymbol* lineSymbol = myStyle.get<LineSymbol>();
const PolygonSymbol* polySymbol = myStyle.get<PolygonSymbol>();
// resolve the geometry type from the component type and the symbology:
Geometry::Type renderType = Geometry::TYPE_UNKNOWN;
// First priority is a matching part type and symbol:
if ( polySymbol != 0L && part->getType() == Geometry::TYPE_POLYGON )
{
renderType = Geometry::TYPE_POLYGON;
}
else if ( lineSymbol != 0L && part->isLinear() )
{
renderType = part->getType();
}
else if ( pointSymbol != 0L && part->getType() == Geometry::TYPE_POINTSET )
{
renderType = Geometry::TYPE_POINTSET;
}
// Second priority is the symbol:
else if ( polySymbol != 0L )
{
renderType = Geometry::TYPE_POLYGON;
}
else if ( lineSymbol != 0L )
{
if ( part->getType() == Geometry::TYPE_POLYGON )
renderType = Geometry::TYPE_RING;
else
renderType = Geometry::TYPE_LINESTRING;
}
else if ( pointSymbol != 0L )
{
renderType = Geometry::TYPE_POINTSET;
}
// No symbol? just use the geometry type.
else
{
renderType = part->getType();
}
// validate the geometry:
if ( renderType == Geometry::TYPE_POLYGON && part->size() < 3 )
continue;
else if ( (renderType == Geometry::TYPE_LINESTRING || renderType == Geometry::TYPE_RING) && part->size() < 2 )
continue;
// resolve the color:
osg::Vec4f primaryColor =
polySymbol ? osg::Vec4f(polySymbol->fill()->color()) :
lineSymbol ? osg::Vec4f(lineSymbol->stroke()->color()) :
pointSymbol ? osg::Vec4f(pointSymbol->fill()->color()) :
osg::Vec4f(1,1,1,1);
osg::Geometry* osgGeom = new osg::Geometry();
osgGeom->setUseVertexBufferObjects( _useVertexBufferObjects.value() );
if ( _featureNameExpr.isSet() )
{
const std::string& name = input->eval( _featureNameExpr.mutable_value(), &context );
osgGeom->setName( name );
}
// build the geometry:
//.........这里部分代码省略.........
开发者ID:Sylla,项目名称:osgearth,代码行数:101,代码来源:BuildGeometryFilter.cpp
示例7: polygonize
osg::Node*
PolygonizeLinesFilter::push(FeatureList& input, FilterContext& cx)
{
// compute the coordinate localization matrices.
computeLocalizers( cx );
// establish some things
bool makeECEF = false;
const SpatialReference* featureSRS = 0L;
const SpatialReference* mapSRS = 0L;
if ( cx.isGeoreferenced() )
{
makeECEF = cx.getSession()->getMapInfo().isGeocentric();
featureSRS = cx.extent()->getSRS();
mapSRS = cx.getSession()->getMapInfo().getProfile()->getSRS();
}
// The operator we'll use to make lines into polygons.
const LineSymbol* line = _style.get<LineSymbol>();
PolygonizeLinesOperator polygonize( line ? (*line->stroke()) : Stroke() );
// Geode to hold all the geometries.
osg::Geode* geode = new PixelScalingGeode(); //osg::Geode();
// iterate over all features.
for( FeatureList::iterator i = input.begin(); i != input.end(); ++i )
{
Feature* f = i->get();
// iterate over all the feature's geometry parts. We will treat
// them as lines strings.
GeometryIterator parts( f->getGeometry(), false );
while( parts.hasMore() )
{
Geometry* part = parts.next();
// skip empty geometry
if ( part->size() == 0 )
continue;
// transform the geometry into the target SRS and localize it about
// a local reference point.
osg::Vec3Array* verts = new osg::Vec3Array();
osg::Vec3Array* normals = new osg::Vec3Array();
transformAndLocalize( part->asVector(), featureSRS, verts, normals, mapSRS, _world2local, makeECEF );
// turn the lines into polygons.
osg::Geometry* geom = polygonize( verts, normals );
// install.
geode->addDrawable( geom );
// record the geometry's primitive set(s) in the index:
if ( cx.featureIndex() )
cx.featureIndex()->tagDrawable( geom, f );
}
}
// attempt to combine geometries for better performance
MeshConsolidator::run( *geode );
// GPU performance optimization:
VertexCacheOptimizer vco;
geode->accept( vco );
// If we're auto-scaling, we need a shader
polygonize.installShaders( geode );
return delocalize( geode );
}
开发者ID:emminizer,项目名称:osgearth,代码行数:71,代码来源:PolygonizeLines.cpp
示例8: wallSkinPRNG
bool
ExtrudeGeometryFilter::process( FeatureList& features, FilterContext& context )
{
// seed our random number generators
Random wallSkinPRNG( _wallSkinSymbol.valid()? *_wallSkinSymbol->randomSeed() : 0, Random::METHOD_FAST );
Random roofSkinPRNG( _roofSkinSymbol.valid()? *_roofSkinSymbol->randomSeed() : 0, Random::METHOD_FAST );
for( FeatureList::iterator f = features.begin(); f != features.end(); ++f )
{
Feature* input = f->get();
GeometryIterator iter( input->getGeometry(), false );
while( iter.hasMore() )
{
Geometry* part = iter.next();
osg::ref_ptr<osg::Geometry> walls = new osg::Geometry();
walls->setUseVertexBufferObjects( _useVertexBufferObjects.get() );
osg::ref_ptr<osg::Geometry> rooflines = 0L;
osg::ref_ptr<osg::Geometry> baselines = 0L;
osg::ref_ptr<osg::Geometry> outlines = 0L;
if ( part->getType() == Geometry::TYPE_POLYGON )
{
rooflines = new osg::Geometry();
rooflines->setUseVertexBufferObjects( _useVertexBufferObjects.get() );
// prep the shapes by making sure all polys are open:
static_cast<Polygon*>(part)->open();
}
// fire up the outline geometry if we have a line symbol.
if ( _outlineSymbol != 0L )
{
outlines = new osg::Geometry();
outlines->setUseVertexBufferObjects( _useVertexBufferObjects.get() );
}
// make a base cap if we're doing stencil volumes.
if ( _makeStencilVolume )
{
baselines = new osg::Geometry();
baselines->setUseVertexBufferObjects( _useVertexBufferObjects.get() );
}
// calculate the extrusion height:
float height;
if ( _heightCallback.valid() )
{
height = _heightCallback->operator()(input, context);
}
else if ( _heightExpr.isSet() )
{
height = input->eval( _heightExpr.mutable_value(), &context );
}
else
{
height = *_extrusionSymbol->height();
}
// calculate the height offset from the base:
float offset = 0.0;
if ( _heightOffsetExpr.isSet() )
{
offset = input->eval( _heightOffsetExpr.mutable_value(), &context );
}
osg::ref_ptr<osg::StateSet> wallStateSet;
osg::ref_ptr<osg::StateSet> roofStateSet;
// calculate the wall texturing:
SkinResource* wallSkin = 0L;
if ( _wallSkinSymbol.valid() )
{
if ( _wallResLib.valid() )
{
SkinSymbol querySymbol( *_wallSkinSymbol.get() );
querySymbol.objectHeight() = fabs(height) - offset;
wallSkin = _wallResLib->getSkin( &querySymbol, wallSkinPRNG, context.getDBOptions() );
}
else
{
//TODO: simple single texture?
}
}
// calculate the rooftop texture:
SkinResource* roofSkin = 0L;
if ( _roofSkinSymbol.valid() )
{
if ( _roofResLib.valid() )
{
SkinSymbol querySymbol( *_roofSkinSymbol.get() );
roofSkin = _roofResLib->getSkin( &querySymbol, roofSkinPRNG, context.getDBOptions() );
}
else
//.........这里部分代码省略.........
开发者ID:jy4618272,项目名称:osgearth,代码行数:101,代码来源:ExtrudeGeometryFilter.cpp
示例9: renderFeaturesForStyle
//override
bool renderFeaturesForStyle(
const Style& style,
const FeatureList& features,
osg::Referenced* buildData,
const GeoExtent& imageExtent,
osg::Image* image )
{
// A processing context to use with the filters:
FilterContext context;
context.setProfile( getFeatureSource()->getFeatureProfile() );
const LineSymbol* masterLine = style.getSymbol<LineSymbol>();
const PolygonSymbol* masterPoly = style.getSymbol<PolygonSymbol>();
// sort into bins, making a copy for lines that require buffering.
FeatureList polygons;
FeatureList lines;
for(FeatureList::const_iterator f = features.begin(); f != features.end(); ++f)
{
if ( f->get()->getGeometry() )
{
if ( masterPoly || f->get()->style()->has<PolygonSymbol>() )
{
polygons.push_back( f->get() );
}
if ( masterLine || f->get()->style()->has<LineSymbol>() )
{
Feature* newFeature = new Feature( *f->get() );
if ( !newFeature->getGeometry()->isLinear() )
{
newFeature->setGeometry( newFeature->getGeometry()->cloneAs(Geometry::TYPE_RING) );
}
lines.push_back( newFeature );
}
}
}
// initialize:
RenderFrame frame;
frame.xmin = imageExtent.xMin();
frame.ymin = imageExtent.yMin();
frame.xf = (double)image->s() / imageExtent.width();
frame.yf = (double)image->t() / imageExtent.height();
if ( lines.size() > 0 )
{
// We are buffering in the features native extent, so we need to use the
// transformed extent to get the proper "resolution" for the image
const SpatialReference* featureSRS = context.profile()->getSRS();
GeoExtent transformedExtent = imageExtent.transform(featureSRS);
double trans_xf = (double)image->s() / transformedExtent.width();
double trans_yf = (double)image->t() / transformedExtent.height();
// resolution of the image (pixel extents):
double xres = 1.0/trans_xf;
double yres = 1.0/trans_yf;
// downsample the line data so that it is no higher resolution than to image to which
// we intend to rasterize it. If you don't do this, you run the risk of the buffer
// operation taking forever on very high-res input data.
if ( _options.optimizeLineSampling() == true )
{
ResampleFilter resample;
resample.minLength() = osg::minimum( xres, yres );
context = resample.push( lines, context );
}
// now run the buffer operation on all lines:
BufferFilter buffer;
double lineWidth = 1.0;
if ( masterLine )
{
buffer.capStyle() = masterLine->stroke()->lineCap().value();
if ( masterLine->stroke()->width().isSet() )
{
lineWidth = masterLine->stroke()->width().value();
GeoExtent imageExtentInFeatureSRS = imageExtent.transform(featureSRS);
double pixelWidth = imageExtentInFeatureSRS.width() / (double)image->s();
// if the width units are specified, process them:
if (masterLine->stroke()->widthUnits().isSet() &&
masterLine->stroke()->widthUnits().get() != Units::PIXELS)
{
const Units& featureUnits = featureSRS->getUnits();
const Units& strokeUnits = masterLine->stroke()->widthUnits().value();
// if the units are different than those of the feature data, we need to
// do a units conversion.
if ( featureUnits != strokeUnits )
{
if ( Units::canConvert(strokeUnits, featureUnits) )
{
// linear to linear, no problem
lineWidth = strokeUnits.convertTo( featureUnits, lineWidth );
//.........这里部分代码省略.........
开发者ID:APerennec,项目名称:osgearth,代码行数:101,代码来源:AGGLiteRasterizerTileSource.cpp
示例10: parts
osg::Geode*
BuildGeometryFilter::processPolygons(FeatureList& features, const FilterContext& context)
{
osg::Geode* geode = new osg::Geode();
bool makeECEF = false;
const SpatialReference* featureSRS = 0L;
const SpatialReference* mapSRS = 0L;
// set up the reference system info:
if ( context.isGeoreferenced() )
{
makeECEF = context.getSession()->getMapInfo().isGeocentric();
featureSRS = context.extent()->getSRS();
mapSRS = context.getSession()->getMapInfo().getProfile()->getSRS();
}
for( FeatureList::iterator f = features.begin(); f != features.end(); ++f )
{
Feature* input = f->get();
GeometryIterator parts( input->getGeometry(), false );
while( parts.hasMore() )
{
Geometry* part = parts.next();
// skip geometry that is invalid for a polygon
if ( part->size() < 3 )
continue;
// access the polygon symbol, and bail out if there isn't one
const PolygonSymbol* poly =
input->style().isSet() && input->style()->has<PolygonSymbol>() ? input->style()->get<PolygonSymbol>() :
_style.get<PolygonSymbol>();
if ( !poly )
continue;
// resolve the color:
osg::Vec4f primaryColor = poly->fill()->color();
osg::ref_ptr<osg::Geometry> osgGeom = new osg::Geometry();
osgGeom->setUseVertexBufferObjects( true );
osgGeom->setUseDisplayList( false );
// are we embedding a feature name?
if ( _featureNameExpr.isSet() )
{
const std::string& name = input->eval( _featureNameExpr.mutable_value(), &context );
osgGeom->setName( name );
}
// build the geometry:
buildPolygon(part, featureSRS, mapSRS, makeECEF, true, osgGeom);
osg::Vec3Array* allPoints = static_cast<osg::Vec3Array*>(osgGeom->getVertexArray());
// subdivide the mesh if necessary to conform to an ECEF globe:
if ( makeECEF )
{
double threshold = osg::DegreesToRadians( *_maxAngle_deg );
OE_DEBUG << "Running mesh subdivider with threshold " << *_maxAngle_deg << std::endl;
MeshSubdivider ms( _world2local, _local2world );
//ms.setMaxElementsPerEBO( INT_MAX );
if ( input->geoInterp().isSet() )
ms.run( *osgGeom, threshold, *input->geoInterp() );
else
ms.run( *osgGeom, threshold, *_geoInterp );
}
// assign the primary color array. PER_VERTEX required in order to support
// vertex optimization later
osg::Vec4Array* colors = new osg::Vec4Array;
colors->assign( osgGeom->getVertexArray()->getNumElements(), primaryColor );
osgGeom->setColorArray( colors );
osgGeom->setColorBinding( osg::Geometry::BIND_PER_VERTEX );
geode->addDrawable( osgGeom );
// record the geometry's primitive set(s) in the index:
if ( context.featureIndex() )
context.featureIndex()->tagPrimitiveSets( osgGeom, input );
}
}
return geode;
}
开发者ID:APerennec,项目名称:osgearth,代码行数:87,代码来源:BuildGeometryFilter.cpp
示例11: createFeatureCursor
FeatureCursor* createFeatureCursor(const Symbology::Query& query, ProgressCallback* progress)
{
FeatureCursor* result = 0L;
std::string url = createURL( query );
// the URL wil lbe empty if it was invalid or outside the level bounds of the layer.
if (url.empty())
return 0L;
OE_DEBUG << LC << url << std::endl;
URI uri(url, _options.url()->context());
// read the data:
ReadResult r = uri.readString(_readOptions.get(), progress);
const std::string& buffer = r.getString();
const Config& meta = r.metadata();
bool dataOK = false;
FeatureList features;
if ( !buffer.empty() )
{
// Get the mime-type from the metadata record if possible
std::string mimeType = r.metadata().value( IOMetadata::CONTENT_TYPE );
//If the mimetype is empty then try to set it from the format specification
if (mimeType.empty())
{
if (_options.format().value() == "json") mimeType = "json";
else if (_options.format().value().compare("gml") == 0) mimeType = "text/xml";
else if (_options.format().value().compare("pbf") == 0) mimeType = "application/x-protobuf";
}
dataOK = getFeatures( buffer, *query.tileKey(), mimeType, features );
}
if ( dataOK )
{
OE_DEBUG << LC << "Read " << features.size() << " features" << std::endl;
}
//If we have any filters, process them here before the cursor is created
if (getFilters() && !getFilters()->empty() && !features.empty())
{
FilterContext cx;
cx.setProfile(getFeatureProfile());
cx.extent() = query.tileKey()->getExtent();
for (FeatureFilterChain::const_iterator i = getFilters()->begin(); i != getFilters()->end(); ++i)
{
FeatureFilter* filter = i->get();
cx = filter->push(features, cx);
}
}
// If we have any features and we have an fid attribute, override the fid of the features
if (_options.fidAttribute().isSet())
{
for (FeatureList::iterator itr = features.begin(); itr != features.end(); ++itr)
{
std::string attr = itr->get()->getString(_options.fidAttribute().get());
FeatureID fid = as<long>(attr, 0);
itr->get()->setFID( fid );
}
}
result = new FeatureListCursor(features);
return result;
}
开发者ID:aroth-fastprotect,项目名称:osgearth,代码行数:69,代码来源:FeatureSourceTFS.cpp
示例12: push
FilterContext push(FeatureList& input, FilterContext& context)
{
if (_featureSource.valid())
{
// Get any features that intersect this query.
FeatureList boundaries;
getFeatures(context.extent().get(), boundaries );
// The list of output features
FeatureList output;
if (boundaries.empty())
{
// No intersecting features. If contains is false, then just the output to the input.
if (contains() == false)
{
output = input;
}
}
else
{
// Transform the boundaries into the coordinate system of the features
for (FeatureList::iterator itr = boundaries.begin(); itr != boundaries.end(); ++itr)
{
itr->get()->transform( context.profile()->getSRS() );
}
for(FeatureList::const_iterator f = input.begin(); f != input.end(); ++f)
{
Feature* feature = f->get();
if ( feature && feature->getGeometry() )
{
osg::Vec2d c = feature->getGeometry()->getBounds().center2d();
if ( contains() == true )
{
// coarsest:
if (_featureSource->getFeatureProfile()->getExtent().contains(GeoPoint(feature->getSRS(), c.x(), c.y())))
{
for (FeatureList::iterator itr = boundaries.begin(); itr != boundaries.end(); ++itr)
{
Ring* ring = dynamic_cast< Ring*>(itr->get()->getGeometry());
if (ring && ring->contains2D(c.x(), c.y()))
{
output.push_back( feature );
}
}
}
}
else
{
bool contained = false;
// coarsest:
if (_featureSource->getFeatureProfile()->getExtent().contains(GeoPoint(feature->getSRS(), c.x(), c.y())))
{
for (FeatureList::iterator itr = boundaries.begin(); itr != boundaries.end(); ++itr)
{
Ring* ring = dynamic_cast< Ring*>(itr->get()->getGeometry());
if (ring && ring->contains2D(c.x(), c.y()))
{
contained = true;
break;
}
}
}
if ( !contained )
{
output.push_back( feature );
}
}
}
}
}
OE_INFO << LC << "Allowed " << output.size() << " out of " << input.size() << " features\n";
input = output;
}
return context;
}
开发者ID:XenonofArcticus,项目名称:osgearth,代码行数:84,代码来源:IntersectFeatureFilter.cpp
示例13: renderFeaturesForStyle
//override
bool renderFeaturesForStyle(
const Style& style,
const FeatureList& inFeatures,
osg::Referenced* buildData,
const GeoExtent& imageExtent,
osg::Image* image )
{
// local copy of the features that we can process
FeatureList features = inFeatures;
BuildData* bd = static_cast<BuildData*>( buildData );
// A processing context to use with the filters:
FilterContext context;
context.profile() = getFeatureSource()->getFeatureProfile();
const LineSymbol* masterLine = style.getSymbol<LineSymbol>();
const PolygonSymbol* masterPoly = style.getSymbol<PolygonSymbol>();
//bool embeddedStyles = getFeatureSource()->hasEmbeddedStyles();
// if only a line symbol exists, and there are polygons in the mix, draw them
// as outlines (line rings).
//OE_INFO << LC << "Line Symbol = " << (masterLine == 0L ? "null" : masterLine->getConfig().toString()) << std::endl;
//OE_INFO << LC << "Poly SYmbol = " << (masterPoly == 0L ? "null" : masterPoly->getConfig().toString()) << std::endl;
//bool convertPolysToRings = poly == 0L && line != 0L;
//if ( convertPolysToRings )
// OE_INFO << LC << "No PolygonSymbol; will draw polygons to rings" << std::endl;
// initialize:
double xmin = imageExtent.xMin();
double ymin = imageExtent.yMin();
//double s = (double)image->s();
//double t = (double)image->t();
double xf = (double)image->s() / imageExtent.width();
double yf = (double)image->t() / imageExtent.height();
// strictly speaking we should iterate over the features and buffer each one that's a line,
// rather then checking for the existence of a LineSymbol.
FeatureList linesToBuffer;
for(FeatureList::iterator i = features.begin(); i != features.end(); i++)
{
Feature* feature = i->get();
Geometry* geom = feature->getGeometry();
if ( geom )
{
// check for an embedded style:
const LineSymbol* line = feature->style().isSet() ?
feature->style()->getSymbol<LineSymbol>() : masterLine;
const PolygonSymbol* poly =
feature->style().isSet() ? feature->style()->getSymbol<PolygonSymbol>() : masterPoly;
// if we have polygons but only a LineSymbol, draw the poly as a line.
if ( geom->getComponentType() == Geometry::TYPE_POLYGON )
{
if ( !poly && line )
{
Feature* outline = new Feature( *feature );
geom = geom->cloneAs( Geometry::TYPE_RING );
outline->setGeometry( geom );
*i = outline;
feature = outline;
}
//TODO: fix to enable outlined polys. doesn't work, not sure why -gw
//else if ( poly && line )
//{
// Feature* outline = new Feature();
// geom = geom->cloneAs( Geometry::TYPE_LINESTRING );
// outline->setGeometry( geom );
// features.push_back( outline );
//}
}
bool needsBuffering =
geom->getComponentType() == Geometry::TYPE_LINESTRING ||
geom->getComponentType() == Geometry::TYPE_RING;
if ( needsBuffering )
{
l
|
请发表评论