osgEarth例⼦学习-feature_
例⼦学习第⼀天
今天是2019年2.26,接下来的⼀段时间开始研究关于在osgEarth中地形整(压平)的事⼉,最后的应⽤就是开路,在osgEarth地球的表
⾯,⽐如⼭上能⾃动⽣成道路之类的。
⾸先看下例⼦的效果介绍
还是很酷炫的,羡慕啊,开始⼲吧。
好久没摸oe了,只能⼀点⼀点来,在vs2010中随便选了个例⼦cpp,这⾥选择的是
但是⾥⾯有好多⽤不上的代码(应该吧),先注销掉。上⾯⼀堆包含都没管,菜鸟⼀只,也分辨不出来,啥Handler都留着,没管。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
usingnamespaceosgEarth;
usingnamespaceosgEarth::Util;
usingnamespaceosgEarth::Util::Controls;
usingnamespaceosgEarth::Annotation;
staticMapNode*s_mapNode=0L;
staticLabelControl*s_posLabel=0L;
staticLabelControl*s_vdaLabel=0L;
staticLabelControl*s_mslLabel=0L;
staticLabelControl*s_haeLabel=0L;
staticLabelControl*s_egm96Label=0L;
staticLabelControl*s_mapLabel=0L;
staticLabelControl*s_resLabel=0L;
staticPlaceNode*s_marker=0L;
//Aneventhandlerthatwillprintouttheelevationattheclickedpoint
structQueryElevationHandler:publicosgGA::GUIEventHandler
{
QueryElevationHandler()
:_mouDown(fal),
_terrain(s_mapNode->getTerrain()),
_query(s_mapNode->getMap())
{
_map=s_mapNode->getMap();
_TilesToCache(10);
_lBackOnNoData(fal);
__back(s_mapNode->getTerrainEngine());
}
voidupdate(floatx,floaty,osgViewer::View*view)
{
boolyes=fal;
//lookunderthemou:
osg::Vec3dworld;
osgUtil::LineSegmentInterctor::Interctionshits;
if(view->computeInterctions(x,y,hits))
{
world=()->getWorldInterctPoint();
//converttomapcoords:
GeoPointmapPoint;
rld(_terrain->getSRS(),world);
//doanelevationquery:
doublequery_resolution=0;//max.
doubleout_hamsl=0.0;
doubleout_resolution=0.0;
boolok=_vation(
mapPoint,
out_hamsl,
query_resolution,
&out_resolution);
if(ok)
if(ok)
{
//converttogeodetictogettheHAE:
mapPoint.z()=out_hamsl;
GeoPointmapPointGeodetic(s_mapNode->getMapSRS()->getGeodeticSRS(),mapPoint);
staticLatLongFormatters_f;
s_posLabel->tText(Stringify()
<
<
<<","
<
s_mslLabel->tText(Stringify()<
s_haeLabel->tText(Stringify()<
s_resLabel->tText(Stringify()<
doubleegm96z=mapPoint.z();
VerticalDatum::transform(
()->getVerticalDatum(),
VerticalDatum::get("egm96"),
mapPointGeodetic.y(),
mapPointGeodetic.x(),
egm96z);
s_egm96Label->tText(Stringify()<
yes=true;
}
//finally,getanormalISECTHAEpoint.
GeoPointictPoint;
rld(_terrain->getSRS()->getGeodeticSRS(),world);
s_mapLabel->tText(Stringify()<<());
//andmovethemarker.
s_marker->tPosition(mapPoint);
}
if(!yes)
{
s_posLabel->tText("-");
s_mslLabel->tText("-");
s_haeLabel->tText("-");
s_resLabel->tText("-");
s_egm96Label->tText("-");
}
}
boolhandle(constosgGA::GUIEventAdapter&ea,osgGA::GUIActionAdapter&aa)
{
if(ntType()==CLICK&&
ton()==_MOUSE_BUTTON)
{
osgViewer::View*view=static_cast
update((),(),view);
returntrue;
}
returnfal;
}
constMap*_map;
constTerrain*_terrain;
constTerrain*_terrain;
bool_mouDown;
ElevationQuery_query;
osg::NodePath_path;
};
intmain(intargc,char**argv)
{
osg::ArgumentParrarguments(&argc,argv);
osgViewer::Viewerviewer(arguments);
s_mapNode=0L;
osg::Node*earthFile=MapNodeHelper().load(arguments,&viewer);
if(earthFile)
s_mapNode=MapNode::get(earthFile);
if(!s_mapNode)
{
OE_WARN<<"Unabletoloadearthfile."<
return-1;
}
osg::Group*root=newosg::Group();
neData(root);
//installtheprogrammablemanipulator.
eraManipulator(newosgEarth::Util::EarthManipulator());
//TheMapNodewillrendertheMapobjectinthescenegraph.
root->addChild(earthFile);
//Aneventhandlerthatwillrespondtomouclicks:
ntHandler(newQueryElevationHandler());
//addsomestockOSGhandlers:
ntHandler(newosgViewer::StatsHandler());
ntHandler(newosgViewer::WindowSizeHandler());
ntHandler(newosgGA::StateSetManipulator(era()->getOrCreateStateSet()));
();
}
然后再看⼀眼feature_⽂件,⽤的是Nodepad++打开的。英⽂不太好,把所有的英⽂都翻译了中⽂。
这⾥要注意,添加地图的时候,精度低的要在前⾯,精度⾼的放下⾯,不然会遮挡掉。
这⾥福建省的在上,全球图在下就只会显⽰全球图了,如下
就完全看不到福建,反之调换顺序,结果如下
福建出来啦!图是在91卫图下的,有⽔印,拿来做实验哈哈。总之福建出来了。
还有⼀点,tif格式的图⽤的驱动器⽤gdal就⾏,驱动器是来决定如何解析图⽚的(应该hah)
现在很好奇,⾼程是怎么显⽰出来的,继续下载了福建省的⾼程数据,感觉着福建这地图太丑了,影响体验,先不显⽰它了!把名称
本文发布于:2022-11-24 08:35:13,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/10622.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |