AE+C#控制Globe操作范围

原创 2013年12月05日 10:28:39

在实际的Globe操作过程中,都希望能够控制当前场景的范围,即使是误操作超出了范围也能够快速的自动的回到初始的范围。以下代码根据图层的范围控制显示操作的范围,一旦超出图层的范围,根据重绘事件监听,将当前地图范围重置到初始化范围。

 

    系统环境:Win7 64位旗舰版

       GIS环境:ArcEngine 10 sp4

    开发环境:VS 2012 SP1C#

 

1、在frmMain主窗体中声明IGlobeDisplayEvents_Event事件

 

privateIGlobeDisplayEvents_Eventm_pGlobeDisplayEvents = null;

 

2、在窗体初始化的时候,对m_pGlobeDisplayEvents也进行初始化

 

        public frmMain()

        {

           InitializeComponent();

 

            IGlobe pGlobe = globeCtrl3D.Globe;//globeCtrl3DGlobe控件

            m_pGlobeDisplayEvents= pGlobe.GlobeDisplay asIGlobeDisplayEvents_Event;

           m_pGlobeDisplayEvents.AfterDraw += newIGlobeDisplayEvents_AfterDrawEventHandler(m_pGlobeDisplayEvents_AfterDraw);

           

        }

 

3、重写m_pGlobeDisplayEvents_AfterDraw事件

 

        publicvoid m_pGlobeDisplayEvents_AfterDraw(ISceneViewer pViewer)

        {

            try

            {

                IGlobeCamera pGlobeCamera =globeCtrl3D.GlobeCamera;

                double dObserverLatDD = 0.0;

                double dObserverLonDD = 0.0;

                double dObserverAltKMs = 0.0;

 

               pGlobeCamera.GetObserverLatLonAlt(out dObserverLatDD, out dObserverLonDD, out dObserverAltKMs);

 

                ILayer layer = Common.GlobeUtil.getLayerFromScene(globeCtrl3D.GlobeDisplay.Scene,"bj");//bj为要控制范围的图层,getLayerFromScene为在GlobeControl中获取相应图层的函数,这里不再赘述

                IEnvelope pInitEnvelope =layer.AreaOfInterest;

                double dXMin = pInitEnvelope.XMin;

                double dXMax = pInitEnvelope.XMax;

                double dYMin = pInitEnvelope.YMin;

                double dYMax = pInitEnvelope.YMax;

                  // 以下判断当前操作是否在图层范围内,高度控制在020公里(可以根据实际情况设置,此时为地上模式;如果想要地下模式可以将其改为负数)

                if ((dObserverLatDD < dYMin) || (dObserverLatDD> dYMax) || (dObserverLonDD < dXMin) || (dObserverLonDD > dXMax)

                    ||(dObserverAltKMs > 20) || (dObserverAltKMs < 0))

                {// 以下为获取初始化的操作范围,该范围设置在App.Config

                    double dInitObserverLatDD = Convert.ToDouble(System.Configuration.ConfigurationSettings.AppSettings["ObserverLatDD"]);

                    double dInitObserverLonDD = Convert.ToDouble(System.Configuration.ConfigurationSettings.AppSettings["ObserverLonDD"]);

                    double dInitObserverAltKMs = Convert.ToDouble(System.Configuration.ConfigurationSettings.AppSettings["ObserverAltKMs"]);

                    double dInitTargetLatDD = Convert.ToDouble(System.Configuration.ConfigurationSettings.AppSettings["TargetLatDD"]);

                    double dInitTargetLonDD = Convert.ToDouble(System.Configuration.ConfigurationSettings.AppSettings["TargetLonDD"]);

                    double dInitTargetAltKMs = Convert.ToDouble(System.Configuration.ConfigurationSettings.AppSettings["TargetAltKMs"]);

 

                   pGlobeCamera.SetObserverLatLonAlt(dInitObserverLatDD,dInitObserverLonDD, dInitObserverAltKMs);

                   pGlobeCamera.SetTargetLatLonAlt(dInitTargetLatDD, dInitTargetLonDD,dInitTargetAltKMs);

                    globeCtrl3D.GlobeDisplay.RefreshViewers();

                }

            }

            catch (Exception ex)

            {

                string msg = ex.Message;

            }

        }

 

4App.Config中的初始化参数为

 

  <appSettings>

    <!--初始化的位置-->

    <addkey="ObserverLatDD"value="-0.056946961416494392" />

    <addkey="ObserverLonDD"value="121.49905414870099" />

    <addkey="ObserverAltKMs"value="3.9120639485526882" />

    <addkey="TargetLatDD"value="-0.028060602957429747" />

    <addkey="TargetLonDD"value="121.49892786453003" />

    <addkey="TargetAltKMs"value="0.5625919130259821" />

……

 

5、以上完成在GlobeControl中控制可操作的范围,如果超出了自动恢复到初始位置。

AE+C#控制Globe操作范围

http://blog.csdn.net/lysc_forever/article/details/7790211 在实际的Globe操作过程中,都希望能够控制当前场景的范围,即使是误操作超...

AE+C#控制Globe操作范围

在实际的Globe操作过程中,都希望能够控制当前场景的范围,即使是误操作超出了范围也能够快速的自动的回到初始的范围。以下代码根据图层的范围控制显示操作的范围,一旦超出图层的范围,根据重绘事件监听,将当...

AE+C#控制影像数据的清晰度和高程数据的平滑度

在ArcGlobe中影响影像清晰度和高程平滑度的因素很多,其中一个是在ArcGlobe中设置ArcGlobe选项中的细节等级     可以根据实际情况调整当前影像的清晰度和高程的平滑度。这里...
  • SYDBC
  • SYDBC
  • 2013年12月05日 13:56
  • 1189

EV-Globe Pro用户操作手册

  • 2011年10月12日 09:47
  • 8.03MB
  • 下载

EV-Globe+Pro用户操作手册

  • 2011年10月23日 12:13
  • 6.38MB
  • 下载

VC控制EXCEL的基本操作之选择范围篇

选择篇 1 选择单元格   //选择一个单元格 range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVa...

用C#+AE实现ArcGIS中的字段统计功

前几天在网上查找资料想实现ArcGIS中的统计功能,也就是Summarise,在费尽一番波折之后,终于在网上找到了解决方案:http://blog.csdn.net/gisoracle/article...

AE+C# SQL属性查询

此功能是通过点击主窗体上的SQL查询按钮SQL属性查询" title="AE+C# SQL属性查询" style="margin:0px; padding:0px; border:0px; list-...

AE C#与C++接口调用差异总结

目前AE C++的开发资料比较少,即使是C#的资料,也不尽如人意。考虑到国内目前做C++ ArcGIS engine开发甚至Qt + AE的人比较少,对于C#+AE出身的人,刚开始尝试QT +AE可能...

C#+AE 创建几何网络

几何网络必须存在数据集中,Engine创建的时候要有geodatabase updata 许可,我的数据库是个人数据库。 先看一下ArcMap是怎么创建的 在catalog中打开创建几个网络的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AE+C#控制Globe操作范围
举报原因:
原因补充:

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