osgEarth坐标转换

oe中的世界坐标系原点在地球中心,x轴向右(指向本初子午面),y轴向屏幕里,z向上,也就是说这里的世界坐标系就是地球空间直角坐标系。所以地球初始显示的时候,正对屏幕的是西半球。


double firstlon,firstlat,firsthei;

osg::ref_ptr elpModel=new osg::EllipsoidModel;
   elpModel->convertXYZToLatLongHeight(
    first.x(),first.y(),first.z(),firstlat,firstlon,firsthei);
   double tempx,tempy,tempz;

   elpModel->convertLatLongHeightToXYZ(

    firstlat,firstlon,firsthei+heightRange,tempx,tempy,tempz);


几种获取相应点的经纬度和高程的几种方法简单地总结如下:


1、 这种方法在重写handle函数中用的最多了,先求得世界坐标X、Y、Z,在把它们转换成经纬度和高程数据

osgUtil::LineSegmentIntersector::Intersections inters1;

osg::Vec3d m_TempPoint1;


      ::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)

{

GeoPoint ConvertPoint;

if(m_pViewer->computeIntersections(ea.getX(),ea.getY(),inters1))
{
osgUtil::LineSegmentIntersector::Intersections:: iterator iter1 = inters1.begin();
m_TempPoint1.set(iter1->getWorldIntersectPoint().x(),iter1->getWorldIntersectPoint().y(),iter1->getWorldIntersectPoint().z());
ConvertPoint.fromWorld(m_pGeoSRS,m_TempPoint1);

}

}


2、这种方法在知道经纬度坐标时想求出这点的高程数据时用的比较多。

osg::ref_ptr<osgEarth::MapNode>   m_pMapNode;

osg::Vec3 Vec; //经纬度坐标

double Height=0.0;

m_pMapNode->getTerrain()->getHeight(m_pMapNode->getMapSRS(),Vec.x(),Vec.y(),&Height);

Height 就是在相应经纬度坐标下的高程。但是这种方法求出来的数据精度较低,因为我在我放置模型发现模型的位置有时候会存在较大误差,当和下一种方法比较时发现

误差最大达到几百米,这还是挺惊人的特别是设置了高程夸张系数之后误差又被放大几倍,严重影响精度。

3、这种方法较上两种方法精度都比较高,使用时发现能满足要求。


double query_resolution = 0.00000001; 
double out_hamsl        = 0.0;
double out_resolution   = 0.0;
osgEarth::ElevationQuery query(m_pMap.get());
query.getElevation(GeoPoint(m_pMapNode->getMapSRS(),103.50,31.50,0.0,osgEarth::AltitudeMode::ALTMODE_RELATIVE),
out_hamsl,
query_resolution, 
&out_resolution );

out_hamsl        就是经度在103.5°和维度在31.50°的高程,这里注意一下query_resolution 这个参数,其实奥妙就在这里,如果把它设置成0.1时,它表示数据获取精度是0.1°所以获得高程数据也是有较大误差的,如果设置成0.00000001时,它表示的获取精度是0.00000001°,所以这个参数设置小一些就能提高数据获取精度满足要求。如果大家在开发中需要获取较高精度的高程数据比如放置一个模型在地球上就可以使用这种方法。

osgEarth中获取经纬度和高程数据的方法肯定不止这几种,这里只是简单地总结一下我使用过得几种方法,希望能给大家带来些用处。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值