osg根据经纬度计算两点之间的距离
时间: 2023-08-30 08:10:27 浏览: 62
在OpenSceneGraph中,可以使用osg::computeLocalToWorld函数将经纬度转换为世界坐标系中的坐标,然后使用osg::Vec3d::distance函数计算两点之间的距离。
以下是一个示例代码:
```cpp
#include <osg/Vec3d>
#include <osg/CoordinateSystemNode>
#include <osg/PositionAttitudeTransform>
double getDistance(double lat1, double lon1, double lat2, double lon2)
{
// 创建两个坐标系节点,一个是地球坐标系,一个是本地坐标系
osg::ref_ptr<osg::EllipsoidModel> ellipsoid = new osg::EllipsoidModel();
osg::ref_ptr<osg::CoordinateSystemNode> earthCS = new osg::CoordinateSystemNode(ellipsoid);
osg::ref_ptr<osg::CoordinateSystemNode> localCS = new osg::CoordinateSystemNode(osg::Vec3d(lat1, lon1, 0.0), osg::Vec3d(lat2, lon2, 0.0));
// 计算两点在世界坐标系中的坐标
osg::Vec3d worldPos1, worldPos2;
osg::computeLocalToWorld(earthCS->getMatrix(), osg::Vec3d(lat1, lon1, 0.0), worldPos1);
osg::computeLocalToWorld(earthCS->getMatrix(), osg::Vec3d(lat2, lon2, 0.0), worldPos2);
// 将世界坐标系中的坐标转换为本地坐标系中的坐标
osg::Vec3d localPos1, localPos2;
osg::ref_ptr<osg::PositionAttitudeTransform> localPAT = new osg::PositionAttitudeTransform();
localPAT->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
localPAT->setPosition(worldPos1);
localPAT->addChild(localCS);
localPAT->getInverseMatrix().transform(worldPos2, localPos2);
// 计算两点之间的距离
return localPos1.distance(localPos2);
}
```
其中,lat1、lon1、lat2、lon2分别表示两个点的纬度和经度,返回值为以米为单位的距离。需要注意的是,上面的代码中使用的是椭球体模型进行计算,而不是真正的地球球体模型,因此计算结果可能会存在一定误差。