zoukankan      html  css  js  c++  java
  • 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 示例截图

    对地图范围的监听:

    拉框绘制前:

    拉框绘制后:

  • 相关阅读:
    Windows使用SCHTASKS 命令执行定时任务
    window10设置定时任务
    uiautomator2+python自动化测试1-环境准备
    uiautomator2+python自动化测试2-查看app页面元素利器weditor
    APPIUM 自带的webdriveragent
    使用 mitmproxy + python 做拦截代理
    mitmproxy 实战
    深入学习mitmproxy
    将博客搬至CSDN
    CS231N Assignment5 图像分类练习
  • 原文地址:https://www.cnblogs.com/PIESat/p/10319619.html
Copyright © 2011-2022 走看看