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);