地图是ArcGIS Pro中的基础起点,也是大多数工程的基础。主要用于显示表示空间数据的图层。
var map = MapView.Active.Map;
var lys = map.Layers;
用于获取地图中的单一图层,以及图层组。但不包括图层组下面的图层。
var lys = map.GetLayersAsFlattenedList();
【GetLayersAsFlattenedList()】方法用于获取地图中的所有图层。
var lys = map.GetLayersAsFlattenedList().OfType();
在【GetLayersAsFlattenedList()】方法加上【OfType】则会对获取的图层按类型进行筛选。如【FeatureLayer】代表要素图层,【GroupLayer】代表图层组等。
var lys = MapView.Active.GetSelectedLayers();
【GetSelectedLayers()】方法用于获取当前选定的图层。
var lys = map.GetStandaloneTablesAsFlattenedList();
【GetLayersAsFlattenedList()】方法用于获取地图中的所有独立表。
var lys = map.FindLayers(LayerName);
【FindLayers(LayerName)】方法用于按图层名查找相应图层,注意这里的LayerName不支持模糊查找。
var sr = map.SpatialReference;
Map的【SpatialReference】属性返回地图的坐标系。
// 获取当前地图
var map = MapView.Active.Map;
// 获取第一个图层
var ly = map.GetLayersAsFlattenedList();
// 移动到最后的位置
QueuedTask.Run(async () =>
{
map.MoveLayer(ly[0], -1);
});
【MoveLayer(Layer, index)】方法用于按标签位置移动图层的位置。
这里演示的是将地图中的第1个图层移动到最后的位置。
// 获取当前地图
var map = MapView.Active.Map;
// 获取所有图层
var lys = map.GetLayersAsFlattenedList();
// 移除所有图层
QueuedTask.Run(async () =>
{
map.RemoveLayers(lys);
});
【RemoveLayers(lys)】方法用于移除图层列表。
【RemoveLayer(ly)】方法用于移除单一图层。
这里演示的是用【RemoveLayers(lys)】方法移除地图中的所有图层。
// 获取当前地图
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。
// 获取当前地图
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()】方法用于将地图保存为地图文件。
map.FindAndReplaceWorkspacePath(path1, path2);
其中path1为当前要素图层所在的数据库,path2为要替换的数据库。
一个应用场景:如村庄规划,地图内的要素全部来自一个村庄成果数据库。复制一个新的地图,并将地图的数据库路径替换成新的村庄数据库,代码运行结果会将地图内的图层全部替换,不用遍历所有图层。
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个参数都用的是默认值,可以不输入。
await QueuedTask.Run(async () =>
{
Map map = null;
Project proj = Project.Current;
// 查找名称与map_name匹配的第一个项目项(StringComparison参数设置为忽略大小写)
var map_name = "这个一个新建地图";
MapProjectItem mpi = proj.GetItems()
.FirstOrDefault(m => m.Name.Equals(map_name, StringComparison.CurrentCultureIgnoreCase));
if (mpi != null)
{
map = mpi.GetMap();
// 在地图视图中打开地图
await ProApp.Panes.CreateMapPaneAsync(map);
}
});
这里主要通过Project.GetItems()先获取
最后用ProApp.Panes.CreateMapPaneAsync()方法将地图打开。
// 获取当前的地图面板
var mapPanes = ProApp.Panes.OfType()
.GroupBy((mp) => mp.MapView.Map.URI).Select(grp => grp.FirstOrDefault());
// 从地图面板中获取地图
List
这里获取地图面板用了个比较复杂的lamda表达式,直接从官方文档抄的。
await QueuedTask.Run(() =>
{
MapView.Active.Map.SetName("NewMap");
});
修改当前活动地图的名字。
ProApp.Panes.ActivePane.Caption = "NewCaption";
修改当前活动地图面板的名字。
await QueuedTask.Run(() =>
{
var map = MapView.Active.Map;
// 获取用来裁剪的要素类
var lyrOfInterest = MapView.Active.Map.GetLayersAsFlattenedList().OfType().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)));
});
需注意,这是在地图中的裁剪,而不是布局。
await QueuedTask.Run(() =>
{
var map = MapView.Active.Map;
map.ClearClipGeometry();
});
清除上面那个功能生成的裁剪要素。
最后,放上工程文件的链接:
MapManagerhttps://pan.baidu.com/s/1JqITwFtqSFjww5JTOM0RZQ?pwd=4myr