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 示例截图
对地图范围的监听:
拉框绘制前:
拉框绘制后: