• ArcGIS Engine 中的绘制与编辑


     

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

    参考文章

    ArcGIS Engine 线段绘制研究

    ArcEngine画shapefile点,线,面

    ArcEngine中画shape点的另一种方法

    Arcengine 绘制Element、Symbol 在控件上

  • 相关阅读:
    线性最小二乘两种方法
    Coursera machine learning 第二周 编程作业 Linear Regression
    Coursera machine learning 第二周 quiz 答案 Octave/Matlab Tutorial
    Coursera machine learning 第二周 quiz 答案 Linear Regression with Multiple Variables
    Codeforces Round #392 (Div. 2) F. Geometrical Progression
    四边形不等式优化DP——石子合并问题 学习笔记
    Codeforces Round #373 (Div. 2) E. Sasha and Array
    hihoCoder #1388 : Periodic Signal
    hihoCoder #1388 : Periodic Signal ( 2016 acm 北京网络赛 F题)
    Java动态代理分析
  • 原文地址:https://www.cnblogs.com/arxive/p/8145435.html
Copyright © 2020-2023  润新知