在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → ArcGIS开发实例源码下载

ArcGIS开发实例源码下载

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:3.30M
  • 下载次数:73
  • 浏览次数:704
  • 发布时间:2017-05-23
  • 实例类别:C#语言基础
  • 发 布 人:3187213563
  • 文件格式:.rar
  • 所需积分:2
 相关标签: c 开发 ArcGIS

实例介绍

【实例简介】
【实例截图】

【核心代码】

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Controls;
using celiang222222;
using ESRI.ArcGIS.esriSystem;
using gisprojectselect;
using ESRI.ArcGIS.SystemUI;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesRaster;
using gisprojectSceneselect;


namespace _12
{
    public partial class frm : Form
    {
        #region 主窗体按钮定义
        private System.Windows.Forms.Panel panel1;
        private System.Windows.Forms.ToolStrip toolStrip1;
        private System.Windows.Forms.ToolStripButton openfile;
        private System.Windows.Forms.ToolStripButton zmin;
        private System.Windows.Forms.ToolStripButton zmout;
        private System.Windows.Forms.ToolStripButton manyou;
        private System.Windows.Forms.ToolStripButton quantu;
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.Button MeasureLength;
        private System.Windows.Forms.StatusStrip statusStrip1;
        private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1;
        private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel2;
        private System.Windows.Forms.ToolStripStatusLabel toolstripX;
        private System.Windows.Forms.ToolStripStatusLabel toolstripY;
        private System.Windows.Forms.ToolStripStatusLabel toolstripUnits;
        private System.Windows.Forms.TabControl tabControl1;
        private System.Windows.Forms.TabPage tabPage1;
        private System.Windows.Forms.TabPage tabPage2;

        #endregion

        #region 变量定义
        //显示地图量测结果  
        private FormMeasureResult frmMeasureResult = null;//量算结果窗体   
        private ESRI.ArcGIS.Display.INewLineFeedback pNewLineFeedback;   //追踪线对象        
        private ESRI.ArcGIS.Geometry.IPoint pPointPt = null;     //鼠标点击点位置  
        private ESRI.ArcGIS.Geometry.IPoint pMovePoint = null;   //鼠标移动点位置  
        private double dToltalLength = 0.0;                       //量测总长度  
        private double dSegmentLength = 0.0;                     //片段距离   

        private string sMapUnits = "UnKnow";
        private object missing = Type.Missing;
        //鹰眼同步
        private bool bCanDrag;              //鹰眼地图上的矩形框可移动的标志
        private IPoint pMoveRectPoint;      //记录在移动鹰眼地图上的矩形框时鼠标的位置
        private IEnvelope pEnv;             //记录数据视图的Extent
        #endregion  
        public frm()
        {
            InitializeComponent();

            EyeaxMapControl2.Extent = axMapControl1.FullExtent;
            pEnv = EyeaxMapControl2.Extent;
            DrawRectangle(pEnv);
        }
       
        string pMouseOperate = null;
        private string GetMapUnit(esriUnits _esriMapUnit)
        {
            string sMapUnits = string.Empty;
            switch (_esriMapUnit)
            {
                case esriUnits.esriCentimeters:
                    sMapUnits = "厘米";
                    break;
                case esriUnits.esriDecimalDegrees:
                    sMapUnits = "十进制";
                    break;
                case esriUnits.esriDecimeters:
                    sMapUnits = "分米";
                    break;
                case esriUnits.esriFeet:
                    sMapUnits = "尺";
                    break;
                case esriUnits.esriInches:
                    sMapUnits = "英寸";
                    break;
                case esriUnits.esriKilometers:
                    sMapUnits = "千米";
                    break;
                case esriUnits.esriMeters:
                    sMapUnits = "米";
                    break;
                    sMapUnits = "英里";
                    break;
                case esriUnits.esriMillimeters:
                    sMapUnits = "毫米";
                    break;
                case esriUnits.esriNauticalMiles:
                    sMapUnits = "海里";
                    break;
                case esriUnits.esriPoints:
                    sMapUnits = "点";
                    break;
                case esriUnits.esriUnitsLast:
                    sMapUnits = "UnitsLast";
                    break;
                case esriUnits.esriUnknownUnits:
                    sMapUnits = "未知单位";
                    break;
                case esriUnits.esriYards:
                    sMapUnits = "码";
                    break;
                default:
                    break;
            }
            return sMapUnits;
        }//获得地图单位

