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.


  完成闪烁的代码如下:

None.gifIHookActions hookActions;
None.gifhookActions.DoAction(feature.Shape, esriHookActions.esriHookActionsPan);

 Application.DoEvent();
None.gifhookActions.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

 

转载于:https://www.cnblogs.com/St_Dlng/archive/2010/08/19/1803476.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ArcGIS Engine 可以用 C# 或 VB.NET 编写代码,实现查询要素并同时闪烁的效果。以下是一个示例代码: ```csharp private void FlashFeature(IFeature feature, IMapControl3 mapControl) { // 获取要素的几何图形 IGeometry geometry = feature.Shape; // 创建一个闪烁符号 ISymbol symbol = new SimpleMarkerSymbolClass(); ((ISimpleMarkerSymbol)symbol).Color = getRGB(255, 0, 0); ((ISimpleMarkerSymbol)symbol).Style = esriSimpleMarkerStyle.esriSMSCircle; ((ISimpleMarkerSymbol)symbol).Outline = true; ((ISimpleMarkerSymbol)symbol).OutlineSize = 1; // 创建一个闪烁效果 IFlashGeometry flashGeometry = new FlashGeometryClass(); flashGeometry.Geometry = geometry; flashGeometry.Symbol = symbol; // 将闪烁效果加入到地图控件中 IActiveView activeView = mapControl.ActiveView; activeView.ScreenDisplay.StartDrawing(0, (short)esriScreenCache.esriNoScreenCache); flashGeometry.Start(activeView.ScreenDisplay); // 等待一段时间 System.Threading.Thread.Sleep(500); // 停止闪烁效果 flashGeometry.Stop(); activeView.ScreenDisplay.FinishDrawing(); } private IRgbColor getRGB(int r, int g, int b) { IRgbColor color = new RgbColorClass(); color.Red = r; color.Green = g; color.Blue = b; return color; } private void QueryAndFlashFeature(IMapControl3 mapControl, IQueryFilter queryFilter) { // 获取地图图层 IEnumLayer enumLayer = mapControl.Map.get_Layers(null, true); ILayer layer = null; while ((layer = enumLayer.Next()) != null) { // 判断图层是否为要素图层 IFeatureLayer featureLayer = layer as IFeatureLayer; if (featureLayer == null) continue; // 查询要素 IFeatureCursor featureCursor = featureLayer.Search(queryFilter, false); IFeature feature = null; while ((feature = featureCursor.NextFeature()) != null) { // 闪烁要素 FlashFeature(feature, mapControl); } } } private void btnQuery_Click(object sender, EventArgs e) { // 创建查询过滤器 IQueryFilter queryFilter = new QueryFilterClass(); queryFilter.WhereClause = "CITY_NAME = '北京'"; // 查询并闪烁要素 QueryAndFlashFeature(axMapControl1, queryFilter); } ``` 在这个代码中,`FlashFeature` 方法用于将一个要素闪烁。`QueryAndFlashFeature` 方法用于查询符合条件的要素,并将它们闪烁。在 `btnQuery_Click` 事件中,我们创建了一个查询过滤器,查询城市名称为“北京”的要素,并将它们闪烁
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值