ArcEngine下架空线之悬链线的模拟

35 篇文章 3 订阅
31 篇文章 2 订阅

最近在做电力方面的东西,需要对架空线进行三维建模。经过前端时间的搜索与实践,最终实现了AE下悬链线的模拟。首先说明几个问题:

(1)实地架设杆塔时,两个相邻杆塔的高程一般是不相同的,这就需要用到不等高悬点架空线的悬链线方程,在线路三维建模时要进行点位的判断

(2)在计算悬链线高度时要进行三维空间XYZ到二维空间ZU的转换,这里的u坐标轴是杆塔连线在XY平面的投影,zu所在三维空间Z=低悬点的高程值。

(3)采样精度设置为1。采样完成后将二维点再转换成三维点即可。

这里用AE写了一个类,用于悬链线的生成,公式主要参考《架空输电线路设计- 孟遂民》这本书,没有考虑复杂的温度、风力、覆冰等条件。代码如下:

/// <summary>
    /// 根据起点和终点生成悬链线
    /// 不等高悬点架空线方程
    /// 悬链线长度方程
    /// </summary>
    class PowerLineCreator
    {
        public IPoint FromPoint //起点
        { 
            get; 
            set;
        }
        public IPoint ToPoint   //终点
        { 
            get; 
            set; 
        }

        public double HorizontalStress  //弧垂最低点应力 (已知条件、水平应力)  σ0
        {
            get;
            set;
        }

        public int SampleAccuracy   //插值精度
        {
            get;
            set;
        }
        public double r    //比载:单位长度架空线上所受的荷载折算到单位载面积上的数值
        {
            get;
            set;
        }

        public double PlaneLength//悬链线档距
        {
            get
            {
                double planelength_ = Math.Sqrt(Math.Pow(FromPoint.X - ToPoint.X,2) + Math.Pow(FromPoint.Y - ToPoint.Y,2));
                return planelength_;
            }
            
        }

        public double L  //不等高悬点架空线长度
        {
            get
            {
                return Math.Sqrt(Math.Pow(L_h0,2) + Math.Pow(H,2));
            }
        }
        public double H //   悬点高程差
        {
            get 
            {
                return Math.Abs(FromPoint.Z - ToPoint.Z);    
            }      
        }

        public double L_h0  //等高悬点架空线的档内悬链线长度
        {
            get
            {
                double L = 2 * HorizontalStress / r * Math.Sinh(r * PlaneLength / (2 * HorizontalStress));
                return L;
            }
        }

        public double a   //低悬点至弧垂最低点的水平距离 
        {
            get
            {
                return PlaneLength / 2 - HorizontalStress / r * SpecialFunction.asinh(H / L_h0);
            }
        }

        public double b  //弧垂最低点至高悬点的水平距离
        {
            get
            {
                return L_h0 - a;
            }
        }

        public PowerLineCreator ()
        {
            
        }
        /// <summary>
        /// 悬链线方程
        /// </summary>
        /// <param name="u">二维空间下u坐标</param>
        /// <returns>悬链线高度</returns>
        public double Get_Z (double u) 
        {
            double Z = H / L_h0 * (2 * HorizontalStress / r * Math.Sinh(r * u / 2 / HorizontalStress) * Math.Cosh(r * (L_h0 - u) / 2 / HorizontalStress)) -
                Math.Sqrt(1 + Math.Pow(H / L_h0,2)) * 2 * HorizontalStress / r * Math.Sinh(r * u / 2 / HorizontalStress) * Math.Sinh(r * (L_h0 - u) / 2 / HorizontalStress);
            return Z;
        }
        /// <summary>
        /// 根据起始点生成悬链线插值点
        /// </summary>
        /// <returns></returns>
        public IPointCollection CreateLinePoints ()
        {
            IPointCollection ptCollection = new PolylineClass();
            ILine line_ = new LineClass();
            line_.PutCoords(FromPoint,ToPoint);
            double pAngle = line_.Angle;
            //采样悬链线点
            for(int i = 0;i < PlaneLength-1;i+=SampleAccuracy)
            {
                //二、三维空间坐标的转换
                IPoint point_ = new PointClass();
                (point_ as IZAware).ZAware = true;
                point_.X = FromPoint.X + i * Math.Cos(pAngle);
                point_.Y = FromPoint.Y + i * Math.Sin(pAngle);
                point_.Z = FromPoint.Z + Get_Z(i);
                ptCollection.AddPoint(point_);

            }
            ptCollection.AddPoint(ToPoint);
            
            return ptCollection;
        }

    }

最终实现效果图:

转载请注明出处:http://blog.csdn.net/liushuo_whu/article/details/21323807谢谢!

客户最近打电话过来,说我们的软件在量距离的时候不能平移地图。我们的软件是使用ArcEngine来开发的,在网上输入关键字“arcengine 距离测量”,可以搜索到一大堆内容基本相似的文章或代码,基本上都是采用INewLineFeedback来实现的,我们的软件也是使用此种方法。方法大致如下:写一个距离测量工具,继承自BaseTool,在该类中使用INewLineFeedback动态绘制多段折线,最后转化为Element添加到地图上。如果要增加平移功能,我们仿造ArcMap使用鼠标中键平移,在OnMouseDown、OnMouseMove、OnMouseUp事件中增加判断鼠标中键的语句,然后分别使用PanStart、PanMoveTo、PanStop实现地图的平移。 此时,出现了一个新问题,一旦移动地图后,之前使用INewLineFeedback绘制的线完全乱了方寸,有一部分线丢失了。之后又发现一个更可笑的问题,在绘制的过程中,如果使用alt+tab键切换到其它窗口,然后再切换回地图窗口的时候,会多出一条线,INewLineFeedback把切换窗口前的鼠标位置记录了下来。 对于这个问题,我使用ArcMap的测量工具检查了一下,发现不存在上述问题。但是INewLineFeedback为什么会产生这个bug,难道是本人的使用方法不对。在网上搜了一下其他类似代码进行测试,都存在这个bug。ArcEngine的SDK文档上也没有特别强调INewLineFeedback的使用细节。 本来打算用gdi进行解决,最后发现INewLineFeedback有一个Refresh函数,那么应该在什么地方使用它呢?在ArcMapControl的诸多事件中,尝试了OnAfterDraw、OnAfterScreenDraw、OnViewRefresh等,发现OnAfterScreenDraw是OK的。具体是在OnAfterScreenDraw事件中使用Refresh函数刷新INewLineFeedback,完美解决问题。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值