OSG和osgearth顯示中文

2021-07-04 12:25:40 字數 1974 閱讀 3040

做osg相關的專案有一段時間了,一直想寫幾篇這方面的博文,今天終於開始了。今天主要介紹一下怎麼解決osg 和osgearth中顯示中文的的問題,這個問題我反覆遇到讓我很是糾結啊。

一、知識儲備

要想很好的理解和解決這個問題,首先要了解什麼是多位元組和寬位元組。說實話我之前也知道這兩個位元組到底有什麼區別,只是簡單查了一下資料。這裡引用了這篇部落格,我感覺博主寫的很有意思,通俗易懂,在這裡先謝謝這位博主的奉獻。

二、問題提出

在大致了解了什麼是多位元組和款位元組之後,我們來看看具體的問題。osg是老外開發的原始碼,沒辦法對中文支援很差,雖然這一點兒也不能影響osg帶給我們的快感,我們在使用osg中肯定會或多或少要顯示中文,但是你會發現你按顯示英文那樣就做顯示的都是亂碼。比如我使用lablenode 加乙個標記在地球上,如下

labelgroup->addchild( new placenode(mapnode, geopoint(geosrs, 117.5, 39.38), "北京" , pin));

labelgroup->addchild( new placenode(mapnode, geopoint(geosrs, -100.10, 40.60), "u.s.a" , flag));

這時發現北京顯示的亂碼,而「u.s.a」顯示是正確的,還有我們在載入向量的shp資料時,如果是地名標記資料,顯示在地球上也是亂碼,還用lablecontrol顯示中文時也是一樣的。這裡有兩種成功的方法,一、改原始碼;二、轉換字元,其實這兩種方法本質都是在顯示中文時轉換字元。改原始碼一勞永逸但是難度大有風險而且還要重新編譯,鑑於此我還是推薦第二種方法-------在程式實時地轉換字元。

三、解決方法

中文顯示要用寬位元組,這裡提供幾個轉換函式。

函式一:

void unicodetoutf8(const wstring &src, string& result)

函式二:

void gb2312tounicode(const string& src, wstring& result)

當物在osg程式中顯示漢字時,就如下呼叫上述兩個函式即可,

void gb2312toutf8(const string& src, string& result)

我們拿上面顯示的北京標記的做例子,

style pin;

pin.getorcreate()->url()->setliteral(m_pngfilepath);//指定標註路徑

pin.getorcreate()->font()=m_fontfilepath;//指定中文字型路徑

pin.getorcreate()->encoding() = osgearth::symbology::textsymbol::encoding_utf8;

pin.getorcreate()->alignment() = textsymbol::align_center_center;

pin.getorcreate()->fill()->color() = color::red;

std::string _strname;

_strname = "北京";

std::string _strwidename;

gb2312toutf8(_strname,_strwidename);//這時的_strwidename就是寬位元組用來顯示就正確了

labelgroup->addchild( new placenode(mapnode, geopoint(geosrs, 117.5, 39.38), _strwidename , pin));

顯示地名標記和lablecontrol中的中文都是這個方法,先轉換在顯示。

編譯OSG和osgearth遇到的問題

錯誤1 編譯時提示不識別 imp closesocket相關符號 在plugins gdal設定屬性,鏈結庫ws2 32.lib,路徑為c program files x86 windows kits 8.1 lib winv6.3 um x64 錯誤 2 編譯時提示不識別 sql.等 相關符號 在...

將osg和osgearth公升級遇到的問題

將osg公升到3.6.3 osgearth公升到2.10時發現在畫featurenode和labelnode時,在我的工程 怎麼都不顯示。但是同樣的 放到osgearth例子裡就可以,百思不得其解,無賴一句一句對比,最後跟原始碼,最終發現labelnode要加這句話 m ptrviewer getc...

OSG中LabelControl中文顯示

osg預設是不支援中文顯示的,然而在有些時候還是需要中文顯示的,對於osg的中文顯示,網上有很多的解決方案,但是我沒有找到關於labelcontrol的顯示,這裡我把關於labelcontrol的中文顯示分享一下。osg的中文顯示大致來說可以分為3步,我這裡的前2步就是參考網上的解決方案,沒有什麼特...