private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e) { switch (toolAction) { case "Drag Zoom In": //判定当前的操作是否为拉框放大 IEnvelope pEnvelope = axMapControl1.TrackRectangle(); // 调用axMapControl1的矩形框跟踪功能进行拉框操作, //将拉框完成后的范围赋值给一个Envelope对象 //此处,你可以尝试axMapControl1.TrackPolygon(),axMapControl1.TrackCircle(),axMapControl1.TrackLine()等方法的调用,看有什么效果 if (pEnvelope == null || pEnvelope.IsEmpty || pEnvelope.Height == 0 || pEnvelope.Width == 0) //判定所获取的拉框范围是否无效 { return; // 拉框范围无效,就直接返回 } axMapControl1.Extent = pEnvelope; // 给地图窗口的空间范围赋值为刚才拉框的范围 axMapControl1.ActiveView.Refresh(); //地图刷新 return; case "Drag Zoom Out": //判定当前的操作是否为拉框缩小 IEnvelope pEnvelope1 = axMapControl1.TrackRectangle(); // 调用axMapControl1的矩形框跟踪功能进行拉框操作, //将拉框完成后的范围赋值给一个Envelope对象 //此处,你可以尝试axMapControl1.TrackPolygon(),axMapControl1.TrackCircle(),axMapControl1.TrackLine()等方法的调用,看有什么效果 if (pEnvelope1 == null || pEnvelope1.IsEmpty || pEnvelope1.Height == 0 || pEnvelope1.Width == 0) ////判定所获取的拉框范围是否无效 { return; //// 拉框范围无效,就直接返回 } IActiveView pActiveView = axMapControl1.ActiveView; // 获取地图视窗对象 double mHeight = pActiveView.Extent.Height * pActiveView.Extent.Height / pEnvelope1.Height; // 根据倍数计算新空间范围高度 double mWidth = pActiveView.Extent.Width * pActiveView.Extent.Width / pEnvelope1.Width; // 根据倍数计算新空间范围宽度 double mMinX = pActiveView.Extent.XMin - (pEnvelope1.XMin - pActiveView.Extent.XMin) * pActiveView.Extent.Width / pEnvelope1.Width; //计算新空间范围的x的最小值 double mMinY = pActiveView.Extent.YMin - (pEnvelope1.YMin - pActiveView.Extent.YMin) * pActiveView.Extent.Height / pEnvelope1.Height; //计算新空间范围的y的最小值 double mMaxX = mMinX + mWidth; //计算新空间范围的x的最大值 double mMaxY = mMinY + mHeight; // 计算新空间范围的y的最大值 pEnvelope1.PutCoords(mMinX, mMinY, mMaxX, mMaxY); // 给Envelope对象赋值新的空间范围 //(pActiveView.Extent.XMax-pActiveView.Extent.XMin)* axMapControl1.Extent = pEnvelope1; // 给地图范围赋值为新的空间范围 axMapControl1.ActiveView.Refresh(); //地图刷新 return; case "Pan": // 判定是否进行地图平移操作 axMapControl1.Pan(); //可执行地图平移 return; case "Select Feature Using Point": //点选要素 axMapControl1.ActiveView.FocusMap.ClearSelection(); // 清空当前地图的选择集; axMapControl1.ActiveView.Refresh(); tagRECT r; // 定义一个tagRECT结构变量,用于存放以当前鼠标为中心的长宽各为10个像素的小矩形 r.left = e.x - 5; // r.right = e.x + 5; // r.bottom = e.y - 5; // r.top = e.y + 5; // IEnvelope pEnv = new Envelope() as IEnvelope; // 创建一个Envelope对象,用于接受刚才创建的小矩形范围由屏幕坐标转换为地图坐标的值 axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.TransformRect(pEnv, ref r, 4); //把r的屏幕坐标转换为地图坐标,存入Envelope对象中 pEnv.SpatialReference = axMapControl1.ActiveView.FocusMap.SpatialReference; //设定Envelope对象的空间坐标参考与当前地图窗口的坐标一致 IGeometry pGeo = pEnv as IGeometry; //接口访问到IGeometry接口 axMapControl1.Map.SelectByShape(pGeo, null, false); //调用地图控件中map对象的SelectByShape方法,在地图中选择与pGeo相交或包含在其中的地图要素 //int selCount = axMapControl1.Map.SelectionCount; //IEnumFeature pEnumFeature = axMapControl1.Map.FeatureSelection as IEnumFeature; //IFeature pFeature = pEnumFeature.Next(); //while (pFeature != null) //{ // int index = pFeature.Fields.FindField("GB"); // str1 = Convert.ToString(pFeature.get_Value(index)); // MessageBox.Show(str1); // //string str2 = pFeature.get_Value(2).ToString(); // pFeature = pEnumFeature.Next(); //} ISelection selection = axMapControl1.Map.FeatureSelection; IEnumFeatureSetup iEnumFeatureSetup = (IEnumFeatureSetup)selection; iEnumFeatureSetup.AllFields = true; IEnumFeature pEnumFeature = (IEnumFeature)iEnumFeatureSetup; pEnumFeature.Reset(); IFeature pFeature = pEnumFeature.Next(); if (pFeature != null) { int index = pFeature.Fields.FindField("RNAME"); //string str1 = pFeature.OID.ToString(); if (index != -1) { str1 = pFeature.get_Value(index).ToString(); } //MessageBox.Show(str1); //pFeature = pEnumFeature.Next(); } axMapControl1.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null); // toolAction = ""; return; case "Select Feature Using Rectangle": //矩形选择要素 IEnvelope pEnvlope2 = axMapControl1.TrackRectangle(); // 进行矩形框的绘制追踪, if (pEnvlope2.IsEmpty == true) // 若矩形框为空 { tagRECT r1; r1.left = e.x - 5; r1.right = e.x + 5; r1.bottom = e.y - 5; r1.top = e.y + 5; axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.TransformRect(pEnvlope2, ref r1, 4); pEnvlope2.SpatialReference = axMapControl1.ActiveView.FocusMap.SpatialReference; } IGeometry pGeo1 = pEnvlope2 as IGeometry; axMapControl1.Map.SelectByShape(pGeo1, null, false); axMapControl1.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null); toolAction = ""; return; case "Select Feature Using Circle": // 圆形选择要素 IGeometry pCircl = axMapControl1.TrackCircle(); //圆形绘制 if (pCircl.IsEmpty == true) { return; } // IGeometry pGeo1 = pEnvlope2 as IGeometry; axMapControl1.Map.SelectByShape(pCircl, null, false); axMapControl1.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null); toolAction = ""; return; case "Select Feature Using Polygon": //多边形选择要素 IGeometry pPolygon = axMapControl1.TrackPolygon(); // 绘制多边形 if (pPolygon.IsEmpty == true) { return; } // IGeometry pGeo1 = pEnvlope2 as IGeometry; axMapControl1.Map.SelectByShape(pPolygon, null, false); axMapControl1.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null); toolAction = ""; return; case "Select Feature Using Polyline": // 线性选择要素 IGeometry pLine = axMapControl1.TrackLine(); //绘制线 if (pLine.IsEmpty == true) { return; } // IGeometry pGeo1 = pEnvlope2 as IGeometry; axMapControl1.Map.SelectByShape(pLine, null, false); axMapControl1.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null); toolAction = ""; return; case "Draw Polygon": IGeometry pPolygon1 = axMapControl1.TrackPolygon(); // 绘制多边形 if (pPolygon1 == null) { return; } IElement pElement = new PolygonElement(); pElement.Geometry = pPolygon1; IFillShapeElement pPolygonEle = pElement as IFillShapeElement; if (pSelectedFillSymbol != null) { pPolygonEle.Symbol = pSelectedFillSymbol; } IGraphicsContainer pGc = axMapControl1.ActiveView.GraphicsContainer; pGc.AddElement(pElement, 0); IGraphicsContainerSelect pGSelection = pGc as IGraphicsContainerSelect; pGSelection.UnselectAllElements(); pGSelection.SelectElement(pElement); toolAction = ""; axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); return; case "Draw Point": IPoint pPointMark = new ESRI.ArcGIS.Geometry.Point(); // 创建一个点 pPointMark.PutCoords(e.mapX, e.mapY); //给点赋值为当前鼠标所在位置的地图坐标 IGeometry pPointGeo = pPointMark as IGeometry; IElement pMElement = new MarkerElement(); pMElement.Geometry = pPointGeo; IMarkerElement pMarkElement = pMElement as IMarkerElement; if (pSelectedMarkSymbol != null) { pMarkElement.Symbol = pSelectedMarkSymbol; } IGraphicsContainer pGraphiscont = axMapControl1.ActiveView.GraphicsContainer; pGraphiscont.AddElement(pMElement, 0); IGraphicsContainerSelect pGS = pGraphiscont as IGraphicsContainerSelect; pGS.UnselectAllElements(); pGS.SelectElement(pMElement); toolAction = ""; axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); return; case "Draw Line": IGeometry pLineGeo = axMapControl1.TrackLine(); // 绘制Line if (pLineGeo == null) { return; } IElement pElement4 = new LineElement(); ILineElement pLineEle = pElement4 as ILineElement; if (pSelectedLineSymbol != null) { pLineEle.Symbol = pSelectedLineSymbol; } pElement4.Geometry = pLineGeo; IGraphicsContainer pGc4 = axMapControl1.ActiveView.GraphicsContainer; pGc4.AddElement(pElement4, 0); IGraphicsContainerSelect pGSelection4 = pGc4 as IGraphicsContainerSelect; pGSelection4.UnselectAllElements(); pGSelection4.SelectElement(pElement4); toolAction = ""; axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); return; case "Draw Text": IRgbColor pColor = new RgbColor(); pColor.Red = 150; pColor.Green = 150; pColor.Blue = 0; ITextSymbol pTextSymbol = new TextSymbol(); stdole.StdFont font = new stdole.StdFont(); font.Name = "宋体"; font.Size = 20; pTextSymbol.Font = font as stdole.IFontDisp; pTextSymbol.Color = pColor; pTextSymbol.HorizontalAlignment = esriTextHorizontalAlignment.esriTHALeft; pTextSymbol.VerticalAlignment = esriTextVerticalAlignment.esriTVABaseline; pTextSymbol.Text = "This is my First Text"; IPoint pTextPoint = new ESRI.ArcGIS.Geometry.Point(); // 创建一个点 pTextPoint.PutCoords(e.mapX, e.mapY); //给点赋值为当前鼠标所在位置的地图坐标 IGeometry pTextGeo = pTextPoint as IGeometry; IElement pTElement = new TextElement(); pTElement.Geometry = pTextGeo; ITextElement pTextEle = pTElement as ITextElement; pTextEle.Symbol = pTextSymbol; pTextEle.Text = pTextSymbol.Text; IGraphicsContainer pGraphisCon = axMapControl1.ActiveView.GraphicsContainer; pGraphisCon.AddElement(pTElement, 0); IGraphicsContainerSelect pGrhSelection = pGraphisCon as IGraphicsContainerSelect; pGrhSelection.UnselectAllElements(); pGrhSelection.SelectElement(pTElement); axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); toolAction = ""; break; case "Select Graphics by using Point": //通过点击获得GraphicsContainor中的element IPoint pPoint = new ESRI.ArcGIS.Geometry.Point(); // 创建一个点 pPoint.PutCoords(e.mapX, e.mapY); //给点赋值为当前鼠标所在位置的地图坐标 double dist = axMapControl1.ActiveView.Extent.Width / 15; //设置以点为圆心的查询的半径 IGraphicsContainer pGc1 = axMapControl1.ActiveView.GraphicsContainer; //获得地图的GraphicsContainor容器 IEnumElement pEnumElement = pGc1.LocateElements(pPoint, dist); //以点为中心点,按照指定半径选择element IGraphicsContainerSelect pGSelection1 = pGc1 as IGraphicsContainerSelect; //获得地图的容器中的图形要素选择集 if (pEnumElement != null) // { pEnumElement.Reset(); //回到-1位置 pGSelection1.UnselectAllElements(); //清空原来选择到的图形要素 pGSelection1.SelectElements(pEnumElement); //将新查询到的图形要素添加到GraphicsContainor容器中的图形要素选择集中 } axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); //图形要素刷新 return; } if (e.button == 2) //若单击鼠标右键 { contextMenuStrip2.Show(axMapControl1, e.x, e.y); //在TOC控件的当前鼠标位置弹出右键菜单 } }