博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ArcGIS Engine 中的绘制与编辑
阅读量:5251 次
发布时间:2019-06-14

本文共 5871 字,大约阅读时间需要 19 分钟。

 

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);  }
View Code

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帮助中找吧

 

 

参考文章

 

 

 

转载于:https://www.cnblogs.com/arxive/p/8145435.html

你可能感兴趣的文章
css & input type & search icon
查看>>
jQuery插件开发详细教程
查看>>
Crontab 在linux中的非常有用的Schedule Jobs
查看>>
ProxySQL Scheduler
查看>>
源代码的下载和编译读后感
查看>>
Kafka学习笔记
查看>>
Octotree Chrome安装与使用方法
查看>>
用CALayer实现下载进度条控件
查看>>
Windows 环境下基于 Redis 的 Celery 任务调度模块的实现
查看>>
趣谈Java变量的可见性问题
查看>>
C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
查看>>
ssm框架之将数据库的数据导入导出为excel文件
查看>>
语音识别中的MFCC的提取原理和MATLAB实现
查看>>
验证组件FluentValidation的使用示例
查看>>
0320-学习进度条
查看>>
解决windows系统的oracle数据库不能启动ora-00119和ora-00130的问题
查看>>
ip相关问题解答
查看>>
MetaWeblog API Test
查看>>
反弹SHELL
查看>>
关闭Chrome浏览器的自动更新和升级提示
查看>>