PIE SDK专题制图下地图的的操作

1.    功能简介

    制图模式和地图模式下用的地图是同一份地图,那么在制图模式下如果需要对地图进行操作(例如地图的拉框放大,缩小),那么该如何操作呢,地图范围视图变化在制图模式下该如何监听呢,下面主要介绍PIE SDK如何在制图模式下如何对地图进行操作。

2. 功能实现说明

2.1 制图下地图范围的监听

    制图模式用的是制图控件PageLayoutControl,制图控件里面的又包含了一个Map,这个Map中的数据和地图模式控件MapControl的Map的数据是同一份,获取地图模式的地图我们可以写成MapControl.ActiveView.FocusMap或者MapControl.FocusMap;那么制图模式中的地图也是同理,即PageLayoutControl.ActivewView.FocusMap或者PageLayoutControl.FocusMap;

    对制图模式下地图范围的监听,就需要对制图模式的视图变化进行监听,那么就需要PIE SDK中IActiveViewEvents事件接口,IactiveViewEvents接口下有很多关于地图的事件,如地图添加,删除,范围更新,空间参考发生变化等,下面以地图视图范围发生变化为例讲述如何使用该接口

 1 /// <summary>
 2 /// 制图模式下对地图范围变化的监听
 3 /// </summary>
 4 /// <param name="sender"></param>
 5 /// <param name="e"></param>
 6 private void tbn_MapExtentListening_Click(object sender, EventArgs e)
 7 {
 8 IActiveViewEvents activeViewEvents = pageLayoutControl1.ActiveView.FocusMap as IActiveViewEvents;
 9     activeViewEvents.OnViewRefreshed += FormMain_OnViewRefreshed;
10 }
11 
12 /// <summary>
13 /// 监听事件
14 /// </summary>
15 void FormMain_OnViewRefreshed()
16 {
17     string spatialRefence = pageLayoutControl1.FocusMap.SpatialReference.Name; MessageBox.Show(string.Format("地图范围刷新变化,当前地图的参考坐标为:{0}", spatialRefence));
18 }

