AE+C#实现缩放坐标比例尺长度面积量测输出图片等功能

 

代码如下:

#region "工具条按钮"
        //拉框放大
        private void toolStripButton_Zoomin_Click(object sender, EventArgs e)
        {
            currentoperation = "拉框放大";
            axMapControl1.MousePointer = esriControlsMousePointer.esriPointerZoomIn;
        }
        //拉框缩小
        private void toolStripButton_Zoomout_Click(object sender, EventArgs e)
        {
            currentoperation = "拉框缩小";
            axMapControl1.MousePointer = esriControlsMousePointer.esriPointerZoomOut;
        }
        //平移
        private void toolStripButton_Pan_Click(object sender, EventArgs e)
        {
            currentoperation = "平移漫游";
            axMapControl1.MousePointer = esriControlsMousePointer.esriPointerPan;
        }
        //全图
        private void toolStripButton_FullExtent_Click(object sender, EventArgs e)
        {
            currentoperation = "全图显示";
            axMapControl1.Extent = axMapControl1.FullExtent;
            axMapControl1.MousePointer = esriControlsMousePointer.esriPointerDefault;
        }
        //上一视图
        private void toolStripButton_LastExtent_Click(object sender, EventArgs e)
        {
            currentoperation = "上一视图";
            IExtentStack pExtentStack = null;
            pExtentStack = axMapControl1.ActiveView.ExtentStack;
            if (pExtentStack.CanUndo())
                pExtentStack.Undo();
            axMapControl1.Refresh();
            axMapControl1.MousePointer = esriControlsMousePointer.esriPointerDefault;
        }
        //下一视图
        private void toolStripButton_NextExtent_Click(object sender, EventArgs e)
        {
            currentoperation = "下一视图";
            IExtentStack pExtentStack = null;
            pExtentStack = axMapControl1.ActiveView.ExtentStack;
            if (pExtentStack.CanRedo())
                pExtentStack.Redo();
            axMapControl1.Refresh();
            axMapControl1.MousePointer = esriControlsMousePointer.esriPointerDefault;
        }
        //中心放大
        private void toolStripButton_Zoomin1_Click(object sender, EventArgs e)
        {
            currentoperation = "中心放大";
            IEnvelope objEnvelope = null;
            objEnvelope = axMapControl1.Extent;
            objEnvelope.Expand(0.5, 0.5, true);
            axMapControl1.Extent = objEnvelope;
            axMapControl1.MousePointer = esriControlsMousePointer.esriPointerDefault;
        }
        //中心缩小
        private void toolStripButton_Zoomout1_Click(object sender, EventArgs e)
        {
            currentoperation = "中心缩小";
            IEnvelope objEnvelope = null;
            objEnvelope = axMapControl1.Extent;
            objEnvelope.Expand(2, 2, true);
            axMapControl1.Extent = objEnvelope;
            axMapControl1.MousePointer = esriControlsMousePointer.esriPointerDefault;
        }
        //刷新
        private void toolStripButton_Refresh_Click(object sender, EventArgs e)
        {
            currentoperation = "刷新";
            axMapControl1.Refresh();
            axMapControl1.MousePointer = esriControlsMousePointer.esriPointerDefault;
        }

        //长度量测
        private void toolStripButton_LengthMeasure_Click(object sender, EventArgs e)
        {
            currentoperation = "长度量测";
            axMapControl1.MousePointer = esriControlsMousePointer.esriPointerDefault;
        }
        //面积量测
        private void toolStripButton_AreaMeasure_Click(object sender, EventArgs e)
        {
            currentoperation = "面积量测";
            axMapControl1.MousePointer = esriControlsMousePointer.esriPointerDefault;
        }
        //地图输出
        private void toolStripButton_OutputMap_Click(object sender, EventArgs e)
        {
            currentoperation = "地图输出";
            OutputMap();
        }

        #endregion


        //=========================================================================================================
        #region"axMapControl事件"
        //鼠标按下事件
        private void axMapControl1_OnMouseDown(object sender, AxESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
        {
            IEnvelope objEnvelope = null;
            IPoint pPoint = null;
            double  x;
            x = (6371110 * 2 * Math.PI) / 360;      
            IActiveView pActiveView = axMapControl1.ActiveView.FocusMap as IActiveView;
            pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);
            switch (currentoperation)
            {
                case "拉框放大":
                    objEnvelope = axMapControl1.TrackRectangle();
                    if (!objEnvelope.IsEmpty)
                    {
                        axMapControl1.Extent = objEnvelope;
                    }
                    else
                    {
                        //点击放大
                        pPoint.X = e.mapX;
                        pPoint.Y = e.mapY;
                        pPoint.Z = 0;
                        objEnvelope = axMapControl1.Extent;
                        objEnvelope.CenterAt(pPoint);
                        objEnvelope.Expand(0.5, 0.5, true);
                        axMapControl1.Extent = objEnvelope;
                    }
                    break;
                case "拉框缩小":
                    objEnvelope = axMapControl1.TrackRectangle();
                    IEnvelope currentExtent = this.axMapControl1.Extent;
                    double dXmin = 0, dYmin = 0, dXmax = 0, dYmax = 0, dHeight = 0, dWidth = 0;
                    if (!objEnvelope.IsEmpty)
                    {
                        dWidth = currentExtent.Width * (currentExtent.Width / objEnvelope.Width);
                        dHeight = currentExtent.Height * (currentExtent.Height / objEnvelope.Height);

                        dXmin = currentExtent.XMin - ((objEnvelope.XMin - currentExtent.XMin) * (currentExtent.Width / objEnvelope.Width));
                        dYmin = currentExtent.YMin - ((objEnvelope.YMin - currentExtent.YMin) * (currentExtent.Height / objEnvelope.Height));
                        dXmax = dXmin + dWidth;
                        dYmax = dYmin + dHeight;
                        objEnvelope.PutCoords(dXmin, dYmin, dXmax, dYmax);
                        this.axMapControl1.Extent = objEnvelope;
                    }
                    else
                    {
                        //点击缩小
                        pPoint.X = e.mapX;
                        pPoint.Y = e.mapY;
                        pPoint.Z = 0;
                        objEnvelope = axMapControl1.Extent;
                        objEnvelope.CenterAt(pPoint);
                        objEnvelope.Expand(2, 2, true);
                        axMapControl1.Extent = objEnvelope;
                    }
                    break;
                case "平移漫游":
                    axMapControl1.Pan();
                    break;
                case "长度量测":
                    IPolyline pPolyline = null;
                    pPolyline = (IPolyline)axMapControl1.TrackLine();
                    double l ;
                    l =Math.Abs( Math.Round(pPolyline.Length  * x,2));
                    MessageBox.Show("您量测的距离为" + l.ToString() + "米。", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    break;
                case "面积量测":
                    IPolygon pPolygon = null;
                    pPolygon =(IPolygon)axMapControl1.TrackPolygon();
                    IArea pArea =(IArea)pPolygon;
                    double s;
                    s = Math.Abs(Math.Round(pArea.Area * x * x, 2));                    
                    MessageBox.Show("您量测的距离为" + s.ToString() + "平方米。", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    break;
            }
                

        }

        //鼠标移动事件,获取坐标值
        private void axMapControl1_OnMouseMove(object sender, AxESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e)
        {
            //double X = 0;
            //double Y = 0;
            //X = Math.Round(e.mapX, 6);    //保留6位小数
            //Y = Math.Round(e.mapY, 6);
            toolStripStatusLabel_X.Text = "X=" + e.mapX.ToString() + "     ";
            toolStripStatusLabel_Y.Text = "Y=" + e.mapY.ToString();
        }

        //获取当前比例尺
        private void axMapControl1_OnViewRefreshed(object sender, AxESRI.ArcGIS.Controls.IMapControlEvents2_OnViewRefreshedEvent e)
        {
            double S= Math.Round(axMapControl1.MapScale, 0);   //保留0位小数
            toolStripStatusLabel_Scale.Text = "比列尺: 1:" + S.ToString() + "          ";
        }


        #endregion

 

        #region"私有函数"
        private void OutputMap()
        {
            try
            {
                SaveFileDialog sfd = new SaveFileDialog();
                sfd.Filter = "(*jpg)|*jpg|(*.tif)|*tif|(*.pdf)|*.pdf|(*.bmp)|*.bmp";
                sfd.Title = "图片另存为";
                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    IExport pExport = null;
                    if (1 == sfd.FilterIndex)
                    {
                        pExport = new ExportJPEGClass();
                        pExport.ExportFileName = sfd.FileName + ".jpeg";
                    }
                    else if (2 == sfd.FilterIndex)
                    {
                        pExport = new ExportTIFFClass();
                        pExport.ExportFileName = sfd.FileName + ".tif";
                    }
                    else if (3 == sfd.FilterIndex)
                    {
                        pExport = new ExportPDFClass();
                        pExport.ExportFileName = sfd.FileName + ".pdf";
                    }
                    else if (4 == sfd.FilterIndex)
                    {
                        pExport = new ExportBMPClass();
                        pExport.ExportFileName = sfd.FileName + ".bmp";
                    }

                    //pExport.ExportFileName = sfd.FileName;
                    int res = 96;
                    pExport.Resolution = res;
                    tagRECT exportRECT = axMapControl1.ActiveView.ExportFrame;
                    IEnvelope pENV = new EnvelopeClass();
                    pENV.PutCoords(exportRECT.left, exportRECT.top, exportRECT.right, exportRECT.bottom);
                    pExport.PixelBounds = pENV;
                    int Hdc = pExport.StartExporting();
                    IEnvelope pVisibleBounds = null;
                    ESRI.ArcGIS.esriSystem.ITrackCancel pTrack = null;
                    axMapControl1.ActiveView.Output(Hdc, (int)pExport.Resolution, ref exportRECT, pVisibleBounds, pTrack);
                    Application.DoEvents();
                    pExport.FinishExporting();
                    pExport.Cleanup();
                }
                MessageBox.Show("地图输出成功!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch
            {
            }
        }

 

转自:http://blog.sina.com.cn/s/blog_5d6893390100h4a6.html

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
栅格计算器是一种常见的计算机应用程序,它允许用户在一个矩形的网格中输入数值,然后对这些数值进行各种计算。在本文中,我们将使用C#AE(Adobe After Effects)来实现一个简单的栅格计算器功能。 首先,在AE中创建一个新的合成(Composition),并添加一个文本层(Text Layer)。将文本层的内容设置为“栅格计算器”,并将其放置在合成的顶部。 接下来,我们需要创建一个矩形网格,以便用户可以输入数值。我们可以使用AE中的形状层(Shape Layer)来创建一个矩形。在AE中,选择“Layer”->“New”->“Shape Layer”来创建一个新的形状层。选择“Rectangle Tool”(矩形工具),并在画布上绘制一个矩形。然后,选择矩形图层,打开“Add”->“Fill”属性,选择一种颜色填充矩形。 现在,我们需要将矩形网格分成若干个小格子,以便用户可以在其中输入数值。我们可以使用C#编写一个简单的脚本来完成这个任务。在Visual Studio中创建一个新的C#控制台应用程序,并将其命名为“GridCalculator”。 在GridCalculator项目中,我们需要添加一个引用,以便我们可以访问AE中的COM(Component Object Model)对象。选择“Project”->“Add Reference”,然后在“COM”选项卡中找到“Adobe After Effects XX.X Type Library”(其中XX.X表示你的AE版本号),并添加它。 接下来,我们需要编写一个C#脚本来创建网格。以下是一个示例脚本: ```csharp using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using AE_COM; namespace GridCalculator { class Program { static void Main(string[] args) { // Create a new AE project var ae = new Application(); var proj = ae.NewProject(); // Create a new composition var comp = proj.Items.AddComp("Grid Calculator", 1920, 1080, 1.0, 10.0, 30); // Add a new shape layer var shapeLayer = comp.Layers.AddShape(); shapeLayer.Name = "Grid"; // Create a new rectangle shape var rect = new Shape(); var rectGroup = new ShapeGroup(); rectGroup.AddShape(rect); shapeLayer.Property("Contents").AddProperty("ADBE Vector Group").SetValue(rectGroup); // Set the rectangle size rect.Size = new PointF(400, 400); // Create the grid var rows = 10; var cols = 10; var cellSize = new PointF(rect.Size.X / cols, rect.Size.Y / rows); for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { // Create a new rectangle shape for each cell var cell = new Shape(); var cellGroup = new ShapeGroup(); cellGroup.AddShape(cell); shapeLayer.Property("Contents").AddProperty("ADBE Vector Group").SetValue(cellGroup); // Set the cell position and size var pos = new PointF(col * cellSize.X, row * cellSize.Y); cell.Position = pos; cell.Size = cellSize; } } // Save the project proj.Save(@"C:\GridCalculator.aep"); // Quit AE ae.Quit(); } } } ``` 在上面的脚本中,我们首先创建了一个新的AE项目和一个新的合成。然后,我们添加了一个新的形状层,并在其中创建了一个矩形。接下来,我们使用嵌套循环创建了一个网格,其中每个单元格都是一个独立的矩形。 最后,我们保存了AE项目,并退出AE应用程序。 现在,我们可以在AE中打开“GridCalculator.aep”文件,并将生成的网格图层拖放到我们之前创建的合成中。用户现在可以在每个单元格中输入数值,并使用AE中的表达式(Expressions)功能对这些数值进行计算。 总的来说,使用C#AE来创建栅格计算器功能是非常简单的。通过利用AE的COM对象和C#的编程能力,我们可以轻松地创建一个自定义的栅格计算器工具,以满足我们的具体需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值