【ArcGIS Pro二次开发】(69):使用MapTool实现隐藏和隔离图层

一、MapTool简介

在ArcGIS Pro SDK中,MapTool是一个重要的组件,用于自定义地图操作工具,使用户能够在ArcGIS Pro中执行特定的地图交互操作。

在VS中添加新项,可以找到ArcGIS Pro 地图工具,即为MapTool。

【ArcGIS Pro二次开发】(69):使用MapTool实现隐藏和隔离图层_第1张图片

新建后打开cs文件,可以看到系统已经放出2个重写的方法。

【ArcGIS Pro二次开发】(69):使用MapTool实现隐藏和隔离图层_第2张图片

我也刚开始摸索,目前最常用的是【OnSketchCompleteAsync】方法,即当选择结束进行处理的事件。

要执行的内容基本也都写在这里。


二、要实现的功能

 【ArcGIS Pro二次开发】(69):使用MapTool实现隐藏和隔离图层_第3张图片

如上图所示,在【地图工具】组—【地图工具】面板下,点击【隐藏图层、隔离图层】工具。

以隐藏图层为例,点击工具后,在地图界面点击要素,目录要素所在的图层即可隐藏。

点击前:

【ArcGIS Pro二次开发】(69):使用MapTool实现隐藏和隔离图层_第4张图片

点击后:

【ArcGIS Pro二次开发】(69):使用MapTool实现隐藏和隔离图层_第5张图片

隔离图层则相反,未选中的隐藏,选中的保持可见。

效果和CAD的隐藏隔离图层是一样的。


三、实现流程

工具的实现流程并不长,主要是要注意在地图中获取要素的方式,这是基本固定的写法,直接抄即可。

隐藏图层的代码如下:

protected override Task OnSketchCompleteAsync(Geometry geometry)
{
    return QueuedTask.Run(() =>
    {
        var mapView = MapView.Active;
        if (mapView == null)
            return true;

        // 获取选择的要素
        var results = mapView.GetFeatures(geometry);

        if (results is not null)
        {
            mapView.FlashFeature(results);

            // 将选定的要素集合转换为字典形式
            var selectedList = results.ToDictionary();

            // 获取选定要素中位于最上层图层的要素
            int first = 1000;
            foreach (var layer in selectedList)
            {
                // 获取图层
                FeatureLayer featureLayer = layer.Key as FeatureLayer;
                int ss = mapView.Map.Layers.IndexOf(featureLayer);
                if (ss < first)
                {
                    first = ss;    // 如果比较小,就更新first的值。
                }
            }
            // 隐藏最上层的图层
            foreach (var layer in selectedList)
            {
                // 获取图层
                FeatureLayer featureLayer = layer.Key as FeatureLayer;
                int updata_ss = mapView.Map.Layers.IndexOf(featureLayer);
                if (updata_ss == first)
                {
                    featureLayer.SetVisibility(false);
                }
            }
        }
        return true;
    });
}

隔离图层的代码如下:

protected override Task OnSketchCompleteAsync(Geometry geometry)
{
    return QueuedTask.Run(() =>
    {
        var mapView = MapView.Active;
        if (mapView == null)
            return true;

        // 获取所有图层
        var allLayers = MapView.Active.Map.GetLayersAsFlattenedList();

        // 获取选择的要素
        var results = mapView.GetFeatures(geometry);

        if (results is not null)
        {
            mapView.FlashFeature(results);

            // 将选定的要素集合转换为字典形式
            var selectedList = results.ToDictionary();

            // 获取选定要素中位于最上层图层的要素
            int first = 1000;
            foreach (var layer in selectedList)
            {
                // 获取图层
                FeatureLayer featureLayer = layer.Key as FeatureLayer;
                int ss = mapView.Map.Layers.IndexOf(featureLayer);
                if (ss < first)
                {
                    first = ss;    // 如果比较小,就更新first的值。
                }
            }
            // 非指定图层全部隐藏
            foreach (var layer in allLayers)
            {
                int updata_ss = mapView.Map.Layers.IndexOf(layer);
                if (updata_ss != first)
                {
                    layer.SetVisibility(false);
                }
            }
        }
        return true;
    });
}

三、工具文件分享

我把工具都集合成工具箱,不再单独放单个工具,可以到这里下载完整工具箱,会不断更新:

【ArcGIS Pro二次开发】:CC工具箱icon-default.png?t=N7T8https://blog.csdn.net/xcc34452366/article/details/131506345PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。

你可能感兴趣的:(ArcGIS,Pro,SDK,ArcGIS,arcgis,arcgis,pro,sdk,c#,二次开发,隐藏图层,隔离图层)