1、线段绘制
基本步骤
构建形状
1. 创建 IPoint
IPoint m_Point = new PointClass();
m_Point.PutCoords(x, y);
2. 创建 IPointCollection
IPointCollection m_PointCollection = new PolylineClass();
m_PointCollection.AddPoint(m_Point, ref Type.Missing, ref Type.Missing);
3. 创建 IPolyline
IPolyline m_Polyline = new PolylineClass();
m_Polyline = m_PointCollection as IPolyline;
4. 创建 IElement
// Element 不能实例化,需要用其派生类实例化
IElement m_Element = m_SimpleLineSymbol as IElement;
m_Element.Geometry = m_Polyline;
设置形状样式
1. 创建 ISimpleLineSymbol
ISimpleLineSymbol m_SimpleLineSymbol = new SimpleLineSymbolClass();
2. 创建 ILineElement
ILineElement m_LineElement = new LineElementClass();
m_LineElement.Symbol = m_SimpleLineSymbol;
加载到地图
IMap m_Map = axMapControl1.Map;
IActiveView m_ActiveView = m_Map as IActiveView;
IGraphicsContainer m_Container = m_Map as IGraphicsContainer;
m_Container.AddElement(m_Element, 0);
m_Active.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
-----------------------------------------------------------------------------------------------------------
其他方法
private void DrawLine() { ILineElement pLineElement; IElement pLElement; IPolyline pLine; RgbColor pColor = new RgbColor(); pColor.Red = 0; pColor.Green = 0; pColor.Blue = 255; ISimpleLineSymbol pSimpleLineSymbol = new SimpleLineSymbolClass(); pSimpleLineSymbol.Color = pColor; pSimpleLineSymbol.Width = 5; pLineElement = new LineElementClass(); pLineElement.Symbol = pSimpleLineSymbol; pLElement = pLineElement as IElement; IRubberBand pRubberBand; pRubberBand = new RubberLineClass(); pLine = pRubberBand.TrackNew(axMapControl1.ActiveView.ScreenDisplay, null) as IPolyline; pLElement.Geometry = pLine; IGraphicsContainer pGraphicsContainer; pGraphicsContainer = axMapControl1.ActiveView as IGraphicsContainer; //把地图的当前view作为图片的容器 pGraphicsContainer.AddElement(pLElement, 0);//把刚刚的element转到容器上 axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); }
2、编辑
点编辑:
IPoint pt; pt = axMapControl1.ToMapPoint(e.x, e.y); IMarkerElement pMarkerElement; pMarkerElement = new MarkerElementClass(); IElement pElement; pElement = pMarkerElement as IElement; pElement.Geometry = pt; pGraphicsContainer = pMap as IGraphicsContainer; pGraphicsContainer.AddElement((IElement)pMarkerElement, 0); pActiveView.Refresh();
线编辑:
IGeometry polyline;
polyline = axMapControl1.TrackLine();
ILineElement pLineElement;
pLineElement = new LineElementClass();
IElement pElement;
pElement = pLineElement as IElement;
pElement.Geometry = polyline;
pGraphicsContainer = pMap as IGraphicsContainer;
pGraphicsContainer.AddElement((IElement)pLineElement, 0);
pActiveView.Refresh();
面编辑:
IGeometry Polygon;
Polygon = axMapControl1.TrackPolygon();
IPolygonElement PolygonElement;
PolygonElement = new PolygonElementClass();
IElement pElement;
pElement = PolygonElement as IElement;
pElement.Geometry = Polygon;
pGraphicsContainer = pMap as IGraphicsContainer;
pGraphicsContainer.AddElement((IElement)PolygonElement, 0);
pActiveView.Refresh();
ArcEngine中画shape点的另一种方法
public override void OnMouseDown(int Button, int Shift, int X, int Y) { //base.OnMouseDown(Button, Shift, X, Y); IFeatureLayer pFeatureLayer = mapControl.Map.get_Layer(0) as IFeatureLayer; IFeatureClass fc = pFeatureLayer.FeatureClass; IFeatureClassWrite fr = fc as IFeatureClassWrite; IWorkspaceEdit pWorkspaceEdit = (fc as IDataset).Workspace as IWorkspaceEdit; IFeature pFeature; IPoint pPoint; //开始事物操作 pWorkspaceEdit.StartEditing(false); //开始编辑 pWorkspaceEdit.StartEditOperation(); pFeature = fc.CreateFeature(); pPoint = new PointClass(); IPoint Mp = mapControl.ToMapPoint(X, Y); pPoint.PutCoords(Mp.X, Mp.Y); pPoint.SpatialReference = mapControl.SpatialReference; pFeature.Shape = pPoint; pFeature.Store(); mapControl.ActiveView.Refresh(); if (Button == 2) { pWorkspaceEdit.StopEditOperation(); pWorkspaceEdit.StopEditing(true); } }
3、绘制Element、Symbol 在控件上
做符号预览的时候需要将ISymbol或IElement绘制到指定的控件上,下面边码边说,一起讨论讨论:
3.1 绘制在Panel上
ISymbol接口有Draw函数,查询其接口可以发现,我们需要执行ISymbol.SetupDC -> ISymbol.Draw -> ISymbol.ResetDC 这三个步骤;
首先SetupDC需要参数 hDC和IDisplayTransformation;贴代码:
例如:绘制在Panel上:
int width=Panel.Width; int heigth=Panel.Heigth; //绘制方法 Graphics graph=Graphics.FromHwnd(Panel.Handle); graph.Clear(Panel.BackColor); //分辨率 double dpi=graph.DpiX; IEnvelope pEnve=new EnvelopeClass(); pEnve.PutCoords(0,0,width,heigth); Ipoint pCenterPt=new PointClass; pCenter.PutCoords(width/2,height/2); tagRECT myRect=new tagRECT(); 设置MyRect 的 top=0;bottom=heigh; left=0,right=width; IDisplayransformation pDisTrans=new DisplayTrabsformation(); pDisTrans.VisiableBounds=pEnve; pDisTrans.Bounds=pEnv; pDisTrans.Set_DeviceFrame(ref myRect); pDisTrans.Resolution=dpi; intPtr hdc=graph.GetHdc(); ISymbol.SetupDC(hec.ToInt32,pDisTrans); ISymbol.Draw(pCenterPt); ISymbol.ResetDC(); //绘制完成后 是否绘图对象 graph.ReleaseHdc(hdc); graph.Dispose();
Symbol的第二种方法
IStyleGalleryItem item=new ServerStyleGalleryItemClass();
item.Item=youSymbol;//你需要预览的ISymbol
stdole.IPictureDisp pic=axSymbologyControl1.GetStyleClass(esriSymbologyStyleClass).PriviewItem(item,100,100);
Image img=Image.FormHbitmap(new IntPtr(pic.Handle));
picPriview.Image=img;
3.2 绘制Element 在Panel控件上
其中 graph、pCenterPoint、pDisTrans 的设置方式和上面一样
以绘制线段为例:
IDisplay pDisplay=new SimpleDisplay();
pDisplay.StartDrawing(graph.GetHdc(),ToInt32(),(short)esriScreeCache.esriNoScreeCache);
pDisplay.DisplayTransformation=pDisTrans;
pDisplay.SetSymbol(LineSymbol);//设置绘制线段的符号
pDisplay.DrawPolyline(IGeometry) ;//设置绘制线段的几何数据
//在arcgis帮助中找吧
参考文章
Arcengine 绘制Element、Symbol 在控件上