ArcGIS Pro SDK (五)内容 2 工程项

ArcGIS Pro SDK (五)内容 2 地图工程

目录

  • [ArcGIS Pro SDK (五)内容 2 地图工程](#ArcGIS Pro SDK (五)内容 2 地图工程)
      • [1 将文件夹连接项添加到当前工程](#1 将文件夹连接项添加到当前工程)
      • [2.2 获取所有工程项](#2.2 获取所有工程项)
      • [2.3 获取工程的所有"MapProjectItems"](#2.3 获取工程的所有“MapProjectItems”)
      • [2.4 获取特定的"MapProjectItem"](#2.4 获取特定的“MapProjectItem”)
      • [2.5 获取所有"样式工程项"](#2.5 获取所有“样式工程项”)
      • [2.6 获取特定的"样式工程项"](#2.6 获取特定的“样式工程项”)
      • [2.7 获取"收藏夹"样式工程项](#2.7 获取“收藏夹”样式工程项)
      • [2.8 获取所有"GDBProjectItems"](#2.8 获取所有“GDBProjectItems”)
      • [2.9 获取特定的"GDBProjectItem"](#2.9 获取特定的“GDBProjectItem”)
      • [2.10 获取所有"服务器连接工程项"](#2.10 获取所有“服务器连接工程项”)
      • [2.11 获取特定的"服务器连接工程项"](#2.11 获取特定的“服务器连接工程项”)
      • [2.12 获取工程中的所有文件夹连接](#2.12 获取工程中的所有文件夹连接)
      • [2.13 获取特定文件夹连接](#2.13 获取特定文件夹连接)
      • [2.14 删除特定文件夹连接](#2.14 删除特定文件夹连接)
      • [2.15 获取特定的"布局工程项"](#2.15 获取特定的“布局工程项”)
      • [2.16 获取工程中的所有布局](#2.16 获取工程中的所有布局)
      • [2.17 获取特定的"地理处理工程项"](#2.17 获取特定的“地理处理工程项”)
      • [2.18 获取工程中的所有地理处理工程项](#2.18 获取工程中的所有地理处理工程项)
      • [2.19 在工程中搜索特定工程](#2.19 在工程中搜索特定工程)
      • [2.20 获取默认工程文件夹](#2.20 获取默认工程文件夹)
      • [2.21 刷新文件夹连接项的子项](#2.21 刷新文件夹连接项的子项)
      • [2.22 获取工程类别](#2.22 获取工程类别)
      • [2.23 使用工程类别](#2.23 使用工程类别)
      • [2.24 使用模板创建工程](#2.24 使用模板创建工程)
      • [2.25 选择工程容器 - 用于 SelectItemAsync](#2.25 选择工程容器 - 用于 SelectItemAsync)
      • [2.26 工程项:获取项或查找项](#2.26 工程项:获取项或查找项)
      • [2.27 在目录窗格中选择一个工程](#2.27 在目录窗格中选择一个工程)

环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0

1 将文件夹连接项添加到当前工程

csharp 复制代码
//添加文件夹连接
string folderPath = "@C:\\myDataFolder";
var folder = await QueuedTask.Run(() =>
                                  {
                                      //创建文件夹连接工程项
                                      var item = ItemFactory.Instance.Create(folderPath) as IProjectItem;
                                      //如果成功添加到程项中返回文件夹连接工程项,否则返回null
                                      return Project.Current.AddItem(item) ? item as FolderConnectionProjectItem : null;
                                  });

//添加GDB
string gdbPath = "@C:\\myDataFolder\\myData.gdb";
var newlyAddedGDB = await QueuedTask.Run(() =>
                                         {
                                             //创建GDB工程项
                                             var item = ItemFactory.Instance.Create(gdbPath) as IProjectItem;
                                             //如果成功添加到程项中返回GDB工程项,否则返回null
                                             return Project.Current.AddItem(item) ? item as GDBProjectItem : null;
                                         });

2.2 获取所有工程项

csharp 复制代码
IEnumerable<Item> allProjectItems = Project.Current.GetItems<Item>();
foreach (var pi in allProjectItems)
{
    //功能代码...
}

2.3 获取工程的所有"MapProjectItems"

csharp 复制代码
IEnumerable<MapProjectItem> newMapItemsContainer = project.GetItems<MapProjectItem>();

await QueuedTask.Run(() =>
                     {
                         foreach (var mp in newMapItemsContainer)
                         {
                             //对地图做点什么。例如:
                             Map myMap = mp.GetMap();
                         }
                     });

2.4 获取特定的"MapProjectItem"

csharp 复制代码
MapProjectItem mapProjItem = Project.Current.GetItems<MapProjectItem>().FirstOrDefault(item => item.Name.Equals("EuropeMap"));

2.5 获取所有"样式工程项"

csharp 复制代码
IEnumerable<StyleProjectItem> newStyleItemsContainer = null;
newStyleItemsContainer = Project.Current.GetItems<StyleProjectItem>();
foreach (var styleItem in newStyleItemsContainer)
{
    //对样式做点什么。
}

2.6 获取特定的"样式工程项"

csharp 复制代码
var container = Project.Current.GetItems<StyleProjectItem>();
StyleProjectItem testStyle = container.FirstOrDefault(style => (style.Name == "ArcGIS 3D"));
StyleItem cone = null;
if (testStyle != null)
    cone = testStyle.LookupItem(StyleItemType.PointSymbol, "Cone_Volume_3");

2.7 获取"收藏夹"样式工程项

csharp 复制代码
var fav_style_item = await QueuedTask.Run(() =>
                                          {
                                              var containerStyle = Project.Current.GetProjectItemContainer("Style");
                                              return containerStyle.GetItems().OfType<StyleProjectItem>().First(item => item.TypeID == "personal_style");
                                          });

2.8 获取所有"GDBProjectItems"

csharp 复制代码
IEnumerable<GDBProjectItem> newGDBItemsContainer = null;
newGDBItemsContainer = Project.Current.GetItems<GDBProjectItem>();
foreach (var GDBItem in newGDBItemsContainer)
{
    //对GDB做点什么
}

2.9 获取特定的"GDBProjectItem"

csharp 复制代码
GDBProjectItem GDBProjItem = Project.Current.GetItems<GDBProjectItem>().FirstOrDefault(item => item.Name.Equals("myGDB"));

2.10 获取所有"服务器连接工程项"

csharp 复制代码
IEnumerable<ServerConnectionProjectItem> newServerConnections = null;
newServerConnections = project.GetItems<ServerConnectionProjectItem>();
foreach (var serverItem in newServerConnections)
{
    //对server做点什么
}

2.11 获取特定的"服务器连接工程项"

csharp 复制代码
ServerConnectionProjectItem serverProjItem = Project.Current.GetItems<ServerConnectionProjectItem>().FirstOrDefault(item => item.Name.Equals("myServer"));

2.12 获取工程中的所有文件夹连接

csharp 复制代码
//获取当前工程中的所有文件夹连接
var projectFolders = Project.Current.GetItems<FolderConnectionProjectItem>();
foreach (var FolderItem in projectFolders)
{
    //对文件夹连接做点什么
}

2.13 获取特定文件夹连接

csharp 复制代码
//获取当前工程中的特定文件夹连接
FolderConnectionProjectItem myProjectFolder = Project.Current.GetItems<FolderConnectionProjectItem>().FirstOrDefault(folderPI => folderPI.Name.Equals("myDataFolder"));

2.14 删除特定文件夹连接

csharp 复制代码
// 从工程中删除文件夹连接;未删除本地磁盘或网络上的文件夹
FolderConnectionProjectItem folderToRemove = Project.Current.GetItems<FolderConnectionProjectItem>().FirstOrDefault(myfolder => myfolder.Name.Equals("PlantSpecies"));
if (folderToRemove != null)
    Project.Current.RemoveItem(folderToRemove as IProjectItem);

2.15 获取特定的"布局工程项"

csharp 复制代码
LayoutProjectItem layoutProjItem = Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault(item => item.Name.Equals("myLayout"));

2.16 获取工程中的所有布局

csharp 复制代码
//获取当前项目中的所有布局
var projectLayouts = Project.Current.GetItems<LayoutProjectItem>();
foreach (var layoutItem in projectLayouts)
{
    //对布局做点什么
}

2.17 获取特定的"地理处理工程项"

csharp 复制代码
GeoprocessingProjectItem GPProjItem = Project.Current.GetItems<GeoprocessingProjectItem>().FirstOrDefault(item => item.Name.Equals("myToolbox"));

2.18 获取工程中的所有地理处理工程项

csharp 复制代码
//获取当前项目中的所有GeoprocessingProjectItem
var GPItems = Project.Current.GetItems<GeoprocessingProjectItem>();
foreach (var tbx in GPItems)
{
    //对工具箱做点什么
}

2.19 在工程中搜索特定工程

csharp 复制代码
List<Item> _mxd = new List<Item>();
//获取当前工程中的所有文件夹连接
var allFoldersItem = Project.Current.GetItems<FolderConnectionProjectItem>();
if (allFoldersItem != null)
{
    //遍历找到的所有文件夹连接项
    foreach (var folderItem in allFoldersItem)
    {
        //在该文件夹连接中搜索mxd文件,并将其添加到List<T>
        //注意:ArcGIS Pro在构建和使用工程时自动创建和动态更新可搜索索引。
        //将项添加到工程时,它们将被编入索引。
        //第一次索引文件夹或数据库时,如果它包含大量项目,则索引可能需要一段时间。
        //创建索引时,搜索不会返回任何结果。
        _mxd.AddRange(folderItem.GetItems());
    }
}

2.20 获取默认工程文件夹

csharp 复制代码
//获取Pro的默认项目设置。
var defaultSettings = Project.GetDefaultProjectSettings();
var defaultProjectPath = defaultSettings.LocationPath;
if (defaultProjectPath == null)
{
    // 如果没有设置,项目将保存在用户的...\My Documents\ArcGIS\Projects文件夹中;
    // 如果该文件夹不存在,则创建该文件夹。
    defaultProjectPath = System.IO.Path.Combine(
        System.Environment.GetFolderPath(
            Environment.SpecialFolder.MyDocuments),
        @"ArcGIS\Projects");
}

2.21 刷新文件夹连接项的子项

csharp 复制代码
var contentItem = Project.Current.GetItems<FolderConnectionProjectItem>().First();
//var contentItem = ...
//Check if the MCT is required for Refresh()
//检查刷新是否需要使用MCT线程
if (contentItem.IsMainThreadRequired)
{
    //如果item.IsMainThreadRequired为true,必须使用QueuedTask.Run()
    //返回true
    QueuedTask.Run(() => contentItem.Refresh());
}
else
{
    //如果item.IsMainThreadRequired为false,任何线程都可以调用Refresh(),但首选BackgroundTask。
    contentItem.Refresh();

    //或者通过BackgroundTask
    ArcGIS.Core.Threading.Tasks.BackgroundTask.Run(() =>
                                                   contentItem.Refresh(), ArcGIS.Core.Threading.Tasks.BackgroundProgressor.None);
}

2.22 获取工程类别

csharp 复制代码
//获取与项关联的项目类别
Item gdb = ItemFactory.Instance.Create(@"E:\CurrentProject\RegionalPolling\polldata.gdb");
List<ItemCategory> gdbItemCategories = gdb.ItemCategories;

2.23 使用工程类别

csharp 复制代码
//使用ItemCategory作为筛选器浏览项目
IEnumerable<Item> gdbContents = gdb.GetItems();
IEnumerable<Item> filteredGDBContents1 = gdbContents.Where(item => item.ItemCategories.OfType<ItemCategoryDataSet>().Any());
IEnumerable<Item> filteredGDBContents2 = new ItemCategoryDataSet().Items(gdbContents);

2.24 使用模板创建工程

csharp 复制代码
var projectFolder = System.IO.Path.Combine(
    System.Environment.GetFolderPath(
        Environment.SpecialFolder.MyDocuments),
    @"ArcGIS\Projects");

CreateProjectSettings ps = new CreateProjectSettings()
{
    Name = "MyProject",
    LocationPath = projectFolder,
    TemplatePath = @"C:\data\my_templates\custom_template.aptx"
};

var project = await Project.CreateAsync(ps);

2.25 选择工程容器 - 用于 SelectItemAsync

csharp 复制代码
//使用 Project.Current.ProjectItemContainers
var folderContainer = Project.Current.ProjectItemContainers.First(c => c.Path == "FolderConnection");
var gdbContainer = Project.Current.ProjectItemContainers.First(c => c.Path == "GDB");
var mapContainer = Project.Current.ProjectItemContainers.First(c => c.Path == "Map");
var layoutContainer = Project.Current.ProjectItemContainers.First(c => c.Path == "Layout");
var toolboxContainer = Project.Current.ProjectItemContainers.First(c => c.Path == "GP");

//或者使用 Project.Current.GetProjectItemContainer

folderContainer = Project.Current.GetProjectItemContainer("FolderConnection");
gdbContainer = Project.Current.GetProjectItemContainer("GDB");
mapContainer = Project.Current.GetProjectItemContainer("Map");
layoutContainer = Project.Current.GetProjectItemContainer("Layout");
toolboxContainer = Project.Current.GetProjectItemContainer("GP");

2.26 工程项:获取项或查找项

csharp 复制代码
//GetItems搜索项内容
var map = Project.Current.GetItems<MapProjectItem>().FirstOrDefault(m => m.Name == "Map1");
var layout = Project.Current.GetItems<LayoutProjectItem>().FirstOrDefault(m => m.Name == "Layout1");
var folders = Project.Current.GetItems<FolderConnectionProjectItem>();
var style = Project.Current.GetItems<StyleProjectItem>().FirstOrDefault(s => s.Name == "ArcGIS 3D");

//"查找项"使用目录路径。路径可以是文件或数据集
var fcPath = @"C:\Pro\CommunitySampleData\Interacting with Maps\Interacting with Maps.gdb\Crimes";
var pdfPath = @"C:\Temp\Layout1.pdf";
var imgPath = @"C:\Temp\AddinDesktop16.png";

var fc = Project.Current.FindItem(fcPath);
var pdf = Project.Current.FindItem(pdfPath);
var img = Project.Current.FindItem(imgPath);

2.27 在目录窗格中选择一个工程

csharp 复制代码
//获取目录窗格
ArcGIS.Desktop.Core.IProjectWindow projectWindow = Project.GetCatalogPane();
//或者获取活动目录视图......
//ArcGIS.Desktop.Core.IProjectWindow projectWindow = Project.GetActiveCatalogWindow();

//eg 在工程中找到一个工具箱
string gpName = "Interacting with Maps.tbx";
var toolbox = Project.Current.GetItems<GeoprocessingProjectItem>().FirstOrDefault(tbx => tbx.Name == gpName);
//在"工具箱"下选择它
projectWindow.SelectItemAsync(toolbox, true, true, null);//Null在第一个容器中选择它-可选的await
//注意:Project.Current.GetProjectItemContainer("GP")将得到toolbox container...

//假设toolbox也在文件夹容器下。在文件夹下而不是工具箱下选择它
var foldersContainer = Project.Current.ProjectItemContainers.First(c => c.Path == "FolderConnection");
//必须指定容器,因为文件夹排在第二位(在工具箱之后)。
projectWindow.SelectItemAsync(toolbox, true, true, foldersContainer);//optionally await

//找到一张地图并选择它
var mapItem = Project.Current.GetItems<MapProjectItem>().FirstOrDefault(m => m.Name == "Map");
//Map只出现在"Maps"下,因此不需要指定容器
projectWindow.SelectItemAsync(mapItem, true, false, null);
相关推荐
TENET信条37 分钟前
day53 第十一章:图论part04
开发语言·c#·图论
anlog2 小时前
C#在自定义事件里传递数据
开发语言·c#·自定义事件
向宇it3 小时前
【从零开始入门unity游戏开发之——unity篇01】unity6基础入门开篇——游戏引擎是什么、主流的游戏引擎、为什么选择Unity
开发语言·unity·c#·游戏引擎
仰望大佬0074 小时前
Avalonia实例实战五:Carousel自动轮播图
数据库·microsoft·c#
糖朝4 小时前
c#读取json
c#·json
向宇it9 小时前
【从零开始入门unity游戏开发之——C#篇26】C#面向对象动态多态——接口(Interface)、接口里氏替换原则、密封方法(`sealed` )
java·开发语言·unity·c#·游戏引擎·里氏替换原则
Java Fans13 小时前
C# 中串口读取问题及解决方案
开发语言·c#
盛派网络小助手13 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#
码农君莫笑13 小时前
信管通低代码信息管理系统应用平台
linux·数据库·windows·低代码·c#·.net·visual studio
鲤籽鲲14 小时前
C# Random 随机数 全面解析
android·java·c#