谷歌卫星地图下载器_谷歌高清卫星地图下载器-水经注软件论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 994|回复: 7

[osgEarth技术] osgEarth2.2中文标注解决办法

[复制链接]
  • TA的每日心情
    慵懒
    2014-6-24 15:07
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2014-9-28 09:38 | 显示全部楼层 |阅读模式
    最近在osg官网上发现osgEarth升级到2.2版了,看了发布说明,增加了不少新功能,所以赶紧把源码下下来,发现确实多了不少新功能,最大的升级是在对Qt的支持、墨卡托坐标系的支持,还多了不少例子。

      但是我添加中文标注的矢量数据时,标注出现乱码的情况,经过对源码的研究,对源码进行了修改,标注的代码在AnnotationUtils类的CreateTextDrawable函数中的t->setText(string)代码,将该代码修改如下:
    游客,如果您要查看本帖隐藏内容请回复

    LabelControl中也存在类似问题,解决方法和标注一样,修改的函数为LabelControl::calcSize函数中修改即可。

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2014-10-28 09:05
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    发表于 2014-9-29 11:52 | 显示全部楼层
    谢谢分享了楼主
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2015-5-13 02:10
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2015-5-13 02:23 | 显示全部楼层
    看看啥情况
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-10-3 23:23 | 显示全部楼层
    兄台,labelnode设置方式也一样吗》?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2016-4-13 10:57
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2016-4-13 17:07 | 显示全部楼层
    表示关注,谢谢
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2016-4-25 20:51 | 显示全部楼层
    顶起顶起顶起顶起顶起顶起顶起顶起顶起
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2016-7-26 16:53 | 显示全部楼层
    thanks a lot !!!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2017-4-28 12:44 | 显示全部楼层
    [经验总结] osgEarth显示中文的label [复制链接]
    过客

    该用户从未签到
    3
    主题       
    91
    帖子       
    106
    积分
    三级会员

    积分106
    发消息       
    电梯直达楼主
    发表于 2012-9-27 16:06 | 只看该作者
    把shp的编码改来改去,发现还是乱码,于是感觉问题应该出现在读取数据的环节。
    在osgearth的论坛上看了些别人的问题,找到了显示label的代码src\osgEarthUtil\Controls.cpp的524行,修改如下。
    本帖隐藏的内容

    LabelControl::calcSize(const ControlContext& cx, osg::Vec2f& out_size)
    {
        if ( visible() == true )
        {
            // we have to create the drawable during the layout pass so we can calculate its size.
            LabelText* t = new LabelText();

    #if 1
            // needs a special shader
            // todo: doesn't work. why?
            osg:rogram* program = new osg:rogram();
            program->addShader( new osg::Shader( osg::Shader::VERTEX, s_controlVertexShader ) );
            program->addShader( new osg::Shader( osg::Shader::FRAGMENT, s_labelControlFragmentShader ) );
            t->getOrCreateStateSet()->setAttributeAndModes( program, osg::StateAttribute::ON );
    #endif
    // chinese support.part1 begin 2011-11-14
            setlocale( LC_ALL, "chs" );
    int requiredSize = mbstowcs(NULL, _text.c_str(), 0);
            wchar_t* wtext = new wchar_t[requiredSize+1];
            mbstowcs(wtext, _text.c_str(), requiredSize+1);
            t->setText(wtext);
            delete [] wtext;
            wtext = NULL;
    // chinese support. part1 end 2011-11-14

    // chinese support.part1 begin 2011-11-14
           //t->setText( _text );
    // chinese support. part1 end 2011-11-14


            // yes, object coords. screen coords won't work becuase the bounding box will be wrong.
            t->setCharacterSizeMode( osgText::Text::OBJECT_COORDS );
            t->setCharacterSize( _fontSize );
            // always align to top. layout alignment gets calculated layer in Control::calcPos().
            t->setAlignment( osgText::Text:EFT_TOP );
            t->setColor( foreColor().value() );
            if ( _font.valid() )
                t->setFont( _font.get() );

    // chinese support.part1 begin 2011-11-14
    setlocale( LC_ALL,"C" );
    // chinese support. part1 end 2011-11-14

            if ( haloColor().isSet() )
            {
                t->setBackdropType( osgText::Text::OUTLINE );
                t->setBackdropOffset( 0.03 );
                t->setBackdropColor( haloColor().value() );
            }

            osg::BoundingBox bbox = t->getTextBB();
            if ( cx._viewContextID != ~0u )
            {
                //the Text's autoTransformCache matrix puts some mojo on the bounding box
                osg::Matrix m = t->getATMatrix( cx._viewContextID );
                _bmin = osg::Vec3( bbox.xMin(), bbox.yMin(), bbox.zMin() ) * m;
                _bmax = osg::Vec3( bbox.xMax(), bbox.yMax(), bbox.zMax() ) * m;
            }
            else
            {
                _bmin = osg::Vec3( bbox.xMin(), bbox.yMin(), bbox.zMin() );
                _bmax = osg::Vec3( bbox.xMax(), bbox.yMax(), bbox.zMax() );
            }

            _renderSize.set(
                (_bmax.x() - _bmin.x()) + padding().x(),
                (_bmax.y() - _bmin.y()) + padding().y() );

            _drawable = t;

            out_size.set(
                margin().x() + _renderSize.x(),
                margin().y() + _renderSize.y() );
        }
        else
        {
            out_size.set(0,0);
        }

        //_dirty = false;
    }


    原因是读取字符串的时候就没有支持双字节的字节,如中文。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    申请友链|手机版|小黑屋|Archiver|谷歌卫星地图下载器_谷歌高清卫星地图下载器-水经注软件论 ( 蜀ICP备05030520号

    返回顶部
    x

    扫描二维码加群

    GMT+8, 2019-9-20 07:21 , Processed in 0.352569 second(s), 31 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表