osgEarth::Drivers::TMSOptions Class Reference 通过程序加载数据
赶紧进入正题,程序加载各种数据,首先介绍一下总体的方式
/*这里XXXOptions 是根据不同的数据类型选择不同驱动,比如加载本地数据可以使用GDALOptions ,加载TMS数据可以使用TMSOptions(注意TMSOptions可以加载本地也可以加载网上数据),WMSOptions可以加载网上数据(注意这个options主要加载影像和图片数据),ArcGISOptions加载ArcGIS Server发布数据。*/ osgEarth::Drivers::XXXOptions XXXLayer;
/*这里就是加载的数据路径,如果加载的本地数据就是本地数据的路径,如果加载是网 上数据就是相应的网址*/
XXXLayer.url()=osgEarth::URI(\
/*加载的数据是分层管理,每加载进来一个数据在earth上就是一个数据层,这里给数据层付个名字。*/
std::string LayerName=\
/*osgearth里layer主要有三种类型 ImageLayer、ElevationLayer和ModleLayer ,前两个大家从字面就可以知道第一个是加载影像和第二个是加载高程数据的,第三个是主要用来加载shp数据,至少我是这样用的,不知道还能否加载其他数据类型。确定加载用的驱动、数据源位置(路径)、数据层名和初始化了数据层,接下来就是把数据层加到地球中如下所示。*/
osg::ref_ptr
layer
=new osgEarth::XXXLayer(osgEarth::XXXLayerOptions(LayerName,XXXLayer));
m_pMap->addImageLayer(layer.get()); (1)加载本地数据
a 本地影像数据,数据类型为tif
osgEarth::Drivers::GDALOptions imagelayerOpt;//选择GDALOptions imagelayerOpt.url()
=
osgEarth::URI(\
Files\\\\osgVR74\\\\osgVR74\\\\world.tif\//影像数据路径 std::string imagelayerName = \ //影像数据层名 osg::ref_ptr
imageLayer
=
new osgEarth::ImageLayer(osgEarth::ImageLayerOptions(imagelayerName ,imagelayerOpt)); //初始数据层
m_pMap->addImageLayer(imageLayer .get()); b 本地高程数据,数据类型为tif
osgEarth::Drivers::GDALOptions demlayerOpt; //使用还是GDALOptions demlayerOpt.url()
=
osgEarth::URI(\
Files\\\\osgVR74\\\\osgVR74\\\\worlddem.tif\//高程数据路径 std::string demlayerName = \//高程数据层名 osg::ref_ptr
demLayer
=
new
osgEarth::ImageLayer(osgEarth::ImageLayerOptions(demlayerName,demlayerOpt));//初始数据层
m_pMap->addImageLayer(demLayer.get());
加载本地经过package 切片的数据还可以用TMSOptions,
osgEarth::Drivers::TMSOptions tmsOpt;////选择TMSOptions 驱动
tmsOpt.url()=osgEarth::URI(\/package 切片生成金字塔文件下的 xml
std::stringDemtmslayerName=\//图层名
osgEarth::ElevationLayerOptionstmslayerOpt(DemtmslayerName,tmsOpt); osg::ref_ptr
m_pMap->addElevationLayer(TmsDemLayer.get());//初始化图层并加入到地球中 (2)加载网上数据
a 加载ArcGIS Server 发布的数据加载方式与上面提到的类似 osgEarth::Drivers::ArcGISOptions MapImageLayer;
MapImageLayer.url()=osgEarth::URI(\p003/MapServer\
std::string CdlayerName=\
osg::ref_ptr
cdlayer
=new
=
new
osgEarth::ImageLayer(osgEarth::ImageLayerOptions(CdlayerName,MapImageLayer));
m_pMap->addImageLayer(cdlayer.get());
//这里注意,当osgearth访问ArcGIS Server 发布数据的时候有些问题很奇怪,用上面的方式访问ArcGIS Server 国外发布的数据没问题,但是访问自己发布的数据就会有问题,经过试验投影要设成3857才能正常访问。
b 加载网上数据还可以用WMSOptions 加载方式同上。
2015/12/14
1.osgEarth::Util::MapNodeHelper.解析内部的命令行参数。
非静态成员变量不能使用类名直接访问。例如:osgEarth::Util::MapNodeHelper:: load() 这样的形式是错误的。
osg::Group * load (osg::ArgumentParser &args, osgViewer::View *view, Control *userControl=0L) const
函数是载入map文件,解析所有的内部命令行参数与外部的XML文件。 2. osgEarth::MapNode。建立OsgEarth的根节点。
3. osgEarth::Util::Controls::Grid. 此类是父类Container按照栅格形式组织子类。 4. osgEarth::Util::Controls::LabelControl.表示一个字符串的控件。 2015/12/15
1.void osgViewer::View::setCameraManipulator ( osgGA::CameraManipulator * manipulator, bool resetPosition = true ) 设置相机操作器。
OsgViewer::Viewer的继承关系如下图所示。
视图-View;视景器-Viewer。 osgViewer::View类别 2015/12/17
1.osgGA::GUIEventHandler为GUI事件提供一个基本的接口。
2.osgEarth::Map map是mapNode所渲染的主要的数据模型,包括所有的层对象。 3. osgEarth::Terrain 是为地形图的接口服务的
4 .osgEarth::ElevationQuery 查询地图上任意点的高程数据 5. osgEarth::GeoPoint 2015/12/20
1. osg::ArgumentParser 解析参数的类。
2. osgEarth::Annotation::ModelNode。从URI传递一个3D模型(注释节点)然后放置在一个地理节点。 2015/12/21
动态显示经纬度坐标以及高程方法
1. osgEarth::SpatialReference Class.保留描述参考椭球体和地理空间数据的投影的相关数据。 2.osgEarth::MapNode Class 中的函数const SpatialReference * MapNode::getMapSRS()const.得
到地图的地理空间参考系统。
3.osgEarth::Util::Controls:: ControlCanvas Class。将控件与OSG视景相关联。
4. osgGA::GUIEventHandler 为GUI事件提供一个基本的接口。在这个类的基础上,派生了其他的类,比如在高程与经纬度查询的osgViewer::StatsHandler类(为了增加屏幕状态到视景体的事件句柄),osgViewer::WindowSizeHandler类(改变窗口模式的屏幕分辨率和开关全屏模式和窗口模式的事件句柄),osgGA::StateSetManipulator类(实验类,不能被观察一段时间,但是能够返回到某个点)。 5.动态显示经纬度和高程 经纬度查询的机制。
主要是利用碰撞检测机制,鼠标点在二维的屏幕上的坐标,然后利用碰撞检测求得世界坐标X,Y,Z,然后再将世界坐标转换成与地理相关的三维坐标,然后再将此地理三维坐标转换成与经纬度有关的坐标。 重写handle函数。
bool handle( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa ) {
if (ea.getEventType() == osgGA::GUIEventAdapter::MOVE && aa.asView()->getFrameStamp()->getFrameNumber() % 10 == 0) {
osgViewer::View* view = static_cast
return false;
}
其中的osgGA::GUIEventAdapter类是存储键盘,鼠标和窗口事件。osgGA::GUIActionAdapter是抽象基类,它定义了GUIEventHandlers事件句柄将要访问GUI的接口。 然后调用相应的更新函数update();
void update( float x, float y, osgViewer::View* view ) {
bool yes = false;
// look under the mouse: osg::Vec3d world;
osgUtil::LineSegmentIntersector::Intersections hits; if ( view->computeIntersections(x, y, hits) ) {
world = hits.begin()->getWorldIntersectPoint();
// convert to map coords: GeoPoint mapPoint;
mapPoint.fromWorld( _terrain->getSRS(), world );
// do an elevation query:
double query_resolution = 0; // 1/10th of a degree double out_hamsl = 0.0;