Py学习  »  Python

ArcGIS Pro 地图刷新 C# 与 Python 代码

GISAI • 3 周前 • 146 次点击  

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 版本分别调整实现。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/202312