查看: 4825|回复: 9

osgdem构建地形,在osg应用程序中怎样获得模型的实际投影坐标

[复制链接]

该用户从未签到

发表于 2013-4-6 20:23:33 | 显示全部楼层 |阅读模式
原有的tif文件的坐标系是经纬度坐标,用gdalinfo查看tif信息如下:
0-40.bmp

使用gdalwarp转换成merctor投影:gdalwarp -t_srs “+proj=merc +datum=WGS84” 0-40.tif  merctor.tif, merctor.tifgdalinfo查看信息如下:
merctor.bmp

然后用osgdemmerctor.tif生成平面模型:osgdem --cs “+proj=merc +datum=WGS84” –xx 10 –yy 10 –v 0.5 –l 3 –o merctor.ive
之后在osg的应用程序中将merctor.ive加入,用osgpick拾取模型:
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
     osg::ref_ptr<osg::Group>group=new osg::Group;
     osg::ref_ptr<osg::Node> node= osgDB::readNodeFile("merctor.ive");
osg::ref_ptr<osg::CoordinateSystemNode> csn=new osg::CoordinateSystemNode;
     csn->setEllipsoidModel(new osg::EllipsoidModel);
     csn->addChild(node);
     csn->setFormat("ROJ4");
csn->setCoordinateSystem("+proj=merc +datum=WGS84");
osg::ref_ptr<osgText::Text> updatetext = new osgText::Text();
     CreateHUD *hudText= new CreateHUD();
     csn->addChild(hudText->createHUD(updatetext.get()));
viewer->setSceneData(csn);
     viewer->addEventHandler(new osgViewer::WindowSizeHandler);
     viewer->addEventHandler(new osgViewer::StatsHandler);
     //添加PICK事件处理器
viewer->addEventHandler(new CPickHandler(updatetext.get()));
其中的CPickHandler拾取相交部分
if (viewer->computeIntersections(x,y,intersections))
     {
osg::ref_ptr<osg::CoordinateSystemNode> csn=dynamic_cast<osg::CoordinateSystemNode*>(viewer->getSceneData()->asGroup());
         osg::EllipsoidModel* em=csn->getEllipsoidModel();
         //得到相交交集的交点
for(osgUtil:ineSegmentIntersector::Intersections::iterator hitr = intersections.begin();hitr != intersections.end();++hitr)
         {
              os<<"Mouse in World  X:"<< hitr->getWorldIntersectPoint().x()<<"Y: "<<
hitr->getWorldIntersectPoint().y()<<"Z: "<< hitr->getWorldIntersectPoint().z()<<std::endl ;
              //转换坐标系
              double x,y,z;
//平面模型能否也用EllipsoidModel取得经纬度坐标?
em->convertXYZToLatLongHeight(hitr->getWorldIntersectPoint().x(),hitr->getWorldIntersectPoint().y(),hitr->getWorldIntersectPoint().z(),y,x,z);
os<<osg::RadiansToDegrees(x)<<"    "<<osg::RadiansToDegrees(y)<<"       "<<z<<std::endl;
//以下是否可以得到模型tif中真实的投影坐标?
osg::Vec3 mercVec=csn->computeLocalUpVector(hitr->getWorldIntersectPoint());
os<<mercVec.x()<<mercVec.y()<<mercVec.z()<<std::endl;
         }
}
上述指定程序的coordinatorsystemsetformsetcoordiantorsystem是否正确,还有用EillpsoidModel能否获取实际经纬度?怎样从鼠标点击点与模型的交点中获取模型如tif中描述的真实的坐标值?

该用户从未签到

发表于 2013-5-14 01:40:39 | 显示全部楼层
本帖最后由 VR_user_happy 于 2013-5-14 02:11 编辑

1.
osg是个3D显示仿真平台,没有所谓的经度和纬度,只有空间坐标
2.
经度和纬度是地球椭球体的经线和纬线化分后得出来的
3.
只有在osg这个显示仿真平台中,载入一个3D的地球椭球体,才会存在对于这个载入椭球体的所谓的经纬度,这个经纬度交叉位置点实际就是对应空间的一个实际坐标点
4.
osgEarth 、googleEarth都是以这种形式为出发点,模拟真实的地球实际参数来考量的。他们中就会有投影计算,实际上他们也大都采用了GDAL作为地理信息处理工具。
5.
osg本身就带有GDAL接口,只要插件正确,你也可以用GDAL库中的函数实现投影作标的读取和投影计算!

6.你上面的例子:
     你创建的节点应该只是一种非3D平面直角坐标系(椭球体坐标系类型下地节点),意思是说,你使用了不同的坐标系统处理空间的位置计算。
     你并没有创建或构件一个仿真地球数学模型作为参照!
    你再把读取的模型node节点addchild()进这个坐标系统,估计就是放在了坐标原点。
   那你怎么PicK点,也只是鼠标与这个模型上的空间点相交吧,怎么能得到,正确的经纬度?
   我想:osgEarth或是GoogleEarth也是通过读取到了*.TIF上的经纬度坐标,再根据参照地球体计算出来的经纬度坐标,做点对点的平移移旋转处理吧,才能把外来读取的地形模型添加到正确的真实空间位置上。

该用户从未签到

发表于 2013-4-15 15:44:53 | 显示全部楼层
顶!

该用户从未签到

发表于 2013-4-17 16:20:38 | 显示全部楼层
三天了,为什么没人回答

该用户从未签到

发表于 2013-5-14 07:58:32 | 显示全部楼层
直接pick只能获得空间的位置 跟经纬度没关系

该用户从未签到

发表于 2013-7-17 20:59:23 | 显示全部楼层
我把 高程和 影像都 转成  merctor投影了,但是出来的地形 是这样的: QQ图片20130717205114.jpg
影像纹理信息:
2.jpg
高程纹理信息:
3.jpg


求高人解答,或则告知一种 用经纬信息的影响和高程 制作以米为单位的 地形 的过程!~ 多谢

该用户从未签到

发表于 2013-7-17 23:01:30 | 显示全部楼层
本帖最后由 ztbls 于 2013-7-17 23:09 编辑
ztbls 发表于 2013-7-17 20:59
我把 高程和 影像都 转成  merctor投影了,但是出来的地形 是这样的:
影像纹理信息:


发现 直接用带经纬度的, 把 像素值对应的 米 给设定对了,也能出 真实比例大小的 地形;
但做完后发现些问题: 影像和高程文件不会再根据经纬度 自动匹配位置,而是都从0,0点开始对应;
                                 这样的后果是:必须采用相同区域的影像文件和高程文件;
                                 请教 VPB大牛,有何方法 即能够做出真实比例大小的地形,有能让影像和高程自动匹配。

现在给所有带经纬的影像文件和高程文件指定了 像素点 长度值出来效果如下:
大的影像和高程匹配(因为它们区域相同),而小的钓鱼岛则还是映射在左下角位置:
QQ图片20130717230224.jpg

该用户从未签到

发表于 2013-7-18 07:02:06 | 显示全部楼层
围观一下

该用户从未签到

发表于 2013-8-7 10:36:36 | 显示全部楼层
现在给所有带经纬的影像文件和高程文件指定了 像素点 长度值出来效果如下:
大的影像和高程匹配(因为它们区域相同),而小的钓鱼岛则还是映射在左下角位置:
===========================
高程数据和纹理数据缩放比例不一样导致的。

该用户从未签到

发表于 2013-8-16 09:54:29 | 显示全部楼层
眼都花了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表