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
然后计算交点的三维坐标值: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
_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的几何渲染矢量数据。
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
map->getProfile()->getRootKeys( rootKeys ); 第二步是获取瓦片,弄清楚图像的尺寸大小。
ImageLayer* imageLayer = dynamic_cast
ElevationLayer* elevationLayer = dynamic_cast
第三步是如果层的名字存在则直接读取,否则设置一个默认的名字。
其中分别就imageLayer和elevationLayer来进行判断,得到相应的文件的后缀名,来设置瓦片的大小。
最后一步是设置TMS处理器handler。在初始化时用到了类:
osgEarth::Util::WriteTMSTileHandler Class。此类是TMS处理器,按照TMS格式从层中输出瓦片数据,并按照TMS结构封装瓦片数据。此类的继承关系如下图所示:
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库osgearth学习文档(2)在线全文阅读。
相关推荐: