osgearth学习文档(2)

2019-01-27 21:12

double out_resolution = 0.0;

bool ok = _query.getElevation( mapPoint, out_hamsl,

query_resolution, &out_resolution );

if ( ok ) {

// convert to geodetic to get the HAE: mapPoint.z() = out_hamsl;

GeoPoint mapPointGeodetic( s_mapNode->getMapSRS()->getGeodeticSRS(), mapPoint );

static LatLongFormatter s_f;

s_posLabel->setText( Stringify() << std::fixed << std::setprecision(2)

<< s_f.format(mapPointGeodetic.y(), true) << \

<< s_f.format(mapPointGeodetic.x(), false) );

s_mslLabel->setText( Stringify() << out_hamsl );

s_haeLabel->setText( Stringify() << mapPointGeodetic.z() ); s_resLabel->setText( Stringify() << out_resolution );

yes = true; }

// finally, get a normal ISECT HAE point. GeoPoint isectPoint;

isectPoint.fromWorld( _terrain->getSRS()->getGeodeticSRS(), world ); s_mapLabel->setText( Stringify() << isectPoint.alt() ); }

if (!yes) {

s_posLabel->setText( \ s_mslLabel->setText( \ s_haeLabel->setText( \ s_resLabel->setText( \ }

}

其中的osgUtil::LineSegmentIntersector是直线与场景图交点的实体类。

而其中的hits是多集。因为typedef std::multiset osgUtil::LineSegmentIntersector::Intersections,osgUtil::LineSegmentIntersector::Intersections hits。

然后计算交点的三维坐标值:view->computeIntersections(x, y, hits)。将此交点转换成世界坐标X,Y,Z:world = hits.begin()->getWorldIntersectPoint(),再将世界坐标转换成地理相关的三维坐标:GeoPoint mapPoint; mapPoint.fromWorld( _terrain->getSRS(), world );然后进行高程的查询:

bool ok = _query.getElevation( mapPoint,out_hamsl,query_resolution,&out_resolution ); 然后再重新构建地理坐标:

GeoPoint mapPointGeodetic( s_mapNode->getMapSRS()->getGeodeticSRS(), mapPoint ); 此处对getSRS,getMapSRS以及getGeodeticSRS进行区别。

getSRS():得到与地形相关的地图的空间参照系。它是osgEarth::Terrain 类的成员函数。此类表示与现场地形图的交互服务。它跟Map model(地图模型)不同,地图代表了地形参数的数据支持,而Terrian代表了内存中实际的几何图形。通过getSRS()得到的空间参考系是以单元组织的地图坐标值。

getMapSRS():得到地图的空间参照系。它是osgEarth::MapNode类的成员函数。此类主要是利用osg中的node建立osgearth中map的根节点。

getGeodeticSRS():得到当前空间参照系的地理空间参照系。它是osgEarth::SpatialReference类的成员函数。osgEarth::SpatialReference类是SpatialReference持有描述参考椭球体/数据的信息和地理空间数据的投影。

然后将得到的地理三维坐标转换成经纬度: static LatLongFormatter s_f; s_f.format(mapPointGeodetic.y(), true);s_f.format(mapPointGeodetic.x(), false)。 最好得到相应的法线与椭球体的交点: GeoPoint isectPoint;

isectPoint.fromWorld( _terrain->getSRS()->getGeodeticSRS(), world ); 2015/12/22

1.坐标系统的区别 世界坐标系:

世界坐标系是一个特殊的坐标系统,它建立了描述其他坐标系所需的参考框架。它可以用来描述其他的坐标系的位置。它能够描述整个场景中的所有对象。世界坐标系的位置是绝对的,它为所有对象的位置提供一个绝对的参考标准,从而避免物体之间的独立的坐标系统之间的混乱。 物体坐标系:

物体坐标是每个物体特定的坐标系,因为每个对象包含了顶点坐标以及其纹理坐标等,如果每个坐标都相对于世界坐标来进行变换将会非常困难,而且坐标的精度也不够高,如果每个对象都建立自己的物体坐标系,而只需通过物体坐标系相对于世界坐标系的变换即可描述物体的。 摄像机坐标系:

摄像机坐标系是和观察者密切相关的坐标系,摄像机坐标系和屏幕坐标系相似,差别在于摄像机坐标系处于3D空间中。它可视为特殊的物体坐标,该物体坐标系统定义在摄像机的屏幕区域。摄像机坐标系描述的是哪些物体应该渲染并显示在屏幕上,主要包括物体是否在摄像机坐标区域内,物体的渲染顺序和物体的遮挡渲染等。

2015/12/23

1.osgEarth::TileSource 2015/12/24

1.osgEarth::ProgressCallback 是一个通用接口类,针对函数进行进程的报告。 2. osg::Image Class。封装存储的纹理图像数据。

3. osgEarth::TileKey类.相对于轮廓,唯一的标识地图上的瓦片数据。轮廓从左上角的0,0点开始

4. osgEarth::Symbology::GeometryRasterizer。使用软件渲染路径将几何图形绘制到画布上。 5. osgEarth::ImageLayerOptions 。初始化图像层的选项 2015/12/25

1.osgEarth::HTTPClient Class 。工具类的HTTP访问

2. osgDB::Registry。注册表是一个单例的工厂模式,存储运行时读取的非内部文件。 3. osgEarth::Bounds Class 。表示匿名的边界。 2015/12/27

1. osgEarth::Drivers::OGRFeatureOptions 。 2. osgEarth::Features::FeatureSource。

2015/12/29

1. osgEarth::Util::EarthManipulator Class。可编程的操作器,适用于使用地理地形 2.

解读osgViewer/ViewerBase.cpp中的osgViewer::ViewerBase::frame()。 在这个函数中主要有5个过程: 1)、如果这是仿真系统启动后的第一帧,则执行 viewerInit();此时如果还没有执行 realize()函数,则执行它。 2)、执行 advance 函数。 3)、执行 eventTraversal 函数,顾名思义,这个函数将负责处理系统产生的各种事件,诸