        private void axMapControl1_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e)
        {
            sMapUnits = GetMapUnit(axMapControl1.Map.MapUnits);
            #region 长度量算
            pMovePoint = (axMapControl1.Map as IActiveView).ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);

            //长度量算  
            if (pMouseOperate == "MeasureLength")
            {
                if (pNewLineFeedback != null)
                {
                    pNewLineFeedback.MoveTo(pMovePoint);
                }
                double deltaX = 0; //两点之间X差值
                double deltaY = 0; //两点之间Y差值

                if ((pPointPt != null) && (pNewLineFeedback != null))
                {
                    deltaX = pMovePoint.X - pPointPt.X;
                    deltaY = pMovePoint.Y - pPointPt.Y;
                    dSegmentLength = Math.Round(Math.Sqrt((deltaX * deltaX)   (deltaY * deltaY)), 3);
                    dToltalLength = dToltalLength   dSegmentLength;
                    if (frmMeasureResult != null)
                    {
                        frmMeasureResult.lblMeasureResult.Text = String.Format(
                            "当前线段长度:{0:.###}{1};\r\n\n总长度为: {2:.###}{1}",
                            dSegmentLength, sMapUnits, dToltalLength);
                        dToltalLength = dToltalLength - dSegmentLength; //鼠标移动到新点重新开始计算
                    }
                    frmMeasureResult.frmClosed  = new FormMeasureResult.FormClosedEventHandler(frmMeasureResult_frmColsed);
                }

            }
            #endregion
            #region 屏幕坐标显示
            toolstripX.Text = e.mapX.ToString("0.000000");
            toolstripY.Text = e.mapY.ToString("0.000000");
            toolstripUnits.Text = getUnits();
            #endregion

        }

        private void axMapControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
        {
            
            #region 放大缩小漫游
            IActiveView pActiveView = axMapControl1.ActiveView;
            ESRI.ArcGIS.Geometry.IEnvelope ipEnv;
            if (pMouseOperate == "zmin")
            {
                //放大
                ipEnv = axMapControl1.TrackRectangle();
                axMapControl1.Extent = ipEnv;
            }
            if (pMouseOperate == "zmout")
            {
                //缩小
                ipEnv = axMapControl1.TrackRectangle();

                //如果拉框范围为空则退出
                if (ipEnv == null || ipEnv.IsEmpty || ipEnv.Height == 0 || ipEnv.Width == 0)
                {
                    return;
                }
                //如果有拉框范围,则以拉框范围为中心,缩小倍数为:当前视图范围/拉框范围
                else
                {
                    double dWidth = pActiveView.Extent.Width * pActiveView.Extent.Width / ipEnv.Width;
                    double dHeight = pActiveView.Extent.Height * pActiveView.Extent.Height / ipEnv.Height;
                    double dXmin = pActiveView.Extent.XMin -
                                   ((ipEnv.XMin - pActiveView.Extent.XMin) * pActiveView.Extent.Width /
                                    ipEnv.Width);
                    double dYmin = pActiveView.Extent.YMin -
                                   ((ipEnv.YMin - pActiveView.Extent.YMin) * pActiveView.Extent.Height /
                                    ipEnv.Height);
                    double dXmax = dXmin   dWidth;
                    double dYmax = dYmin   dHeight;
                    ipEnv.PutCoords(dXmin, dYmin, dXmax, dYmax);
                }
                pActiveView.Extent = ipEnv;
                pActiveView.Refresh();
             }
            if (pMouseOperate == "manyou")
            {
                ipEnv = axMapControl1.Extent;
                axMapControl1.Pan();
            }
            #endregion
            #region 地图测量
            pPointPt = (axMapControl1.Map as IActiveView).ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);
            
            //IEnvelope pEnvelope = new Envelope() as IEnvelope;

            if (pMouseOperate == "MeasureLength")
            {
                //判断追踪线对象是否为空,若是则实例化并设置当前鼠标点为起始点
                if (pNewLineFeedback == null)
                {
                    //实例化追踪线对象
                    pNewLineFeedback = new NewLineFeedback();
                    pNewLineFeedback.Display = (axMapControl1.Map as IActiveView).ScreenDisplay;
                    //设置起点,开始动态线绘制
                    pNewLineFeedback.Start(pPointPt);
                    dToltalLength = 0;
                }
                else //如果追踪线对象不为空,则添加当前鼠标点
                {
                    pNewLineFeedback.AddPoint(pPointPt);
                }
                //pGeometry = m_PointPt;
                if (dSegmentLength != 0)
                {
                    dToltalLength = dToltalLength   dSegmentLength;
                }

            }
            #endregion           
            #region 地图上点击查询
            //    this.axMapControl1.CurrentTool = null;
            //    axMapControl1.Map.ClearSelection();
            //    //它有一Identify方法,返回一个IArray数组对象。
            //    IIdentify pIdentify = null;
            //    IPoint pPoint = null;
            //    IArray pIDArray = null;
            //    IFeatureIdentifyObj pFeatIdObj = null;//定义一个要素对象
            //    IRowIdentifyObject pRowIdObj = null; //定义一个Row对象
            //    IIdentifyObj pIdObj = null;
            //    FeatureLayer plyr = null;
            //    IFeature pfeature = null; //定义一个featrue


            //    IMap pMap = axMapControl1.Map;//将当前地图赋给地图对象pMap
            //    for (int i = 0; i < axMapControl1.Map.LayerCount; i  )
            //    {
            //        if (axMapControl1.Map.Layer[i].Name.ToString().Substring(0, axMapControl1.Map.Layer[i].Name.ToString().Length - 2).Equals(main_ui.frmlinem.lstLineAll.SelectedItem.ToString().Substring(0, main_ui.frmlinem.lstLineAll.SelectedItem.ToString().Length - 2)))
            //        {
            //            if (axMapControl1.Map.Layer[i].Name.ToString().Substring(axMapControl1.Map.Layer[i].Name.ToString().Length - 2, 2).Equals("_点"))
            //            {
            //                pIdentify = pMap.get_Layer(i) as IIdentify;//将图层赋给图层对象pIdentify
            //                plyr = pMap.get_Layer(i) as FeatureLayer;
            //                break;
            //            }
            //        }
            //    }
            //    pPoint = new ESRI.ArcGIS.Geometry.Point();//定义了一个实现IPoint接口的点对象
            //    pPoint.PutCoords(e.mapX, e.mapY);//pPoint.PutCoords用来设置点的X,Y值从而创建一个点对象。
            //    pPoint.SpatialReference = pMap.SpatialReference;
            //    IEnvelope pEnvelope = new Envelope() as IEnvelope;

            //    IGeometry bufGeo;
            //    ITopologicalOperator bufferPoint = pPoint as ITopologicalOperator;
            //    bufGeo = bufferPoint.Buffer(axMapControl1.ActiveView.Extent.Width / 300);
            //    pEnvelope = bufGeo.Envelope;

            //    pIDArray = pIdentify.Identify(pEnvelope);//Identify方法返回一个Array数组对象
            //    IGeometry pGG = null;
            //    pGG = pPoint;

            //    if (pIDArray != null)
            //    {
            //        pFeatIdObj = pIDArray.get_Element(0) as IFeatureIdentifyObj;//获得要素集数组中的第一个元素
            //        pIdObj = pFeatIdObj as IIdentifyObj;
            //        //让鼠标点击的点闪烁一次,当然可以根据自己需要调整
            //        axMapControl1.FlashShape(pPoint, 1, 500, null);
            //        //axMapMain.Map.ClearSelection();
            //        axMapControl1.Map.SelectByShape(pGG, null, false);
            //        //axMapMain.Refresh();
            //        //显示要素所在图层的名字,要素的的名字
            //        if (frmpic == null || frmpic.IsDisposed)
            //        {
            //            IFeatureClass featureClass = plyr.FeatureClass;
            //            IQueryFilter queryFilter = new QueryFilter();  //创建一个查询筛选
            //            pRowIdObj = pFeatIdObj as IRowIdentifyObject;
            //            pfeature = pRowIdObj.Row as IFeature;
            //            queryFilter.WhereClause = "FID = "   pRowIdObj.Row.OID;   //查询条件,即选中获取的ID
            //            queryFilter.SubFields = "杆塔编号";
            //            int fieldPosition = featureClass.FindField("杆塔编号");   //获取字段(这里是SHAPE_Area),其他字段同理

            //            IFeatureCursor featureCursor = featureClass.Search(queryFilter, true);
            //            IFeature feature = null;
            //            while ((feature = featureCursor.NextFeature()) != null)
            //            {
            //                //MessageBox.Show(feature.get_Value(fieldPosition).ToString());  //获取字段的值。
            //                frmpic = new picBox(pIdObj.Layer.Name, feature.get_Value(fieldPosition).ToString(), pfeature);
            //                frmpic.ShowInTaskbar = false;
            //                frmpic.Owner = this;
            //                frmpic.Location = new System.Drawing.Point(0, 0);
            //                frmpic.Show();
            //            }
            //        }
            //        else
            //        {
            //            frmpic.Close();
            //            IFeatureClass featureClass = plyr.FeatureClass;
            //            IQueryFilter queryFilter = new QueryFilter();  //创建一个查询筛选
            //            pRowIdObj = pFeatIdObj as IRowIdentifyObject;
            //            pfeature = pRowIdObj.Row as IFeature;
            //            queryFilter.WhereClause = "FID = "   pRowIdObj.Row.OID;   //查询条件,即选中获取的ID
            //            queryFilter.SubFields = "杆塔编号";
            //            int fieldPosition = featureClass.FindField("杆塔编号");   //获取字段(这里是SHAPE_Area),其他字段同理

            //            IFeatureCursor featureCursor = featureClass.Search(queryFilter, true);
            //            IFeature feature = null;
            //            while ((feature = featureCursor.NextFeature()) != null)
            //            {
            //                //MessageBox.Show(feature.get_Value(fieldPosition).ToString());  //获取字段的值。
            //                frmpic = new picBox(pIdObj.Layer.Name, feature.get_Value(fieldPosition).ToString(), pfeature);
            //                frmpic.ShowInTaskbar = false;
            //                frmpic.Owner = this;
            //                frmpic.Location = new System.Drawing.Point(0, 0);
            //                frmpic.Show();
            //            }
            //        }
            //        //MessageBox.Show("Layer Name:"   pIdObj.Layer.Name   "\n"   "Feature Name:"   pIdObj.Name);
            //        //点击messagebox确定按钮后,清除选择
            //        axMapControl1.Map.ClearSelection();
            //    }
            #endregion



        }

        private string getUnits()
        {
            string xUnits = axMapControl1.MapUnits.ToString();
            string unit = "";
            if (xUnits.Equals("esriDecimalDegrees"))
            {
                unit = "°";
            }
            else
            {
                unit = "无单位";
            }
            return unit;
        }//屏幕坐标单位
                
        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            #region 打开地图文档
            OpenFileDialog OpenMXD = new OpenFileDialog();
            OpenMXD.Title = "打开地图";
           
            OpenMXD.Filter = "Map Document(*.mxd)|*.mxd";
            if (OpenMXD.ShowDialog() == DialogResult.OK)
            {
                string MxdPath = OpenMXD.FileName;
                axMapControl1.LoadMxFile(MxdPath);
                //<span style="white-space:pre"> </span>
            }
            #endregion
        }
        
        private void toolStripButton2_Click(object sender, EventArgs e)//放大
        {
            axMapControl1.MousePointer = esriControlsMousePointer.esriPointerPageZoomIn;
            pMouseOperate = "zmin";
        }
        
        private void toolStripButton3_Click(object sender, EventArgs e)//缩小
        {
           axMapControl1.MousePointer = esriControlsMousePointer.esriPointerPageZoomOut;
           pMouseOperate = "zmout";            

        }
        //private ICommand pCommand = null;
        private void toolStripButton4_Click(object sender, EventArgs e)//漫游
        {
            
            //pCommand = new ControlsMapPanTool();
            //pCommand.OnCreate(axMapControl1.Object);
            //axMapControl1.CurrentTool = pCommand as ITool;
            //pCommand.OnClick();
            axMapControl1.MousePointer = esriControlsMousePointer.esriPointerPagePan;
            pMouseOperate = "manyou";
        }

        private void toolStripButton5_Click(object sender, EventArgs e)//全图
        {
            axMapControl1.Extent = axMapControl1.FullExtent;           

        }

        private void button1_Click(object sender, EventArgs e)
        {
            MapSelectByAttributes frms = new MapSelectByAttributes();
            frms.showForm(axMapControl1);
        }

        private void MeasureLength_Click(object sender, EventArgs e)
        {
            axMapControl1.CurrentTool = null;
            pMouseOperate = "MeasureLength";
            axMapControl1.MousePointer = esriControlsMousePointer.esriPointerCrosshair;
            if (frmMeasureResult == null || frmMeasureResult.IsDisposed)
            {
                frmMeasureResult = new FormMeasureResult();
                frmMeasureResult.frmClosed  = new FormMeasureResult.FormClosedEventHandler(frmMeasureResult_frmColsed);
                frmMeasureResult.lblMeasureResult.Text = "";
                frmMeasureResult.Text = "距离量测";
                frmMeasureResult.Show();
            }
            else
            {
                frmMeasureResult.Activate();
            }
        }

        private void frmMeasureResult_frmColsed()
        {
            //清空线对象
            if (pNewLineFeedback != null)
            {
                pNewLineFeedback.Stop();
                pNewLineFeedback = null;
            }
            //清空量算画的线、面对象
            axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewForeground, null, null);
            //结束量算功能
            pMouseOperate = string.Empty;
            axMapControl1.MousePointer = esriControlsMousePointer.esriPointerDefault;
        }

        private void axMapControl1_OnDoubleClick(object sender, IMapControlEvents2_OnDoubleClickEvent e)
        {
            #region 长度量算
            if (pMouseOperate == "MeasureLength")
            {
                if (frmMeasureResult != null)
                {
                    frmMeasureResult.lblMeasureResult.Text = "线段总长度为:"   dToltalLength   sMapUnits;
                }
                if (pNewLineFeedback != null)
                {
                    pNewLineFeedback.Stop();
                    pNewLineFeedback = null;
                    //清空所画的线对象
                    (axMapControl1.Map as IActiveView).PartialRefresh(esriViewDrawPhase.esriViewForeground, null, null);
                }
                dToltalLength = 0;
                dSegmentLength = 0;
            }
            #endregion
        }

        private void minimum_Click(object sender, EventArgs e)
        {
            panel2.Visible = false;
            maxmum.Visible = true;
        }

        private void maxmum_Click(object sender, EventArgs e)
        {
            panel2.Visible = true;
            maxmum.Visible = false;
        }

        #region 鹰眼的实现和同步
        private void AddAllDataset(IWorkspace pWorkspace, AxMapControl mapControl)
        {
            IEnumDataset pEnumDataset = pWorkspace.get_Datasets(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTAny);
            pEnumDataset.Reset();
            //将Enum数据集中的数据一个个读到DataSet中
            IDataset pDataset = pEnumDataset.Next();
            //判断数据集是否有数据
            while (pDataset != null)
            {
                if (pDataset is IFeatureDataset)  //要素数据集
                {
                    IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pWorkspace;
                    IFeatureDataset pFeatureDataset = pFeatureWorkspace.OpenFeatureDataset(pDataset.Name);
                    IEnumDataset pEnumDataset1 = pFeatureDataset.Subsets;
                    pEnumDataset1.Reset();
                    IGroupLayer pGroupLayer = new GroupLayer();
                    pGroupLayer.Name = pFeatureDataset.Name;
                    IDataset pDataset1 = pEnumDataset1.Next();
                    while (pDataset1 != null)
                    {
                        if (pDataset1 is IFeatureClass)  //要素类
                        {
                            IFeatureLayer pFeatureLayer = new FeatureLayer();
                            pFeatureLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(pDataset1.Name);
                            if (pFeatureLayer.FeatureClass != null)
                            {
                                pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName;
                                pGroupLayer.Add(pFeatureLayer);
                                mapControl.Map.AddLayer(pFeatureLayer);
                            }
                        }
                        pDataset1 = pEnumDataset1.Next();
                    }
                }
                else if (pDataset is IFeatureClass) //要素类
                {
                    IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pWorkspace;
                    IFeatureLayer pFeatureLayer = new FeatureLayer();
                    pFeatureLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(pDataset.Name);

                    pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName;
                    mapControl.Map.AddLayer(pFeatureLayer);
                }
                else if (pDataset is IRasterDataset) //栅格数据集
                {
                    IRasterWorkspaceEx pRasterWorkspace = (IRasterWorkspaceEx)pWorkspace;
                    IRasterDataset pRasterDataset = pRasterWorkspace.OpenRasterDataset(pDataset.Name);
                    //影像金字塔判断与创建
                    IRasterPyramid3 pRasPyrmid;
                    pRasPyrmid = pRasterDataset as IRasterPyramid3;
                    if (pRasPyrmid != null)
                    {
                        if (!(pRasPyrmid.Present))
                        {
                            pRasPyrmid.Create(); //创建金字塔
                        }
                    }
                    IRasterLayer pRasterLayer = new RasterLayer();
                    pRasterLayer.CreateFromDataset(pRasterDataset);
                    ILayer pLayer = pRasterLayer as ILayer;
                    mapControl.AddLayer(pLayer, 0);
                }
                pDataset = pEnumDataset.Next();
            }

            mapControl.ActiveView.Refresh();
            //同步鹰眼
            SynchronizeEagleEye();
        }

        private void ClearAllData()
        {
            if (axMapControl1.Map != null && axMapControl1.Map.LayerCount > 0)
            {
                //新建mainMapControl中Map
                IMap dataMap = new Map();
                dataMap.Name = "Map";
                axMapControl1.DocumentFilename = string.Empty;
                axMapControl1.Map = dataMap;

                //新建EagleEyeMapControl中Map
                IMap eagleEyeMap = new Map();
                eagleEyeMap.Name = "eagleEyeMap";
                EyeaxMapControl2.DocumentFilename = string.Empty;
                EyeaxMapControl2.Map = eagleEyeMap;
            }
        }
        //获取RGB值
        private IRgbColor GetRgbColor(int intR, int intG, int intB)
        {
            IRgbColor pRgbColor = null;
            if (intR < 0 || intR > 255 || intG < 0 || intG > 255 || intB < 0 || intB > 255)
            {
                return pRgbColor;
            }
            pRgbColor = new RgbColor();
            pRgbColor.Red = intR;
            pRgbColor.Green = intG;
            pRgbColor.Blue = intB;
            return pRgbColor;
        }

        //在鹰眼地图上面画矩形框
        private void DrawRectangle(IEnvelope pEnvelope)
        {
            //在绘制前,清除鹰眼中之前绘制的矩形框
            IGraphicsContainer pGraphicsContainer = EyeaxMapControl2.Map as IGraphicsContainer;
            IActiveView pActiveView = pGraphicsContainer as IActiveView;
            pGraphicsContainer.DeleteAllElements();
            //得到当前视图范围
            IRectangleElement pRectangleElement = new RectangleElement() as IRectangleElement;
            IElement pElement = pRectangleElement as IElement;
            pElement.Geometry = pEnvelope;
            //设置矩形框(实质为中间透明度面)
            IRgbColor pColor = new RgbColor();
            pColor = GetRgbColor(255, 0, 0);
            pColor.Transparency = 255;
            ILineSymbol pOutLine = new SimpleLineSymbol();
            pOutLine.Width = 1;
            pOutLine.Color = pColor;

            IFillSymbol pFillSymbol = new SimpleFillSymbol();
            pColor = new RgbColor();
            pColor.Transparency = 0;
            pFillSymbol.Color = pColor;
            pFillSymbol.Outline = pOutLine;
            //向鹰眼中添加矩形框
            IFillShapeElement pFillShapeElement = pElement as IFillShapeElement;
            pFillShapeElement.Symbol = pFillSymbol;
            pGraphicsContainer.AddElement((IElement)pFillShapeElement, 0);
            //刷新
            pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
        }

        //绘制矩形框
        private void axMapControl1_OnExtentUpdated(object sender, IMapControlEvents2_OnExtentUpdatedEvent e)
        {
            //得到当前视图范围,绘制矩形框
            pEnv = (IEnvelope)e.newEnvelope;
            DrawRectangle(pEnv);
        }

        private void axMapControl1_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e)
        {
            SynchronizeEagleEye();
        }

        private void SynchronizeEagleEye()
        {
            if (EyeaxMapControl2.LayerCount > 0)
            {
                EyeaxMapControl2.ClearLayers();
            }
            //设置鹰眼和主地图的坐标系统一致
            EyeaxMapControl2.SpatialReference = axMapControl1.SpatialReference;
            for (int i = axMapControl1.LayerCount - 1; i >= 0; i--)
            {
                //使鹰眼视图与数据视图的图层上下顺序保持一致
                ILayer pLayer = axMapControl1.get_Layer(i);
                if (pLayer is IGroupLayer || pLayer is ICompositeLayer)
                {
                    ICompositeLayer pCompositeLayer = (ICompositeLayer)pLayer;
                    for (int j = pCompositeLayer.Count - 1; j >= 0; j--)
                    {
                        ILayer pSubLayer = pCompositeLayer.get_Layer(j);
                        IFeatureLayer pFeatureLayer = pSubLayer as IFeatureLayer;
                        if (pFeatureLayer != null)
                        {
                            //由于鹰眼地图较小,所以过滤点图层不添加
                            if (pFeatureLayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryPoint
                               && pFeatureLayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryMultipoint)
                            {
                                EyeaxMapControl2.AddLayer(pLayer);
                            }
                        }
                    }
                }
                else
                {
                    IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;
                    if (pFeatureLayer != null)
                    {
                        if (pFeatureLayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryPoint
                           && pFeatureLayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryMultipoint)
                       {
                            EyeaxMapControl2.AddLayer(pLayer);
                        }
                    }
                }
                //设置鹰眼地图全图显示  
                EyeaxMapControl2.Extent = axMapControl1.FullExtent;
                pEnv = axMapControl1.Extent as IEnvelope;
                DrawRectangle(pEnv);
                EyeaxMapControl2.ActiveView.Refresh();
            }
        }

        private void EyeaxMapControl2_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
        {
            if (EyeaxMapControl2.Map.LayerCount > 0)
            {
                //按下鼠标左键移动矩形框
                if (e.button == 1)
                {
                    //如果指针落在鹰眼的矩形框中,标记可移动
                    if (e.mapX > pEnv.XMin && e.mapY > pEnv.YMin && e.mapX < pEnv.XMax && e.mapY < pEnv.YMax)
                    {
                        bCanDrag = true;
                    }
                    pMoveRectPoint = new ESRI.ArcGIS.Geometry.Point();
                    pMoveRectPoint.PutCoords(e.mapX, e.mapY);  //记录点击的第一个点的坐标
                }
                //按下鼠标右键绘制矩形框
                else if (e.button == 2)
                {
                    IEnvelope pEnvelope = EyeaxMapControl2.TrackRectangle();

                    IPoint pTempPoint = new ESRI.ArcGIS.Geometry.Point();
                    pTempPoint.PutCoords(pEnvelope.XMin   pEnvelope.Width / 2, pEnvelope.YMin   pEnvelope.Height / 2);
                    axMapControl1.Extent = pEnvelope;
                    //矩形框的高宽和数据试图的高宽不一定成正比,这里做一个中心调整
                    axMapControl1.CenterAt(pTempPoint);
                }
            }
        }

       //移动矩形框
        private void EyeaxMapControl2_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)
        {
            if (e.mapX > pEnv.XMin && e.mapY > pEnv.YMin && e.mapX < pEnv.XMax && e.mapY < pEnv.YMax)
            {
                //如果鼠标移动到矩形框中,鼠标换成小手,表示可以拖动
                EyeaxMapControl2.MousePointer = esriControlsMousePointer.esriPointerHand;
                if (e.button == 2)  //如果在内部按下鼠标右键,将鼠标演示设置为默认样式
                {
                    EyeaxMapControl2.MousePointer = esriControlsMousePointer.esriPointerDefault;
                }
            }
            else
            {
                //在其他位置将鼠标设为默认的样式
                EyeaxMapControl2.MousePointer = esriControlsMousePointer.esriPointerDefault;
            }

            if (bCanDrag)
            {
                double Dx, Dy;  //记录鼠标移动的距离
                Dx = e.mapX - pMoveRectPoint.X;
                Dy = e.mapY - pMoveRectPoint.Y;
                pEnv.Offset(Dx, Dy); //根据偏移量更改 pEnv 位置
                pMoveRectPoint.PutCoords(e.mapX, e.mapY);
                DrawRectangle(pEnv);
                axMapControl1.Extent = pEnv;
            }
        }
                
        private void EyeaxMapControl2_OnMouseUp(object sender, IMapControlEvents2_OnMouseUpEvent e)
        {
            if (e.button == 1 && pMoveRectPoint != null)
            {
                if (e.mapX == pMoveRectPoint.X && e.mapY == pMoveRectPoint.Y)
                {
                    axMapControl1.CenterAt(pMoveRectPoint);
                }
                bCanDrag = false;
            }
        }
        #endregion

        private void button2_Click(object sender, EventArgs e)
        {
             SceneSelectByAttributes frms = new SceneSelectByAttributes();
            frms.showForm(axSceneControl1);
        }

       



    }
}

标签: c 开发 ArcGIS

实例下载地址

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警