Exemplo n.º 1
0
 /**
  * Creates a simple label. The caller is responsible for placing it in the scene.
  */
 osg::Node* createNode(
     const std::string& text,
     const TextSymbol*  symbol )
 {
     Controls::LabelControl* label = new Controls::LabelControl( text );
     if ( symbol )
     {
         if ( symbol->fill().isSet() )
             label->setForeColor( symbol->fill()->color() );
         if ( symbol->halo().isSet() )
             label->setHaloColor( symbol->halo()->color() );
         if ( symbol->size().isSet() )
             label->setFontSize( *symbol->size() );
         if ( symbol->font().isSet() )
             label->setFont( osgText::readFontFile(*symbol->font()) );
         if ( symbol->encoding().isSet() )
         {
             osgText::String::Encoding enc;
             switch(symbol->encoding().value())
             {
             case TextSymbol::ENCODING_ASCII: enc = osgText::String::ENCODING_ASCII; break;
             case TextSymbol::ENCODING_UTF8: enc = osgText::String::ENCODING_UTF8; break;
             case TextSymbol::ENCODING_UTF16: enc = osgText::String::ENCODING_UTF16; break;
             case TextSymbol::ENCODING_UTF32: enc = osgText::String::ENCODING_UTF32; break;
             default: enc = osgText::String::ENCODING_UNDEFINED; break;
             }
             label->setEncoding( enc );
         }
     }
     Controls::ControlNode* node = new Controls::ControlNode( label );
     return node;
 }
Exemplo n.º 2
0
    /**
     * Creates a complete set of positioned label nodes from a feature list.
     */
    osg::Node* createNode(
        const FeatureList&   input,
        const TextSymbol*    text,
        const FilterContext& context )
    {
        osg::Group* group = 0L;
        std::set<std::string> used; // to prevent dupes
        bool skipDupes = (text->removeDuplicateLabels() == true);

        StringExpression  contentExpr ( *text->content() );
        NumericExpression priorityExpr( *text->priority() );

        bool makeECEF = false;
        if ( context.isGeoreferenced() )
        {
            makeECEF = context.getSession()->getMapInfo().isGeocentric();
        }

        for( FeatureList::const_iterator i = input.begin(); i != input.end(); ++i )
        {
            const Feature* feature = i->get();
            if ( !feature )
                continue;

            const Geometry* geom = feature->getGeometry();
            if ( !geom )
                continue;

            osg::Vec3d centroid  = geom->getBounds().center();

            if ( makeECEF )
            {
                context.profile()->getSRS()->transformToECEF( centroid, centroid );
            }

            const std::string& value = feature->eval( contentExpr, &context );

            if ( !value.empty() && (!skipDupes || used.find(value) == used.end()) )
            {
                if ( !group )
                {
                    group = new osg::Group();
                }

                double priority = feature->eval( priorityExpr, &context );

                Controls::LabelControl* label = new Controls::LabelControl( value );
                if ( text->fill().isSet() )
                    label->setForeColor( text->fill()->color() );
                if ( text->halo().isSet() )
                    label->setHaloColor( text->halo()->color() );
                if ( text->size().isSet() )
                    label->setFontSize( *text->size() );
                if ( text->font().isSet() )
                    label->setFont( osgText::readFontFile(*text->font()) );

                Controls::ControlNode* node = new Controls::ControlNode( label, priority );

                osg::MatrixTransform* xform = new osg::MatrixTransform( osg::Matrixd::translate(centroid) );
                xform->addChild( node );

                // for a geocentric map, do a simple dot product cull.
                if ( makeECEF )
                {
                    xform->setCullCallback( new CullNodeByHorizon(
                        centroid, 
                        context.getSession()->getMapInfo().getProfile()->getSRS()->getEllipsoid()) );
                    group->addChild( xform );
                }
                else
                {
                    group->addChild( xform );
                }

                if ( skipDupes )
                {
                    used.insert( value );
                }
            }
        }

        return group;
    }