如鼠标的移动,点击,键盘的响应,窗口的关闭等等,以及摄像机与场景图形的事件回调( EventCallback)。 4)、执行 updateTraversal 函数,这个函数负责遍历所有的更新回( UpdateCallback); 除此之外,它的另一个重要任务就是负责更新 DatabasePager 与 ImagePager 这两个重要的分页数据处理组件。 5)、执行 renderingTraversals 函数,这里将使用较为复杂的线程处理方法,完成场景的筛

下面对viewerInit()这个函数进行解读。它就是调用 View::init()函数。View::init 函数中出现了两个重要的类成员变量:_eventQueue和_cameraManipulator,并且还将一个 osgGA::GUIEventAdapter 的实例传入后者的初始化函数。 代码如下:

osg::ref_ptr initEvent = _eventQueue->createEvent(); initEvent->setEventType(osgGA::GUIEventAdapter::FRAME); if (_cameraManipulator.valid()) {

_cameraManipulator->init(*initEvent, *this);

}

_eventQueue是存储该视景器的事件队列。OSG中代表事件的类是

osgGA::GUIEventAdapter,它可以用于表达各种类型的鼠标、键盘、触压笔和窗口事件。重写handle函数的方法,获取实时的鼠标/键盘输入,并进而实现相应的用户代码。_cameraManipulator就是视景器中所用的场景漫游器的实例。一般的情况下是通过setCameraManipulator来进行场景漫游器的设置,而如果要自定义相应的场景漫游器,我们通过覆写并使用 osgGA::MatrixManipulator::init 就可以灵活地初始化自定义漫游器的功能。

因此在viewerInit()函数中的调用关系如下图所示:osgViewer::Viewer::viewerInit函数调用osgViewer::View::init,在init函数中调用osgGA::EventQueue::createEvent来创建事件的列表,同时通过osgGA::MatrixManipulator::init来对场景的漫游器进行操作。

osgViewer::Viewer::viewerInit()osgViewer::View::init()osgGA::EventQueue::createEvent()2015/12/30

osgGA::MatrixManipulator::init() 1.加载矢量图

如何通过EarthFile文件创建地图。 Earth File 的核心作用是指明以下 3 点:

1.你创建的地图类型( geocentric 或 projected) 2.可使用的图像、三面图 elevation、矢量和模型数据 3.你的数据缓存在哪里

earthFile中可以加载简单的图像层,可以加载多重图像层次,将多个image元素加到earthFile文件中。在加载多重图像层的时候,需要指定相应的顺序,定义多个图像源时,它们在该 earth 文件中指定的顺序是从在底部到顶部的。

OsgEarth中加载矢量数据,Feature Geometry OSG的几何渲染矢量数据。

元素定义了一个矢量数据源,渲染矢量特征数据的模型层要求一个特征源。 name可读的特征数据源名称。如果您使用全局样式设置所要渲染的特征数据的外观,那么这个名字,样式将要使用到。

driver 读取特征数据的驱动插件名称。 2016/1/4

1.Osgearth_package 打包输出数据

1>OsgDB中的std::string concatPaths(const std::string& left, const std::string& right); 这个函数的作用是将两个路径连接起来。

2>osgEarth::ImageLayer Class。表示包含位图数据的地图地形层。它的继承关系如下图:

3>osgEarth::ElevationLayer Class.表示包含高程网格的地图地形层。继承关系如下:

4>osgEarth::Util::TMSPackager Class。此类的作用是从imageLayer和elevationLayer中读取瓦片数据,然后基于磁盘瓦片资源库将瓦片数据存储起来。

此类中的函数void TMSPackager::run( TerrainLayer* layer, Map* map )起着至关重要的作用。下面对这个函数进行详细的分析。

void TMSPackager::run( TerrainLayer* layer, Map* map )

此函数主要是从基本的TileKey获得图像数据。此函数的主要过程如下所示: 第一步是获取所有的root TileKey. std::vector rootKeys;

map->getProfile()->getRootKeys( rootKeys ); 第二步是获取瓦片,弄清楚图像的尺寸大小。

ImageLayer* imageLayer = dynamic_cast(layer);

ElevationLayer* elevationLayer = dynamic_cast(layer); 这里是利用dynamic_cast进行基类的指针转换到子类的指针,转换过程中进行动态类型检查,比static_cast向下转换更加安全。

第三步是如果层的名字存在则直接读取,否则设置一个默认的名字。

其中分别就imageLayer和elevationLayer来进行判断,得到相应的文件的后缀名,来设置瓦片的大小。

最后一步是设置TMS处理器handler。在初始化时用到了类:

osgEarth::Util::WriteTMSTileHandler Class。此类是TMS处理器,按照TMS格式从层中输出瓦片数据,并按照TMS结构封装瓦片数据。此类的继承关系如下图所示:


osgearth学习文档(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:谈木偶艺术的多元化

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: