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:绘多边形(三)

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

OSG第二代文件序列化存储分析

花了两天时间仔细研究了一下array贡献的第二代文件序列化存储,收益颇多。今后将得益于它的很强的可扩展性。通过自身的体验,感觉应该还有很多初学者可能需要花费几个小时才能看透,所以特将自己分析的流程发上...

OSGEarth嵌入Qt的QGraphicsView框架(二)

上一篇处理了QGraphicsView的鼠标、按键事件,本篇接着嵌入OSGEarth。 新建一继承自EventAdapter(一)的类GraphicsView,完成OSGEarth的嵌入工作。...

OSGEarth绘制Geometry:绘圆(二)

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

OSG入门即osgEarth建立一个地球的详细步骤

最近在学习有关osg的知识,刚开始一头雾水,幸好在老师的指导下才茅塞顿开,同时又结合网上的多个资料总结 一下作为一个初学者入门的经验。希望广大初学者少走弯路!   开始osg编程之前要做osg的编...

osgearth介绍

介绍 osgEarth为开发osg应用提供了一个地理空间SDK和地形引擎. osgEarth的目标: 提供基于osg开发3D地理空间应用的支持;直接从数据源可视化地形模型和影像变得更加简单;提供对开...

osg和osgEarth编译X86VS2013

OSG和OE编译方法,使用VS2013编译32位
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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