OSGEarth的测量分析

原创 2015年07月10日 21:09:24

我的测量有距离测量、面积测量、高度测量。
测量的结果显示都为一个PlaceNode,可以实时的显示测量的结果。
使用方式为:

pPlaceNode = new osgEarth::Annotation::PlaceNode(
            MapNode, osgEarth::GeoPoint::GeoPoint(), "", textStyle);
pPlaceNode->setDynamic(true);
pPlaceNode->setText("测量结果");
pPlaceNode->setPosition(osgEarth::GeoPoint::GeoPoint(SRS, pos("经纬度")));
  • 长度的计算方式使用OSGEarth提供的方式osgEarth::GeoMath::distance()
  • 高度的测量直接两个点的高度差即可;
  • 面积的测量,比较麻烦,考虑到需要计算球面的面积,因而需要实现计算方式。附上一个从网上找到的计算方式,由于忘记了原网站,请见谅!

    网上内容,非原创算法
    for (int i = 0; i < iCount; i++)
        {
            if (i == 0)
            {
                //换算成弧度;
                dLowX = osg::DegreesToRadians(points.at(iCount - 1).x());
                dLowY = osg::DegreesToRadians(points.at(iCount - 1).y());
                dMiddleX = osg::DegreesToRadians(points.at(0).x());
                dMiddleY = osg::DegreesToRadians(points.at(0).y());
                dHighX = osg::DegreesToRadians(points.at(1).x());
                dHighY = osg::DegreesToRadians(points.at(1).y());
            }
            else if (i == iCount - 1)
            {
                dLowX = osg::DegreesToRadians(points.at(iCount - 2).x());
                dLowY = osg::DegreesToRadians(points.at(iCount - 2).y());
                dMiddleX = osg::DegreesToRadians(points.at(iCount - 1).x());
                dMiddleY = osg::DegreesToRadians(points.at(iCount - 1).y());
                dHighX = osg::DegreesToRadians(points.at(0).x());
                dHighY = osg::DegreesToRadians(points.at(0).y());
            }
            else
            {
                dLowX = osg::DegreesToRadians(points.at(i - 1).x());
                dLowY = osg::DegreesToRadians(points.at(i - 1).y());
                dMiddleX = osg::DegreesToRadians(points.at(i).x());
                dMiddleY = osg::DegreesToRadians(points.at(i).y());
                dHighX = osg::DegreesToRadians(points.at(i + 1).x());
                dHighY = osg::DegreesToRadians(points.at(i + 1).y());
            }
            AM = cos(dMiddleY) * cos(dMiddleX);
            BM = cos(dMiddleY) * sin(dMiddleX);
            CM = sin(dMiddleY);
            AL = cos(dLowY) * cos(dLowX);
            BL = cos(dLowY) * sin(dLowX);
            CL = sin(dLowY);
            AH = cos(dHighY) * cos(dHighX);
            BH = cos(dHighY) * sin(dHighX);
            CH = sin(dHighY);
    
            dCoefficientL = (AM*AM + BM*BM + CM*CM) / (AM*AL + BM*BL + CM*CL);
            dCoefficientH = (AM*AM + BM*BM + CM*CM) / (AM*AH + BM*BH + CM*CH);
    
            dALtangent = dCoefficientL * AL - AM;
            dBLtangent = dCoefficientL * BL - BM;
            dCLtangent = dCoefficientL * CL - CM;
            dAHtangent = dCoefficientH * AH - AM;
            dBHtangent = dCoefficientH * BH - BM;
            dCHtangent = dCoefficientH * CH - CM;
    
            dAngleCos = (dAHtangent * dALtangent + dBHtangent * dBLtangent + dCHtangent * dCLtangent) /
                (sqrt(dAHtangent * dAHtangent + dBHtangent * dBHtangent + dCHtangent * dCHtangent) *
                sqrt(dALtangent * dALtangent + dBLtangent * dBLtangent + dCLtangent * dCLtangent));
    
            dAngleCos = acos(dAngleCos);
    
            dANormalLine = dBHtangent * dCLtangent - dCHtangent * dBLtangent;
            dBNormalLine = 0 - (dAHtangent * dCLtangent - dCHtangent * dALtangent);
            dCNormalLine = dAHtangent * dBLtangent - dBHtangent * dALtangent;
    
            if (AM != 0)
            {
                dOrientationValue = dANormalLine / AM;
            }
            else if (BM != 0)
            {
                dOrientationValue = dBNormalLine / BM;
            }
            else
            {
                dOrientationValue = dCNormalLine / CM;
            }
            if (dOrientationValue > 0)
            {
                dSum1 += dAngleCos;
                iCount1++;
            }
            else
            {
                dSum2 += dAngleCos;
                iCount2++;
            }
        }
        if (dSum1 > dSum2)
        {
            dSum = dSum1 + (2 * osg::PI*iCount2 - dSum2);
        }
        else
        {
            dSum = (2 * osg::PI*iCount1 - dSum1) + dSum2;
        }
    
        dTotalArea = (dSum - (iCount - 2)*osg::PI)* osg::WGS_84_RADIUS_EQUATOR *
            osg::WGS_84_RADIUS_EQUATOR;
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。

