osgEarth 三维坐标系和地理坐标系

  • Post author:
  • Post category:其他



目录


三维坐标系


地理坐标系


投影坐标系


坐标转换


转换的作用:


转换:


注意:


三维坐标系

三维坐标系以地球球心为原点,三维世界坐标系 x轴正方向由地心指向本初子午线与赤道的交点,y轴正方向由地心指向东经 90° 与赤道交点,z轴正方向由地心指向正北。

地理坐标系

地理坐标系分为:WGS84坐标系、BJ54坐标系、XA80坐标系等等;

对于不同的坐标系,表达位置都用一定偏差。常用WGS84。

地理坐标系用精度纬度高程来表示。

投影坐标系

投影坐标系是为平面坐标系;参考平面是水平面。坐标单位是米、千米。

地理坐标转换到投影坐标可过程可理解为投影。

(投影:将不规则的地球曲面转换为平面)

坐标转换

转换的作用:

  • 当物体直接通过根节点使用 addChild 方法加入到场景后的姿态和位置:

(物体会在地心,导致看不到)

  • 通过经纬高转 xyz 后物体的位置与姿态:

(位置发生变化,但是姿态不会发生变化)

osg::Vec3d world;
osg::EllipsoidModel* em = new osg::EllipsoidModel();    // 椭圆模型节点 (默认是 wgs84)
// 经纬度转xyz  (注意纬度在前面)
em->convertLatLongHeightToXYZ(osg::DegressToRadians(y), osg::DegressToRadians(x), z, world.x(), world.y(), world.z());

  • 通过经纬高转矩阵后的物体位置和姿态:

(位置和姿态都会发生改变)

osg::ref_ptr<osg::CoordinateSystemNode> csn;    // osg坐标系节点
// 经纬度转矩阵 (注意纬度在前面)
csn->getEllipsoidModel()->computeLocalToWorldTransformLatLongHeight(osg::DegressToRadians(y),osg::DegressToRadians(x), z, matrix);

转换:

转化前定义:

osg::EllipsoidModel* em = new osg::EllipsoidModel();    // 椭圆模型节点 (默认是 wgs84)

osg::Vec3d world;        // 世界坐标系

Matrixd matrix;        // 矩阵

x 、y、z 分别代表经度、纬度和高度

世界坐标系转地理坐标系:

// 注意纬度在前面
em->converLatLongHeightToXYZ(osg::DegreesToRadians(world->y()), osg::DegreesToRadians(world->x()), world->z(), x, y, z);

地理坐标系转世界坐标系:

// 注意纬度在前面
em->converXYZToLatLongHeight(x, y, z, osg::DegreesToRadians(world->y()), osg::DegreesToRadians(world->x()), world->z());

世界坐标系转矩阵:

// 注意纬度在前面
em->conputeLocalToWorldTransformFromXYZ(world->y(), world->y(), world->z(), matrix);

地理坐标系转矩阵:

// 注意纬度在前面
em->conputeLocalToWorldTransformFromLatLongHeight(osg::DegreesToRadians(y), osg::DegreesToRadians(y), z, matrix);

注意:

  1. 注意纬度在经度前面
  2. 经度和纬度用 osg::DegreesToRadians() 转化



版权声明:本文为louxiaofei_java原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。