OSGEarthテキストの追加

4935 ワード

目次
一、タイプ変換
二、コード修正
三、文字の追加
四、完全なコード
ここでは、OSGEarthで指定した経緯度に文字を追加する方法について説明します.
一、タイプ変換
次のコードは、Stringタイプの文字列をWstringタイプに変換して、対応する関数によって入力として受信できるようにするために使用されます.
std::wstring String2WString(const std::string& s)
{
	std::string strLocale = setlocale(LC_ALL, "");
	const char* chSrc = s.c_str();
	size_t nDestSize = mbstowcs(NULL, chSrc, 0) + 1;
	wchar_t* wchDest = new wchar_t[nDestSize];
	wmemset(wchDest, 0, nDestSize);
	mbstowcs(wchDest, chSrc, nDestSize);
	std::wstring wstrResult = wchDest;
	delete[]wchDest;
	setlocale(LC_ALL, strLocale.c_str());
	return wstrResult;
}

二、コード修正
次のコードはUnicode符号化をUTF 8符号化に変換するために使用され、OSGEarthに追加された中国語がエラーにならないようにします.
void unicodeToUTF8(const wstring &src, string& result)
{
	int n = WideCharToMultiByte(CP_UTF8, 0, src.c_str(), -1, 0, 0, 0, 0);
	result.resize(n);
	::WideCharToMultiByte(CP_UTF8, 0, src.c_str(), -1, (char*)result.c_str(), result.length(), 0, 0);
}

三、文字の追加
以下のコードは、指定する緯度に文字を追加するために使用され、フォントの属性は必要に応じて変更することができ、英語を追加する際にsimkaiを削除することができる.ttfフォント属性設定;中国語を追加する場合はsimkaiを省略することはできない.ttfフォントプロパティ設定.
void addPositionName()
{
    osg::ref_ptr<:group> earthLabel = new osg::Group;

	//    
	osgEarth::Style style;
	osgEarth::Symbology::TextSymbol * textStyle = style.getOrCreateSymbol<:symbology::textsymbol>();
	//    
	textStyle->fill()->color() = osg::Vec4f(1.0, 1.0, 1.0, 1.0);
	//    
	textStyle->halo()->color() = osg::Vec4f(0.0, 0.0, 1.0, 1.0);
	textStyle->font() = "simkai.ttf";
	textStyle->size() = 13.0;
	textStyle->encoding() = osgEarth::Symbology::TextSymbol::ENCODING_UTF8;
	
	//    
	//std::fstream fin("./place/place.txt", std::ios::in);
	string name[] = { "   ", "   ", "   ", "  ", "   ", "    " };//, "    "};
	double lon[] = { 81.617947, 81.623095, 81.623418, 81.622755, 81.614893, 81.622220 };//, 81.629543 };
	double lat[] = { 44.237668, 44.245067 , 44.227526 , 44.230978 , 44.239895 , 44.225495 };//, 44.239629 };
	for (int i = 0; i < 6; i ++)
	{
		//    
		const osgEarth::SpatialReference* geoSRS = mapNode->getMapSRS()->getGeographicSRS();
		std::string _strWideName;
		unicodeToUTF8(String2WString(name[i]), _strWideName);
		//test
		//MessageBox(NULL, "Hi", _strWideName.c_str(), MB_OK);
		osgEarth::Annotation::PlaceNode *pn = new osgEarth::Annotation::PlaceNode(mapNode, osgEarth::GeoPoint(geoSRS, lon[i], lat[i]), NULL, _strWideName, style);
		//pn->setScale(osg::Vec3(1, 1, 1));
		earthLabel->addChild(pn);
	}
	
}

四、完全なコード
std::wstring String2WString(const std::string& s)
{
	std::string strLocale = setlocale(LC_ALL, "");
	const char* chSrc = s.c_str();
	size_t nDestSize = mbstowcs(NULL, chSrc, 0) + 1;
	wchar_t* wchDest = new wchar_t[nDestSize];
	wmemset(wchDest, 0, nDestSize);
	mbstowcs(wchDest, chSrc, nDestSize);
	std::wstring wstrResult = wchDest;
	delete[]wchDest;
	setlocale(LC_ALL, strLocale.c_str());
	return wstrResult;
}

void unicodeToUTF8(const wstring &src, string& result)
{
	int n = WideCharToMultiByte(CP_UTF8, 0, src.c_str(), -1, 0, 0, 0, 0);
	result.resize(n);
	::WideCharToMultiByte(CP_UTF8, 0, src.c_str(), -1, (char*)result.c_str(), result.length(), 0, 0);
}

void addPositionName()
{
    osg::ref_ptr<:group> earthLabel = new osg::Group;

	//    
	osgEarth::Style style;
	osgEarth::Symbology::TextSymbol * textStyle = style.getOrCreateSymbol<:symbology::textsymbol>();
	//    
	textStyle->fill()->color() = osg::Vec4f(1.0, 1.0, 1.0, 1.0);
	//    
	textStyle->halo()->color() = osg::Vec4f(0.0, 0.0, 1.0, 1.0);
	textStyle->font() = "simkai.ttf";
	textStyle->size() = 13.0;
	textStyle->encoding() = osgEarth::Symbology::TextSymbol::ENCODING_UTF8;
	
	//    
	//std::fstream fin("./place/place.txt", std::ios::in);
	string name[] = { "   ", "   ", "   ", "  ", "   ", "    " };//, "    "};
	double lon[] = { 81.617947, 81.623095, 81.623418, 81.622755, 81.614893, 81.622220 };//, 81.629543 };
	double lat[] = { 44.237668, 44.245067 , 44.227526 , 44.230978 , 44.239895 , 44.225495 };//, 44.239629 };
	for (int i = 0; i < 6; i ++)
	{
		//    
		const osgEarth::SpatialReference* geoSRS = mapNode->getMapSRS()->getGeographicSRS();
		std::string _strWideName;
		unicodeToUTF8(String2WString(name[i]), _strWideName);
		//test
		//MessageBox(NULL, "Hi", _strWideName.c_str(), MB_OK);
		osgEarth::Annotation::PlaceNode *pn = new osgEarth::Annotation::PlaceNode(mapNode, osgEarth::GeoPoint(geoSRS, lon[i], lat[i]), NULL, _strWideName, style);
		//pn->setScale(osg::Vec3(1, 1, 1));
		earthLabel->addChild(pn);
	}
	
}