【ArcGIS Pro二次开发】(7):地图(Map)的基本操作

地图是ArcGIS Pro中的基础起点,也是大多数工程的基础。主要用于显示表示空间数据的图层。


一、地图(Map)的基本操作示例

1、获取当前地图

var map = MapView.Active.Map;

2、获取一级图层

var lys = map.Layers;

用于获取地图中的单一图层,以及图层组。但不包括图层组下面的图层。

3、获取所有图层

var lys = map.GetLayersAsFlattenedList();

【GetLayersAsFlattenedList()】方法用于获取地图中的所有图层。

4、获取单一类型的图层

var lys = map.GetLayersAsFlattenedList().OfType<FeatureLayer>();

在【GetLayersAsFlattenedList()】方法加上【OfType】则会对获取的图层按类型进行筛选。如【FeatureLayer】代表要素图层,【GroupLayer】代表图层组等。

5、获取当前选定的图层

var lys = MapView.Active.GetSelectedLayers();

【GetSelectedLayers()】方法用于获取当前选定的图层。

6、获取独立表

var lys = map.GetStandaloneTablesAsFlattenedList();

【GetLayersAsFlattenedList()】方法用于获取地图中的所有独立表。

7、查找图层

var lys = map.FindLayers(LayerName);

【FindLayers(LayerName)】方法用于按图层名查找相应图层,注意这里的LayerName不支持模糊查找。

8、获取坐标系

var sr = map.SpatialReference;

Map的【SpatialReference】属性返回地图的坐标系。

9、移动图层

            // 获取当前地图
            var map = MapView.Active.Map;
            // 获取第一个图层
            var ly = map.GetLayersAsFlattenedList();
            // 移动到最后的位置
            QueuedTask.Run(async () =>
            {
                map.MoveLayer(ly[0], -1);
            });

【MoveLayer(Layer, index)】方法用于按标签位置移动图层的位置。

这里演示的是将地图中的第1个图层移动到最后的位置。

10、移除所有图层

            // 获取当前地图
            var map = MapView.Active.Map;
            // 获取所有图层
            var lys = map.GetLayersAsFlattenedList();
            // 移除所有图层
            QueuedTask.Run(async () =>
            {
                map.RemoveLayers(lys);
            });

【RemoveLayers(lys)】方法用于移除图层列表。

【RemoveLayer(ly)】方法用于移除单一图层。

这里演示的是用【RemoveLayers(lys)】方法移除地图中的所有图层。

11、将要素添加到当前地图

            // 获取当前地图
            var map = MapView.Active.Map;
            //打开对话框
            OpenItemDialog openDlg = new OpenItemDialog()
            {
                Title = "选择要素",      //打开对话框标题
                Filter = ItemFilters.FeatureClasses_All,       //类型筛选
            };
            //打开对话框
            bool? ok = openDlg.ShowDialog();
            //如果没有选择内容,则返回
            if (!ok.HasValue)
                return;
            // 获取返回的要素路径
            var fc = openDlg.Items.First().Path;
            // 按返回的要素路径将要素添加到当前地图中
            Uri uri = new Uri(fc);
            QueuedTask.Run(async () =>
            {
                LayerFactory.Instance.CreateLayer(uri,map);
            });

【LayerFactory.Instance.CreateLayer()】方法用于将要素添加到当前地图。

需要先将路径转换成Uri。

12、保存地图

            // 获取当前地图
            var map = MapView.Active.Map;
            //打开对话框
            SaveItemDialog saveDlg = new SaveItemDialog()
            {
                Title = "保存地图为",      //打开对话框标题
                Filter = ItemFilters.Maps_All,       //类型筛选
            };
            //打开对话框
            bool? ok = saveDlg.ShowDialog();
            //如果没有选择内容,则返回
            if (!ok.HasValue)
                return;
            // 按返回的工程路径保存地图
            QueuedTask.Run(async () =>
            {
                map.SaveAsFile(saveDlg.FilePath, true);
            });

【SaveAsFile()】方法用于将地图保存为地图文件。

13、替换地图内图层的数据库路径

map.FindAndReplaceWorkspacePath(path1, path2);

其中path1为当前要素图层所在的数据库,path2为要替换的数据库。

一个应用场景:如村庄规划,地图内的要素全部来自一个村庄成果数据库。复制一个新的地图,并将地图的数据库路径替换成新的村庄数据库,代码运行结果会将地图内的图层全部替换,不用遍历所有图层。

14、创建一个新地图

var map_name = "这个一个新建地图";
await QueuedTask.Run(() =>
{
    var map = MapFactory.Instance.CreateMap(map_name, MapType.Map, MapViewingMode.Map, Basemap.ProjectDefault);
});

以上【MapType.Map, MapViewingMode.Map, Basemap.ProjectDefault】这3个参数都用的是默认值,可以不输入。

