查看: 10171|回复: 24

osgEarth中如何加入中文地名标记?

[复制链接]

该用户从未签到

发表于 2013-7-15 15:25:46 | 显示全部楼层 |阅读模式
本帖最后由 vampire_ljw 于 2013-7-15 15:52 编辑

在osgEarth中添加省界矢量数据效果如图所示,代码如下,但标记信息出现乱码,请问如何显示中文啊?:
  1. Style style;

  2.            LineSymbol* ls=style.getOrCreateSymbol<LineSymbol>();
  3.            ls->stroke()->color()=color;
  4.            ls->stroke()->width()=3.0f;

  5.         TextSymbol* text=style.getOrCreateSymbol<TextSymbol>();
  6.         text->content()=StringExpression("[NAME]");
  7.         text->priority()=NumericExpression("[pop_cntry]");
  8.         text->removeDuplicateLabels()=true;
  9.         text->size()=16.0f;
  10.         text->alignment()=TextSymbol::ALIGN_CENTER_CENTER;
  11.         text->fill()->color()=Color::White;
  12.         text->halo()->color()=Color::DarkGray;
  13.         text->provider()="annotation";

  14.         OGRFeatureOptions featureOptions;
  15.                 std::string featurepath="E:/data/chinashp.shp"
  16.         featureOptions.url()=featurepath;

  17.         FeatureGeomModelOptions geomOptions;
  18.         geomOptions.featureOptions()=featureOptions;
  19.         geomOptions.styles()=new StyleSheet();
  20.         geomOptions.styles()->addStyle(style);
  21.         geomOptions.enableLighting()=false;

  22.         ModelLayerOptions layerOptions(layerName,geomOptions);
  23.         layerOptions.overlay()=true;
  24.         map->addModelLayer(new ModelLayer(layerOptions));
复制代码

中文标注

中文标注

该用户从未签到

 楼主| 发表于 2013-7-16 21:43:46 | 显示全部楼层
text->content()=StringExpression("[ADCODE93]");改成这个字段就可以显示数字成功,请问中文字段怎么显示啊

该用户从未签到

 楼主| 发表于 2013-7-18 11:31:17 | 显示全部楼层
  1. text->encoding()=TextSymbol::ENCODING_UTF8;
  2.         text->font()=std::string("E:/simhei.ttf");
复制代码
添加这个代码也没用

该用户从未签到

 楼主| 发表于 2013-7-23 11:32:59 | 显示全部楼层
请问这样的功能怎样实现啊
中文注记.png

该用户从未签到

发表于 2013-7-23 16:11:48 | 显示全部楼层
设置一下字体的编码和设置一下字体的字体文件,才可能显示

该用户从未签到

 楼主| 发表于 2013-7-23 16:40:04 | 显示全部楼层
ysw 发表于 2013-7-23 16:11
设置一下字体的编码和设置一下字体的字体文件,才可能显示

text->encoding()=TextSymbol::ENCODING_UTF8;
text->font()=std::string("E:/simhei.ttf");
您好,3楼这两句代码应该是您说的字体编码和字体文件吧,可是仍然显示是乱码啊

该用户从未签到

 楼主| 发表于 2013-7-24 15:27:14 | 显示全部楼层
PC端已经解决,可是Android版的osgEarth仍然是乱码
解决方法:
text->font()=std::string("E:/simhei.ttf");//仍然是设置一个显示中文的字体
在AnnotationUtils.cpp中的createTextDrawable函数中修改以下代码,程序运行成功,可是为什么在Android上还是方块乱码呢
  1. //Modified by Jovi**********************************
  2.     //t->setText( text, text_encoding );
  3.         setlocale(LC_ALL,"chs");
  4.         int wSize=text.size()*2+2;
  5.         wchar_t* wtext=new wchar_t[wSize+1];
  6.         memset(wtext,0,wSize+1);
  7.         mbstowcs(wtext,text.c_str(),wSize);
  8.         t->setText(wtext);
  9.         delete[] wtext;
  10.         wtext=NULL;

  11.         //Modified by Jovi**********************************
复制代码

该用户从未签到

