zoukankan      html  css  js  c++  java
  • ArcGIS 要素闪烁

    ArcGIS 要素闪烁

    通过双击要素图例,闪烁定位到要素,并且闪烁一段时间:                   

    IFeatureLayer featureLayer = layer as IFeatureLayer;
                        ITable table = featureLayer as ITable;
                        IRow row = table.GetRow((int)data);
                        IFeature feature = row as IFeature;                   
                        IEnvelope envelope = feature.Shape.Envelope;                   
                        switch(feature.Shape.GeometryType)
                        {
                            case esriGeometryType.esriGeometryPoint:
                                IPoint point = feature.Shape as IPoint;
                                envelope.Expand(2.7, 2.7, true);
                                axMapControl1.FlashShape(point, 1, 300, null);
                                axMapControl1.Extent = envelope;
                                Application.DoEvents();
                                axMapControl1.Refresh();
                                axMapControl1.FlashShape(point, 6, 300, null);
                                break;
                            case esriGeometryType.esriGeometryPolyline:
                                IPolyline polyline = feature.Shape as IPolyline;
                                envelope.Expand(1.7, 1.7, true);
                                axMapControl1.FlashShape(polyline, 1, 300, null);
                                axMapControl1.Extent = envelope;
                                Application.DoEvents();
                                axMapControl1.Refresh();
                                axMapControl1.FlashShape(polyline, 15, 300, null);
                                break;
                            case esriGeometryType.esriGeometryPolygon:
                                IPolygon polygon = feature.Shape as IPolygon;
                                envelope.Expand(1.7, 1.7, true);
                                axMapControl1.FlashShape(polygon, 1, 300, null);
                                axMapControl1.Extent = envelope;
                                Application.DoEvents();
                                axMapControl1.Refresh();
                                ITopologicalOperator topOperator = polygon as ITopologicalOperator;
                                IPolyline line = new PolylineClass();
                                line=topOperator.Boundary as IPolyline;
                                axMapControl1.FlashShape(line, 15, 300, null);
                                break;

                        }

     

     

    第一种:通过FlashShape来实现闪烁功能


    public void PositionFlashElement(AxMapControl axMapControl, IElement pElement)
    {
    IGeometry pGeometry = pElement.Geometry;
    ICartographicLineSymbol ipCartographicLineSymbol;
    ISimpleFillSymbol ipSimpleFillSymbol;
    ISimpleMarkerSymbol ipSimpleMarkersymbol;
    ISymbol ipSymbol = null;
    IRgbColor ipColor;
    IPoint pPoint = new PointClass();
    pPoint.X = pGeometry.Envelope.LowerLeft.X + pGeometry.Envelope.Width / 2;
    pPoint.Y = pGeometry.Envelope.LowerLeft.Y + pGeometry.Envelope.Height / 2;
    axMapControl.CenterAt(pPoint);
    //pGeometry.Envelope.LowerLeft
    int Size;

     




    ipColor = new RgbColor();
    ipColor.Red = 255;
    Size = 10;




    //esriGeometryType type = pGeometry.GeometryType;




    if (type == esriGeometryType.esriGeometryPolyline)
    {
    ipCartographicLineSymbol = new CartographicLineSymbol();



    ipSymbol = (ISymbol)ipCartographicLineSymbol;
    ipSymbol.ROP2 = esriRasterOpCode.esriROPNotXOrPen;
    ipCartographicLineSymbol.Width = Size;
    ipCartographicLineSymbol.Color = ipColor;
    }
    else if (type == esriGeometryType.esriGeometryPolygon)
    {
    ipSimpleFillSymbol = new SimpleFillSymbol();
    ipSymbol = (ISymbol)ipSimpleFillSymbol;
    ipSimpleFillSymbol.Color = ipColor;
    }
    else if (type == esriGeometryType.esriGeometryPoint || type == esriGeometryType.esriGeometryMultipoint)
    {
    ipSimpleMarkersymbol = new SimpleMarkerSymbol();
    ipSymbol = (ISymbol)ipSimpleMarkersymbol;
    ipSymbol.ROP2 = esriRasterOpCode.esriROPWhite;
    ipSimpleMarkersymbol.Color = ipColor;
    ipSimpleMarkersymbol.Size = 20;
    }
    axMapControl.FlashShape(pGeometry, 3, 300, ipSymbol);
    }
     
            第二种:编辑自己闪烁的对象
     自己定义一个FlashObjectsClass类来完成闪烁的功能,网上很对这样类的原代码.
         //获取对应要素
                LayerIdentifiedResult layerResult = identifiedResultsList[layerIndex];
                //点击了图层下的要素
                if (featureIndex > -1)
                {
                    IFeatureIdentifyObj identifyObjDefault = layerResult.IdentifiedFeatureObjList[featureIndex];
                    IFeature featureDefault = (identifyObjDefault as IRowIdentifyObject).Row as IFeature;
                    //显示属性
                    ShowFeatureAttributes(featureDefault);
                    //判断是否闪烁要素
                    if (doFlash)
                    {
                        (identifyObjDefault as IIdentifyObj).Flash(associateMapControl.ActiveView.ScreenDisplay);
                    }
                }
                //点击了图层,同时闪烁图层下的所有要素图形
                else
                {
                    flashObjects.FlashObjects(layerResult);
                }
     
     第三种:结合IHookActions的DoAction方法并搭上esriHookActionsFlash动作,这样做效果很接近arcmap中的效果,速度也比较快。
     
              Action方面有6个constant,可以根据需要选择.

    Constant

    Value

    Description

    esriHookActionsFlash 

    0

    Flash the geometry.

    esriHookActionsPan 

    1

    Pan to the geometry.

    esriHookActionsZoom 

    2

    Zoom to the geometry.

    esriHookActionsGraphic 

    3

    Create a graphic for the geometry.

    esriHookActionsLabel 

    4

    Create a graphic and label for the geometry.

    esriHookActionsCallout 

    5

    Create a callout for the geometry.

     
     完成闪烁的代码如下:

    ArcGIS <wbr>要素闪烁IHookActions hookActions;
    ArcGIS <wbr>要素闪烁hookActions.DoAction(feature.Shape, esriHookActions.esriHookActionsPan);

     Application.DoEvent();
    ArcGIS <wbr>要素闪烁hookActions.DoAction(feature.Shape,esriHookActions.esriHookActionsFlash);

     

     


    第四种  
    接口IIdentify的返回对象IFeatureIdentifyObj也可以实现这个功能。特摘录代码如下:

     

    Dim pEnvs As IEnvelope
    pEnvs = AxMapControl1.TrackRectangle

    Dim pLayer As IFeatureLayer
    pLayer = pMainMap.Layer(0)
    Dim pIdentify As IIdentify
    pIdentify = pLayer
    Dim pArr As IArray
    pArr = pIdentify.Identify(pEnvs)

    Dim pFtIdenObj As IFeatureIdentifyObj
    Dim pIdenObj As IIdentifyObj
    If Not pArr Is Nothing Then
    Dim j As Integer
    For j = 0 To pArr.Count - 1
            pFtIdenObj = pArr.Element(j)
            pIdenObj = pFtIdenObj
            pIdenObj.Flash(pMainAV.ScreenDisplay)
            pIdenObj = Nothing
            pFtIdenObj = Nothing
    Next
    End If

  • 相关阅读:
    Rasp技术介绍与实现(一)
    青藤云安全细述:三大云安全工具(CASB、CSPM、CWPP)的使用场景
    CWPP产品市场演进
    Global CyberSecurity Landscape
    Scala学习之路 (五)Scala的关键字Lazy
    Scala学习之路 (四)Scala的数组、映射、元组、集合
    Scala学习之路 (三)Scala的基本使用
    Scala学习之路 (二)使用IDEA开发Scala
    Scala学习之路 (一)Scala的安装
    Azkaban学习之路 (三)Azkaban的使用
  • 原文地址:https://www.cnblogs.com/changbaishan/p/3361027.html
Copyright © 2011-2022 走看看