15、在Project中查找地图并打开

            await QueuedTask.Run(async () =>
            {
                Map map = null;
                Project proj = Project.Current;
                // 查找名称与map_name匹配的第一个项目项(StringComparison参数设置为忽略大小写)
                var map_name = "这个一个新建地图";
                MapProjectItem mpi = proj.GetItems<MapProjectItem>()
                  .FirstOrDefault(m => m.Name.Equals(map_name, StringComparison.CurrentCultureIgnoreCase));
                if (mpi != null)
                {
                    map = mpi.GetMap();
                    // 在地图视图中打开地图
                    await ProApp.Panes.CreateMapPaneAsync(map);
                }
            });

这里主要通过Project.GetItems()先获取<MapProjectItem>,再通过GetMap()获取map。

最后用ProApp.Panes.CreateMapPaneAsync()方法将地图打开。

16、从当前地图面板中获取地图

            // 获取当前的地图面板
            var mapPanes = ProApp.Panes.OfType<IMapPane>()
              .GroupBy((mp) => mp.MapView.Map.URI).Select(grp => grp.FirstOrDefault());
            // 从地图面板中获取地图
            List<Map> uniqueMaps = new List<Map>();
            foreach (var pane in mapPanes)
            {
                uniqueMaps.Add(pane.MapView.Map);
            }

这里获取地图面板用了个比较复杂的lamda表达式,直接从官方文档抄的。

17、修改地图名

            await QueuedTask.Run(() =>
            {
                MapView.Active.Map.SetName("NewMap");
            });

修改当前活动地图的名字。

18、修改地图面板名

ProApp.Panes.ActivePane.Caption = "NewCaption";

修改当前活动地图面板的名字。

19、根据要素裁剪地图

            await QueuedTask.Run(() =>
            {
                var map = MapView.Active.Map;
                // 获取用来裁剪的要素类
                var lyrOfInterest = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().Where(l => l.Name == "TestPoly").FirstOrDefault();
                // 获取裁剪范围
                var extent = lyrOfInterest.QueryExtent();
                var polygonForClipping = PolygonBuilderEx.CreatePolygon(extent);
                // 按范围裁剪
                map.SetClipGeometry(polygonForClipping,
                      SymbolFactory.Instance.ConstructLineSymbol(
                      SymbolFactory.Instance.ConstructStroke(
                        ColorFactory.Instance.BlueRGB, 2.0, SimpleLineStyle.Dash)));
            });

需注意,这是在地图中的裁剪,而不是布局。

20、清除当前地图中裁剪要素

            await QueuedTask.Run(() =>
            {
                var map = MapView.Active.Map;
                map.ClearClipGeometry();
            });

清除上面那个功能生成的裁剪要素。


二、工程文件分享

最后,放上工程文件的链接:

MapManagerhttps://pan.baidu.com/s/1JqITwFtqSFjww5JTOM0RZQ?pwd=4myr

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
ArcGIS Pro二次开发是指使用ArcGIS Pro软件进行自定义功能开发的过程。对于初学者而言,开始二次开发可能感到无从入手,因为中文资料较少,官方文档对于英文不熟悉的人来说可能不太友好。 要开始ArcGIS Pro二次开发,你可以按照以下步骤进行操作: 1. 首先,以管理员身份运行Visual Studio 2019。如果没有安装Visual Studio 2019,你需要先下载并安装它。 2. 在Visual Studio中,右键项目名称,选择"添加",然后选择"新建项"。 3. 在"新建项"下拉菜单中,选择"ArcGIS",然后选择"ArcGIS Pro Add-ins",再选择"ArcGIS Pro按钮",最后点击"添加"。 4. 接下来,配置新项目。在Visual Studio中,点击"文件",选择"新建",然后选择"项目"。 5. 在"新建项目"对话框中,选择"C#"作为语言,选择"Windows"作为平台,然后选择"ArcGIS Pro SDK"。在项目类型中选择"ArcGIS Pro模块加载项",然后点击"下一步"。 6. 设置新项目的配置,然后点击"创建"。等待项目创建完成。 通过以上步骤,你就可以开始进行ArcGIS Pro二次开发了。你可以根据你的需求,使用C#编程语言进行开发,并且利用ArcGIS Pro SDK提供的功能来扩展ArcGIS Pro软件的功能。 希望这些步骤能够帮助你入门ArcGIS Pro二次开发。如果你遇到了其他问题或需要更多详细的指导,请随时提问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【ArcGIS Pro二次开发】系列学习笔记,持续更新,记得收藏](https://blog.csdn.net/xcc34452366/article/details/129223703)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [ArcGIS Pro二次开发环境配置及项目创建示例](https://blog.csdn.net/wsywsy00/article/details/128550006)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

规划GIS会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值