zoukankan      html  css  js  c++  java
  • GIS二次开发之缩小

         前一篇随笔中记录了地图放大功能的实现,其中很多方法和这篇中要说的缩小很像,比如ControlsMapZoomOutTool和ControlsMapZoomOutFixedCommand。那在这篇中就忽略掉这两个方法的实现了,直接看看自定义缩小功能的实现代码

    代码
            public MapZoomOut()
            {
                
    string[] res = GetType().Assembly.GetManifestResourceNames();

                
    base.m_bitmap = new System.Drawing.Bitmap(GetType().Assembly.GetManifestResourceStream("Commands.zoomout.bmp"));
                
    base.m_caption = "缩小地图";
                
    base.m_category = "ToolBar";
                
    base.m_message = "缩小地图";
                
    base.m_name = "ToolBar_MapPan";
                
    base.m_toolTip = "缩小";
                m_ZoomOutStart 
    = true;
                m_feedBack 
    = null;
                
    try
                {
                    
    base.m_cursor = new System.Windows.Forms.Cursor(GetType().Assembly.GetManifestResourceStream("Commands.ZoomOut.CUR"));
                }
                
    catch (Exception ex)
                {

                }
            }

            
    public override void OnCreate(object hook)
            {
                m_HookHelper.Hook 
    = hook;
                
    try
                {
                    m_pActiveView 
    = m_HookHelper.ActiveView;
                }
                
    catch { }
            }

            
    public override void OnMouseDown(int Button, int Shift, int X, int Y)
            {
                
    if (null == m_pActiveView) return;
                m_pPoint 
    = m_pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
                m_ZoomOutStart 
    = true;
                m_feedBack 
    = null;
            }

            
    public override void OnMouseMove(int Button, int Shift, int X, int Y)
            {
                
    if (null == m_pActiveView) return;
                
    if (!m_ZoomOutStart) return;

                
    if (m_feedBack == null)
                {
                    m_feedBack 
    = new NewEnvelopeFeedbackClass();
                    
    if (Button == 1)
                    {
                        m_feedBack.Display 
    = m_pActiveView.ScreenDisplay;
                        m_feedBack.Start(m_pPoint);
                    }
                }
                m_feedBack.MoveTo(m_pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y));
            }

            
    public override void OnMouseUp(int Button, int Shift, int X, int Y)
            {
                
    if (null == m_pActiveView) return;
                
    if (!m_ZoomOutStart) return;
                IEnvelope m_pEnvelope 
    = new EnvelopeClass();
                
    if (null == m_feedBack) //点击缩小
                {
                    m_pEnvelope 
    = m_pActiveView.Extent;
                    m_pEnvelope.Expand(
    22true);
                    m_pActiveView.Extent.CenterAt(m_pPoint);
                }
                
    else //拉框缩小
                {
                    IEnvelope m_pFeedEnvelope 
    = new EnvelopeClass();
                    m_pFeedEnvelope 
    = m_feedBack.Stop();
                    
    try
                    {
                        //这里是与放大代码不同的地方
                        
    double newWidth = m_pActiveView.Extent.Width * (m_pActiveView.Extent.Width / m_pFeedEnvelope.Width);
                        
    double newHeight = m_pActiveView.Extent.Height * (m_pActiveView.Extent.Height / m_pFeedEnvelope.Height);

                        
    double newXmin = m_pActiveView.Extent.XMin - ((m_pFeedEnvelope.XMin - m_pActiveView.Extent.XMin) * (m_pActiveView.Extent.Width / m_pFeedEnvelope.Width));
                        
    double newYmin = m_pActiveView.Extent.YMin - ((m_pFeedEnvelope.YMin - m_pActiveView.Extent.YMin) * (m_pActiveView.Extent.Height / m_pFeedEnvelope.Height));

                        m_pEnvelope.PutCoords(newXmin, newYmin, newXmin 
    + newWidth, newYmin + newHeight);
                    }
                    
    catch
                    {
                        m_pEnvelope 
    = m_pActiveView.Extent;
                        m_pEnvelope.Expand(
    22true);
                        m_pActiveView.Extent.CenterAt(m_pPoint);
                        m_feedBack 
    = null;
                        m_ZoomOutStart 
    = false;
                    }
                }

                m_pActiveView.Extent 
    = m_pEnvelope;

                m_pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, 
    nullnull);

                m_feedBack 
    = null;
                Marshal.ReleaseComObject(m_feedBack);
                m_ZoomOutStart 
    = false;
            }

            
    public override void OnKeyDown(int keyCode, int Shift)
            {
                
    if (keyCode == 27)
                {
                    m_ZoomOutStart 
    = false;
                    
    base.m_cursor = System.Windows.Forms.Cursors.Default;
                }
            }

           可以看到缩小与放大不同之处

           ①:在点击缩放的时候m_pEnvelope.Expand(0.5,0.5,true) 和m_pEnvelope.Expand(2,2,true)的不同,应该很容易理解,打个比方,比如把当前的地图比作为1m*1m的标准地图,Expand(0.5,0.5,true),相当于是说将0.5m*0.5m的地图视图放大1m*1m的“地图框架”中,为了充满这个“地图框架”,应该要放大。(哈哈,应该可以这样理解),同样,缩小也就好理解了。

           ②:在拉框缩放的时候,放大中直接按照绘制的矩形框的大小进行放大,在缩小的时候,需要set new coordinate,就像屏幕的分辨率一样,重置到当前“屏幕”的大小(就是重定义ActiveView.Extent的Xmin,Ymin,Xmax,Ymax)。

  • 相关阅读:
    出现System.web.mvc冲突的原因及解决方法CS0433
    看完此文还不懂NB-IoT,你就过来掐死我吧...
    html5调用手机陀螺仪实现方向辨识
    黑盒测试和白盒测试的区别
    CentOS7 下 keepalived 的安装和配置
    centos 下 mysql+keepalived实现双主自由切换
    MySQL 高可用性—keepalived+mysql双主(有详细步骤和全部配置项解释)
    备份VMware虚拟磁盘文件 移植到其他虚拟机
    Centos7 Mysql 双机热备实现数据库高可用
    CentOS7配置Mysql热备份
  • 原文地址:https://www.cnblogs.com/wangyong/p/1899889.html
Copyright © 2011-2022 走看看