ArcGIS Engine 10.0 for.NET开发学习笔记(八)

来源:互联网 发布:mac怎么查看隐藏文件夹 编辑:程序博客网 时间:2024/06/07 11:31
【地图基本操作】
一、要素选择操作
要素选择可快速拾取地理要素,并进行要素的相关操作,如缩放至选择、属性信息等。这里主要讲以下三个功能:要素选择、缩放至选择、清除选择。
1、要素选择
以矩形框或者点选的方式对地图中的要素进行选择,用到IMap接口的SelectByShape方法,该方法可以查询到与输入的形状相交的图层中的所有IFeatureLayer接口类型的Features,但有一个前提是该FeatureLayer图层的Selectable属性为true。
实现思路如下:
(1)使用MapControl的TrackRectangle方法绘制矩形框,当矩形框为空时,则将鼠标当前点击点向外扩展为矩形框作为选择区域。
(2)然后使用IMap接口的SelectByShape方法进行要素的选择。
核心代码如下:
IEnvelope pEnv = mainMapControl.TrackRectangle();                        IGeometry pGeo = pEnv as IGeometry;                        //矩形框若为空,即为点选时,对点范围进行扩展                        if (pEnv.IsEmpty == true)                        {                            tagRECT r;                            r.left = e.x - 5;                            r.top = e.y - 5;                            r.right = e.x + 5;                            r.bottom = e.y + 5;                            pActiveView.ScreenDisplay.DisplayTransformation.TransformRect(pEnv, ref r, 4);                            pEnv.SpatialReference = pActiveView.FocusMap.SpatialReference;                        }                        pGeo = pEnv as IGeometry;                        mainMapControl.Map.SelectByShape(pGeo, null, false);                        mainMapControl.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);

也可以调用ArcEngine的类库资源ControlsSelectFeaturesTool实现该功能,核心代码如下:
mainMapControl.CurrentTool = null;            ControlsSelectFeaturesTool pTool = new ControlsSelectFeaturesToolClass();            pTool.OnCreate(mainMapControl.Object);            mainMapControl.CurrentTool = pTool as ITool;

2、缩放至选择
实现思路如下:
(1)遍历地图中选中的要素。
(2)使用IEnvelop接口的Union方法获取所有选中要素的外包框范围,使地图视图缩放至该范围。
核心代码如下:
int nSlection = mainMapControl.Map.SelectionCount;            if (nSlection == 0)            {                MessageBox.Show("请先选择要素!", "提示");            }            else            {                ISelection selection = mainMapControl.Map.FeatureSelection;                IEnumFeature enumFeature = (IEnumFeature) selection;                enumFeature.Reset();                IEnvelope pEnvelope = new EnvelopeClass();                IFeature pFeature = enumFeature.Next();                while (pFeature != null)                {                    pEnvelope.Union(pFeature.Extent);                    pFeature = enumFeature.Next();                }                pEnvelope.Expand(1.1, 1.1, true);                mainMapControl.ActiveView.Extent = pEnvelope;                mainMapControl.ActiveView.Refresh();            }

也可以调用ArcEngine的类库资源ControlsZoomToSelectesCommand实现该功能,核心代码如下:

            ICommand pCommand = new ESRI.ArcGIS.Controls.ControlsZoomToSelectedCommandClass();            pCommand.OnCreate(mainMapControl.Object);            pCommand.OnClick();

3、清除选择
清除当前选中的要素,核心代码如下:

IActiveView pActiveView = mainMapControl.ActiveView;            pActiveView.FocusMap.ClearSelection();            pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, pActiveView.Extent);

也可以调用ArcEngine的类库资源ControlsClearSelectionCommand实现该功能,核心代码如下:

            ICommand pCommand = new ESRI.ArcGIS.Controls.ControlsClearSelectionCommandClass();            pCommand.OnCreate(mainMapControl.Object);            pCommand.OnClick();


二、数据视图与布局视图的同步
数据视图与布局视图的同步,首先要保证数据的一致性,其次是数据显示范围的一致性。该同步主要涉及IMapControl接口的OnMapReplaced事件和OnAfterScreenDraw事件。
1、OnMapReplaced事件
OnMapReplaced事件发生在MapControl的地图被替换后,即在IMapControl接口的Map被另一个地图替换时(如IMapControl接口的LoadMxFile方法被调用时或Map属性被明确替换时)触发该事件。
2、OnAfterScreenDraw事件
OnAfterScreenDraw事件发生在MapControl内的地图完成绘制之后,即在IDisplayEvents接口的DisplayFinished事件之后被触发,而IDisplayEvents接口的DisplayFinished事件则在地图显示于屏幕时被触发。
实现思路如下:
(1)当数据视图的范围发生变化时,获得此时数据视图的范围。
(2)传到布局视图控件的视图中,同时使用数据复制的方法保证数据的一致性。
核心代码如下:
private void CopyToPageLayout()        {            IObjectCopy pObjectCopy = new ObjectCopyClass();            object copyFromMap = mainMapControl.Map;            object copiedMap = pObjectCopy.Copy(copyFromMap);//复制地图到copiedMap中            object copyToMap = axPageLayoutControl.ActiveView.FocusMap;            pObjectCopy.Overwrite(copiedMap, ref copyToMap); //复制地图            axPageLayoutControl.ActiveView.Refresh();        }

当数据视图控件加载的地理数据重绘时,与其联动的布局视图控件的地图范围也需发生相应的变化。在axMapControl控件中的OnAfterScreenDraw事件中获取当前数据视图范围,并传到axPageLayoutControl控件的ActiveView对象的FocusMap中,同时调用数据复制的方法。核心代码如下:

IActiveView pActiveView = (IActiveView)axPageLayoutControl.ActiveView.FocusMap;            IDisplayTransformation displayTransformation = pActiveView.ScreenDisplay.DisplayTransformation;            displayTransformation.VisibleBounds = mainMapControl.Extent;            axPageLayoutControl.ActiveView.Refresh();            CopyToPageLayout();


0 0