做osgEarth也有段时间,一直没时间静下心来写些东西,今天就把我使用的几种获取相应点的经纬度和高程的几种方法简单地总结一下,
希望各位批评指正互相交流学习。这几种方法在经度方面有不小的差别我会推荐大家使用经度相对较高的一种。
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中获取经纬度和高程数据的方法肯定不止这几种,这里只是简单地总结一下我使用过得几种方法,希望能给大家带来些用处。