ArcGIS Pro SDK:C# 与 Python 地图刷新代码
在 ArcGIS Pro 中,使用 C#(ArcGIS Pro SDK)和 Python(ArcPy)刷新地图,方法有所不同。
通常“地图刷新”有以下几种需求:
1.刷新地图显示:重新绘制地图,不改变图层数据。
2.刷新图层数据:外部数据发生变化后,让地图显示最新数据。
3.刷新地图范围:重新定位或缩放地图。
4.刷新地图中的所有图层:批量更新显示。
一、C#:ArcGIS Pro SDK 地图刷新
1. 刷新当前地图视图
使用 MapView.Redraw():
using ArcGIS.Desktop.Mapping;
public void RefreshMap()
{
MapView mapView = MapView.Active;
if (mapView != null)
{
mapView.Redraw(true);
}
}
其中:
·MapView.Active:获取当前活动地图视图。
·Redraw(true):请求重绘地图,并清除绘制缓存。
·Redraw(false):请求重绘,但不强制清除缓存。
这是 ArcGIS Pro SDK 中最直接的地图刷新方法。
2. 刷新地图中的所有图层
using ArcGIS.Desktop.Mapping;
public void RefreshAllLayers()
{
MapView mapView = MapView.Active;
if (mapView == null)
return;
mapView.Redraw(true);
}
注意:Redraw(true) 会请求重新绘制地图,但不等于重新打开每个图层的数据源。如果数据库中的数据发生变化,还需要考虑数据缓存和数据源更新。
3. 推荐:异步刷新地图
ArcGIS Pro 3.x SDK 推荐使用 RedrawAsync(),可避免直接调用 Redraw() 时的线程问题。
using ArcGIS.Desktop.Mapping;
using System.Threading.Tasks;
public async Task RefreshMapAsync()
{
var mapView = MapView.Active;
if (mapView != null)
{
await mapView.RedrawAsync(true);
}
}
如果使用同步 Redraw(),则必须在 MCT 线程中执行:
using ArcGIS.Desktop.Framework.Threading.Tasks;
using ArcGIS.Desktop.Mapping;
using System.Threading.Tasks;
public async Task RefreshMapAsync()
{
var mapView = MapView.Active;
if (mapView == null)
return;
await QueuedTask.Run(() =>
{
mapView.Redraw(true);
});
}
官方文档:MapView.Redraw — https://pro.arcgis.com/en/pro-app/3.5/sdk/api-reference/topic20822.html
MapView.RedrawAsync — https://doc.esri.com/en/arcgis-pro/latest/sdk/api-reference/topic20823.html
二、Python:ArcPy 地图刷新
1. 刷新指定图层
在支持 RefreshLayer 的 ArcGIS Pro 版本中:
import arcpy
arcpy.RefreshLayer("MyLayer")
2. 刷新多个图层
import arcpy
arcpy.RefreshLayer([
"Roads",
"Buildings",
"Parcels"
])
3. 刷新当前地图所有图层
import arcpy
aprx = arcpy.mp.ArcGISProject("CURRENT")
m = aprx.activeMap
if m:
layer_names = [
lyr.name
for lyr in m.listLayers()
if lyr.isFeatureLayer
]
if layer_names:
arcpy.RefreshLayer(layer_names)
该方法适合在 ArcGIS Pro 的 Python 窗口或 Notebook 中运行。RefreshLayer 会刷新包含指定图层的地图视图。
三、C# 与 Python 刷新方式对比
需求 | C# SDK | Python ArcPy |
地图重新绘制 | Redraw(true) | RefreshLayer() |
异步刷新 | RedrawAsync(true) | 无直接对应异步 API |
清除要素绘制缓存 | RedrawAsync(true) | 无直接对应参数 |
刷新多个图层 | RedrawAsync(true) | RefreshLayer([...]) |
修改地图范围 | ZoomToAsync() | camera.setExtent() |
四、C# 调用 Python 后自动刷新地图
如果你的工作流程是 C# ArcGIS Pro SDK 调用 Python 脚本,Python 修改 GIS 数据,最后 C# 刷新地图,可以在 Python 脚本运行结束后执行:
// Python 脚本执行完成后
await MapView.Active.RedrawAsync(true);
应确保 Python 已经完成数据写入并释放数据锁,再刷新地图。
五、不同使用场景
可按实际需要进一步选择完整代码:
·Python 修改数据后,C# 自动刷新地图
·C# SDK 按钮点击后刷新地图
·定时自动刷新地图(例如每 5 秒)
·只用 Python 刷新地图
可依据 ArcGIS Pro 3.x 或 2.x 版本分别调整实现。