2.2 制图模式下对地图范围的控制

    在制图模式下,一般情况需要对地图进行控制,一般都是范围控制,主要考虑两个方面,一个是对制图控件进行控制,二是对制图下的地图进行控制。

    如对地图的拉框放大功能,需要鼠标与地图进行交互, 鼠标按下后移动绘制拉框的过程是显示在在制图控件上的,但是鼠标弹起时效果却是要制图控件的框不变,将框内的地图范围进行改变,鼠标按下触发MouseDown事件,移动触发MouseMove事件,当鼠标弹起触发MouseUp事件后拉框绘制完成,将拉框的范围设置为地图的显示范围,这样就完成一次拉框放大操作。

  1      /// 标识
  2       private int m_Flag = 0;
  3       /// 开始点
  4       private IPoint m_StartPoint;
  5      /// 结束点
  6      private IPoint m_EndPoint;
  7      /// 是否锁定(判断当前鼠标移动时是否是鼠标按下未抬起状态)
  8      private bool m_Lock = false;
  9      /// 制图模式下地图ActiveView
 10      private IActiveView m_PageMapActiveView = null;
 11 可以写在地图初始化里面:
 12 PageMapActiveView= pageLayoutControl1.FocusMap as IActiveView;
 13 /// <summary>
 14 /// 制图模式下对地图范围的操作(以地图放大为例)
 15 /// </summary>
 16 /// <param name="sender"></param>
 17 /// <param name="e"></param>
 18 private void tbn_MapZoomInControl_Click(object sender, EventArgs e)
 19 {
 20     m_Flag = 1;//m_Flag是全局变量
 21 }
 22 
 23 /// <summary>
 24 /// 制图模式下鼠标按下事件
 25 /// </summary>
 26 /// <param name="sender"></param>
 27 /// <param name="e"></param>
 28 private void pageLayoutControl1_MouseDown(object sender, MouseEventArgs e)
 29 {
 30     if (m_Flag == 1)
 31     {
 32         m_StartPoint = m_PageMapActiveView.DisplayTransformation.ToMapPoint(e.X, e.Y);
 33         m_Lock = true;
 34     }
 35 }
 36 /// <summary>
 37 /// 制图模式下鼠标弹起事件
 38 /// </summary>
 39 /// <param name="sender"></param>
 40 /// <param name="e"></param>
 41 private void pageLayoutControl1_MouseUp(object sender, MouseEventArgs e)
 42 {
 43     if (m_StartPoint == null) return;
 44     m_Lock = false;
 45     IEnvelope envelop = new Envelope();
 46  
 47     m_EndPoint = m_PageMapActiveView.DisplayTransformation.ToMapPoint(e.X, e.Y);//将制图模式的屏幕坐标转换成地图坐标
 48     System.Drawing.Point point = m_PageMapActiveView.DisplayTransformation.FromMapPoint(m_StartPoint.X, m_StartPoint.Y);
 49     IPoint startPoint = m_PageMapActiveView.DisplayTransformation.ToMapPoint(point.X, point.Y);
 50     envelop.PutCoords(startPoint.X, startPoint.Y, m_EndPoint.X, m_EndPoint.Y);
 51 
 52     m_PageMapActiveView.Extent = envelop;
 53     pageLayoutControl1.PartialRefresh(ViewDrawPhaseType.ViewAll);
 54     m_StartPoint = null;
 55 }
 56 /// <summary>
 57 /// 制图模式下鼠标移动事件
 58 /// </summary>
 59 /// <param name="sender"></param>
 60 /// <param name="e"></param>
 61 private void pageLayoutControl1_MouseMove(object sender, MouseEventArgs e)
 62 {
 63     if (m_StartPoint == null || e.Button != MouseButtons.Left) return;
 64     if (m_Lock == true)//鼠标拉框按下未抬起
 65     {
 66         //将坐标转换成制图模式地图的坐标
 67         System.Drawing.Point point = m_PageMapActiveView.DisplayTransformation.FromMapPoint(m_StartPoint.X, m_StartPoint.Y);
 68         IPoint startPoint = pageLayoutControl1.ActiveView.DisplayTransformation.ToMapPoint(point);//屏幕坐标转换成制图坐标(不是制图中的地图坐标)
 69         m_EndPoint = pageLayoutControl1.ActiveView.DisplayTransformation.ToMapPoint(e.X, e.Y);
 70         //空间范围
 71         IPointCollection polygon = new Polygon();
 72         polygon.AddPoint(startPoint.X, startPoint.Y);
 73         polygon.AddPoint(m_EndPoint.X, startPoint.Y);
 74         polygon.AddPoint(m_EndPoint.X, m_EndPoint.Y);
 75         polygon.AddPoint(startPoint.X, m_EndPoint.Y);
 76         polygon.AddPoint(startPoint.X, startPoint.Y);
 77 
 78         //符号样式
 79         ILineSymbol lineSymbol = new SimpleLineSymbol();
 80         lineSymbol.Color = System.Drawing.Color.Red;
 81         lineSymbol.Width = 1;
 82 
 83         IFillSymbol fillSymbol = new SimpleFillSymbol();
 84         fillSymbol.OutlineSymbol = lineSymbol;
 85         fillSymbol.Color = Color.FromArgb(20, Color.Yellow);//alpha参数为透明度
 86         //绘制图形
 87         pageLayoutControl1.ActiveView.StartDrawing();
 88         pageLayoutControl1.ActiveView.DrawGeometry(fillSymbol, polygon as IGeometry);
 89         pageLayoutControl1.ActiveView.FinishDrawing();
 90     }
 91 }
 92 
 93 /// <summary>
 94 /// 制图模式下地图缩小
 95 /// </summary>
 96 /// <param name="sender"></param>
 97 /// <param name="e"></param>
 98 private void tbn_MapZoomOut_Click(object sender, EventArgs e)
 99 {
100     IEnvelope envelop = m_PageMapActiveView.Extent;
101     envelop.Expand(2, 2, true);//缩放参数小于1时,是地图放大,反之,地图缩小
102     m_PageMapActiveView.Extent = envelop;
103     pageLayoutControl1.PartialRefresh(ViewDrawPhaseType.ViewAll);
104 }

2.3 核心接口与方法

接口/类

方法/属性

说明

PIE.Carto.IActiveViewEvents

OnViewRefreshed

视图更新

 

 

 

PIE.Carto.IActiveView

Extent

视图范围

ToMapPoint

将屏幕坐标转换陈过地图坐标

FromMapPoint

将地图坐标转换成屏幕坐标

StartDrawing

开始绘制

FinishDrawing

结束绘制

DrawGeometry

绘制图形

2.4 示例代码

      项目路径

百度云盘地址下/PIE示例程序/09.专题制图/ 07制图模式下地图操作

视频位置

百度云盘地址下/PIE视频教程/09.专题制图/ 07制图模式下地图操作.avi

2.5 示例截图

对地图范围的监听:

拉框绘制前:

拉框绘制后:

原文地址:https://www.cnblogs.com/PIESat/p/10319619.html