OSGEarth绘制Geometry:画线(一)

在OSGEarth中绘制线,首先考虑osgEarth::Annotation::FeatureNode。 功能描述如下: 1. 鼠标两次点击的点之间连线,为黄色的实线; 2. 最近一次点击的点和...
  • chlk118
  • chlk118
  • 2015年07月09日 21:18
  • 5916

OSGEarth绘制Geometry:绘圆(二)

功能描述如下: 1. 鼠标点击之处为圆心位置; 2. 以圆心到鼠标move的距离为半径绘圆; 3. 鼠标有点点击结束绘制; 4. 鼠标点击为新的圆心,继续下次绘制。 代码如下:draw...
  • chlk118
  • chlk118
  • 2015年07月09日 21:58
  • 2848

OSGEarth绘制Geometry:绘多边形(三)

功能描述如下: 1. 鼠标多次点击的区域绘制多边形,为黄色; 2. 最近一次点击的点以及第一次点击的点和鼠标move到的点之间连线,为两条红色的虚线,表示下次即将绘制的区域块。 代码如下:...
  • chlk118
  • chlk118
  • 2015年07月09日 22:38
  • 2962

osgEarth开发之三维矢量数据的鼠标选择功能

首先,为了可以实现矢量数据的选择,在矢量数据的加载过程中earth文件需要包含 true 否则,选择不成功 或者在程序中添加代码 osgEarth::Features::FeatureSource...

不改源码的方式实现osgearth当中placenode的中文支持

使用osgearth的人越来越多,开源的工程大家都喜欢。osgearth的底层引擎是OSG,OSG中文支持良好,但osgearth里面直接舍弃了wstring,中文没法显示,让很多程序员很蛋疼。很多情...

osgearth earth文件规范-Features&Symbology(要素与符号)

osg渲染引擎实现了仿真的基础功能,使用osg可以帮助我们快速实现仿真效果,osgEarth致力于数字地球的仿真实现,现已实现大量地理信息相关的算法,是数字城市仿真、三位地理信息的利器,但是目前还没有...

osgEarth获取经纬度和高程的几种方法

转载自:http://blog.csdn.net/xiaol_deng/article/details/23555249 做osgEarth也有段时间,一直没时间静下心来写些东西,今天就把我...
  • luffv
  • luffv
  • 2014年07月01日 10:40
  • 2101

osgEarth常见的应用(怎样在地图上放置模型)

官方介绍了一种放置3D模型的方法是使用ModelNode. using namespace osgEarth; using namespace osgEarth::Symbology; ... ...

像素和毫米怎么换算啊??

from: http://zhidao.baidu.com/link?url=31rPR5103kIzSqDuSZWp8K48UPfIzd6S2WDBId443UgUaikWoiRHF9cC-pSS...

不改源码的方式实现osgearth当中placenode的中文支持

使用osgearth的人越来越多,开源的工程大家都喜欢。osgearth的底层引擎是OSG,OSG中文支持良好,但osgearth里面直接舍弃了wstring,中文没法显示,让很多程序员很蛋疼。很多情...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OSGEarth的测量分析
举报原因:
原因补充:

(最多只允许输入30个字)