发表于 2013-7-24 16:25:25 | 显示全部楼层
vampire_ljw 发表于 2013-7-24 15:27
PC端已经解决,可是Android版的osgEarth仍然是乱码
解决方法:
text->font()=std::string("E:/simhei.ttf ...

osgEarth中文路径问题,除了上面两个设置以外,你还需要保证你提交的中文文字提交给osgEarth 的PlaceNode或者LabelNode是一个宽字符串。有个好的解决办法是用QString ,这个是qt的。用这个类在读取字符串的时候可以按宽字符串进行读入,可以以utf8格式导出字符串,然后再转化为std::string .
具体做法

QString a=Qstring::fromLocal8bit("你好");

std::string labelText=(std::string)a.toUtf8();

你可以试下,很好用

该用户从未签到

 楼主| 发表于 2013-7-24 17:51:55 | 显示全部楼层
ysw 发表于 2013-7-24 16:25
osgEarth中文路径问题,除了上面两个设置以外,你还需要保证你提交的中文文字提交给osgEarth 的PlaceNode ...

您的意思是说用了QString就不用改osgEarth里面AnnotationUtils.cpp的源码了是吗?

该用户从未签到

发表于 2013-7-26 10:20:21 | 显示全部楼层
是的,我原来就是这样解决的,只要保证输入的是宽字符串就行,你可以这样,你可以给Qstring对象付个字符串,看赋值后的Qstring 对象,如果里面显示的是正常的中文,这就是正确的。 按照上面的方法,交个osgEarth文字显示的节点就行了

该用户从未签到

 楼主| 发表于 2013-8-24 18:08:14 | 显示全部楼层
ysw 发表于 2013-7-26 10:20
是的,我原来就是这样解决的,只要保证输入的是宽字符串就行,你可以这样,你可以给Qstring对象付个字符串, ...

请问,用Qt的办法您在Android或者IOS版的osgEarth上试过吗?

该用户从未签到

发表于 2013-8-28 10:06:29 | 显示全部楼层
没有试过

该用户从未签到

发表于 2013-9-2 17:53:26 | 显示全部楼层
chinashp.shp文件可以发我一份吗?403454033@qq.com  谢谢

该用户从未签到

发表于 2014-3-19 19:24:44 | 显示全部楼层
加载了中文标记(shp数据)帧率怎么下降了一半?

该用户从未签到

 楼主| 发表于 2014-3-19 19:48:41 | 显示全部楼层
xiaol_deng 发表于 2014-3-19 19:24
加载了中文标记(shp数据)帧率怎么下降了一半?

多大的数据量啊,感觉中文注记相当于点矢量数据,加太多的确容易卡

该用户从未签到

发表于 2014-3-19 20:34:08 | 显示全部楼层
vampire_ljw 发表于 2014-3-19 19:48
多大的数据量啊,感觉中文注记相当于点矢量数据,加太多的确容易卡

数据量非常小呢,加载境界也是这样,有什么改进方法吗?

该用户从未签到

发表于 2014-3-19 21:13:53 | 显示全部楼层
还遇到一个问题,我按照楼主的方法把shp数据加到场景中之后,退出程序时会出现:退出异常,不加载shp数据的时候就一切正常呢!真拙计。。。。

该用户从未签到

发表于 2014-3-21 10:51:27 | 显示全部楼层
我改成Release版本发现速度变快而且加载shp也没出现退出异常的情况。

该用户从未签到

发表于 2014-4-23 12:36:38 | 显示全部楼层
ysw 发表于 2013-7-24 16:25
osgEarth中文路径问题,除了上面两个设置以外,你还需要保证你提交的中文文字提交给osgEarth 的PlaceNode ...

经我检验,不更改对应的settext()源码,这么设置字符串显示还是乱码

该用户从未签到

发表于 2014-4-24 08:50:20 | 显示全部楼层
yanhe524 发表于 2014-4-23 12:36
经我检验,不更改对应的settext()源码,这么设置字符串显示还是乱码

我的解决办法是           Qstring name=QString::fromlocal8bit("你好"); settext((std::string(name.tolocal8bit())));你试下,我这边可以

该用户从未签到

发表于 2014-4-25 11:15:00 来自手机 | 显示全部楼层
ysw 发表于 2014-4-24 08:50
我的解决办法是           Qstring name=QString::fromlocal8bit("你好"); settext((std::string(name.tolocal8 ...

这不等于没转吗?formlocal8bit,tolocal8bit

该用户从未签到

发表于 2014-4-25 13:13:32 | 显示全部楼层
yanhe524 发表于 2014-4-25 11:15
这不等于没转吗?formlocal8bit,tolocal8bit

从字符串 到Qstring进行了转化,要不然中文字符串是乱码,至于 setText(std::string)与setText(std::string(Qstring.tolocal8bit)),是不一样的,在osgEarth的labelNode和placeNode中都能显示正常的中文,至于这两个函数类型转化后产生了什么差别,这个不太很清楚。不过,如果直接输入的是std::string,显示的是乱码。 至于osg中的中文显示问题,我也试了一下,发现osgText::text,没有设置编码的地方
  • TA的每日心情
    开心
    2021-2-3 08:42
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2016-8-17 11:53:57 | 显示全部楼层
    能否不改源码实现中文标注?

    该用户从未签到

    发表于 2016-10-9 15:06:54 | 显示全部楼层
    text->encoding()=TextSymbol::ENCODING_UTF8;
    text->font()="simsum.ttf";//把"simhei.ttf"换成“simsum.ttf”
    这两句就可以了

    该用户从未签到

    发表于 2019-10-15 14:09:44 | 显示全部楼层
    查无此人 发表于 2013-7-16 21:43
    text->content()=StringExpression("[ADCODE93]");改成这个字段就可以显示数字成功,请问中文字段怎么显示 ...

    楼主,您好,我也遇到了这个问题,请问,不修改源码能解决问题么
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    OSG中国官方论坛-有您OSG在中国才更好

    网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

    联系我们

    • 工作时间:09:00--18:00
    • 反馈邮箱:1315785073@qq.com
    快速回复 返回顶部 返回列表