Py学习  »  Python

ArcGIS Pro C#和Python二次开发的区别

GISAI • 1 周前 • 51 次点击  


ArcGIS Pro 二次开发深度解析

C# 开发 vs Python 开发

技术选型 · 优缺点剖析 · 实战场景决策


 


GIS 技术系列文档  |  2026 年 6 月 


目录

 


一、引言:二次开发的两条路线       2

二、核心技术概述       2

2.1 ArcGIS Pro C# 开发(ArcGIS Pro SDK)       2

2.2 ArcGIS Pro Python 开发(arcpy)       2

三、全维度对比分析(16 个维度)       3

四、C# 开发深度解析       4

4.1 C# 开发的核心优势       4

4.2 C# 最佳使用场景       4

4.3 C# 开发的局限与挑战       5

五、Python 开发深度解析       5

5.1 Python 开发的核心优势       5

5.2 Python 最佳使用场景       6

5.3 Python 开发的局限与边界       7

六、底层差异:为什么是这样的格局       7

七、决策框架:如何选择开发语言       8

7.1 任务场景决策矩阵       8

7.2 项目维度快速决策树       9

八、协同模式:C# 与 Python 的联合作战       9

九、宁夏林业 GIS 项目实战建议       10

十、结语与学习路径建议       11 


一、引言:二次开发的两条路线

ArcGIS Pro 提供了两套完整的二次开发体系:以 ArcGIS Pro SDK(C#)为代表的「桌面端深度定制」路线,以及以 arcpy 为核心的「数据处理自动化」路线。这两条路线并不是同一件事的两种做法,而是面向不同层次需求的独立解决方案。 


许多 GIS 从业者的困惑在于:我想做一个 ArcGIS Pro 的自定义功能,用 C# 还是 Python?这个问题的答案取决于你要做的是「什么功能」——而不是你更熟悉哪门语言。 


核心判断:Python(arcpy)主要用于「数据处理与地理分析自动化」;C#(ArcGIS Pro SDK)主要用于「ArcGIS Pro 应用程序界面与交互的深度定制」。二者的边界清晰,最优状态是按需协同。 


二、核心技术概述

2.1 ArcGIS Pro C# 开发(ArcGIS Pro SDK)

ArcGIS Pro SDK for .NET 是 Esri 官方发布的桌面 GIS 应用程序开发套件,基于 Microsoft .NET Framework / .NET 6+,使用 C# 语言,通过 Visual Studio 进行开发。它采用异步编程模型(async/await),并遵循 MVVM(Model-View-ViewModel)设计模式。


核心能力:

自定义 ArcGIS Pro 界面(Ribbon 按钮、菜单、停靠面板、地图窗口扩展)

与 ArcGIS Pro 地图画布进行深度交互(鼠标操作、要素选择、编辑会话)

构建企业级 .addin 插件(Add-in),可部署和分发

调用完整的 ArcGIS Pro SDK Geometry API 进行高性能几何运算

集成 Windows 企业应用系统(Active Directory、数据库、Web 服务)


2.2 ArcGIS Pro Python 开发(arcpy)

arcpy 是 Esri 随 ArcGIS Pro 发布的官方 Python 站点包,提供对几乎所有地理处理工具的程序化调用,并深度集成 Python 的数据科学生态(pandas、numpy、matplotlib 等)。


核心能力:

调用 600+ 地理处理工具(Geoprocessing Tools)进行空间分析

通过 Cursor 类(SearchCursor / UpdateCursor / InsertCursor)逐要素读写数据

批量自动化处理大规模 GIS 数据集

集成 pandas / numpy / scikit-learn 等数据科学库

开发 Python 脚本工具,嵌入工具箱(.atbx)供他人使用

在 ArcGIS Pro Notebook 中进行交互式空间数据分析 


三、全维度对比分析(16 个维度)

下表从技术、工程和工作场景三个层次,系统比较 C# 与 Python 在 ArcGIS Pro 开发中的差异:

对比维度

C#(ArcGIS Pro SDK)

Python(arcpy)

开发工具

Visual Studio(完整 IDE)

VS Code / PyCharm / Notebook

学习门槛

高(C# + .NET + MVVM + SDK)

中低(Python + arcpy API)

运行方式

编译型(需构建 .addin 包)

解释型(直接运行脚本)

界面开发

完整支持(Ribbon/Panel/窗口)

不支持(无 UI 定制能力)

地图交互

完整支持(鼠标/选择/编辑)

仅支持数据操作,不支持交互

数据处理能力

中(通过 SDK API 间接调用)

强(直接调用全部 GP 工具)

批量自动化

可实现但较复杂

天然适合,for 循环即可

第三方库集成

丰富(NuGet:EF、NPOI 等)

极丰富(pip:pandas/ml/api 等)

性能

极高(编译型,内存操作高效)

良好(解释型,大数据量略慢)

错误处理

完整异常机制(try/catch)

完整异常机制(try/except)

调试便利性

强(断点、Watch 窗口)

中(print / logging / Notebook)

部署与分发

.addin 包,统一部署到 Pro

脚本 / 工具箱,灵活部署

版本控制

完全支持(git)

完全支持(git)

企业系统集成

强(Active Directory / SQL / WPF)

中(requests / pyodbc)

AI / 机器学习集成

强(scikit-learn / tensorflow 等)

开发周期

长(SDK 复杂,原型成本高)

短(脚本快速验证和迭代)


 

四、C# 开发深度解析

4.1 C# 开发的核心优势

ArcGIS Pro SDK(C#)的不可替代性,体现在以下几个方面:


✅ 唯一能定制 ArcGIS Pro 界面的方式:自定义 Ribbon 选项卡、按钮、工具、菜单,这是 Python 根本做不到的

✅ 地图交互与编辑:监听地图事件(鼠标点击、要素选择、层树变更),实现自定义编辑工具

✅ 高性能几何处理:通过 SDK 的 Geometry API 直接操作内存中的几何对象,无需调用 GP 工具,效率极高

✅ 与 Windows 企业生态深度集成:WPF 界面、Active Directory 认证、SQL Server 直连、Windows 服务

✅ 强类型语言保障代码质量:编译时类型检查,大型项目的代码可靠性更高

✅ .addin 标准化分发:打包为 .addin 文件,一键部署到团队所有成员的 ArcGIS Pro


4.2 C# 最佳使用场景


场景一:为 ArcGIS Pro 开发自定义插件工具

当你需要在 ArcGIS Pro 的 Ribbon 工具栏中增加业务专属按钮(如「一键生成林权证」「批量导出报表」),并希望以 .addin 标准化部署到全单位的 ArcGIS Pro,C# 是唯一选择。

场景二:自定义停靠面板与交互界面

开发嵌入在 ArcGIS Pro 中的自定义 Dockpane(停靠面板),如实时查询面板、属性快速填报面板、业务系统数据查询窗口,这类需求完全属于 C# SDK 的领域。 

场景三:地图工具与实时交互

需要响应用户在地图上的操作(点击、框选、绘制)并执行业务逻辑时,例如「点击要素自动调取数据库中的档案信息」,必须用 C# 实现 MapTool 类。

场景四:高性能几何运算

对大量几何对象进行内存级运算(相交判断、缓冲区计算、坐标变换)且对实时性要求高时,C# 的 GeometryEngine API 直接操作内存中的几何对象,性能远优于通过 GP 工具走磁盘 I/O 的 Python 方案。

场景五:企业级 GIS 系统集成

当 ArcGIS Pro 需要与企业内部系统深度集成(OA 系统、数据库、认证中心),或者开发一套完整的「林业 GIS 业务系统」(不仅是脚本工具,而是一个可交付的软件产品)时,C# 才能支撑这种规模的工程。


4.3 C# 开发的局限与挑战

⚠️ 警示  C# 开发的成本远高于 Python,以下场景选择 C# 会产生大量不必要的复杂度:

❌ 做数据处理自动化(批量运算、属性更新),Python 更简单高效

❌ 需要快速验证一个 GIS 分析流程,C# 的编译-部署周期太长

❌ 集成机器学习或深度学习模型,Python 生态无可替代

❌ 没有 C# 和 .NET 基础,入门成本极高(SDK 文档复杂,异步编程模型难理解)

❌ 脚本工具共享,C# .addin 需要匹配 ArcGIS Pro 版本,Python 工具箱无此限制

五、Python 开发深度解析

5.1 Python 开发的核心优势

arcpy + Python 的生态组合,是 GIS 数据工程师日常工作效率最大化的核心武器:

✅ 入门成本低,回报率高:Python 语法简洁,arcpy 的 API 直观,几天内可上手处理真实数据

✅ 与数据科学生态无缝融合:pandas 数据清洗、numpy 矩阵运算、matplotlib 可视化、scikit-learn 机器学习,均可与 arcpy 联合使用

✅ 天然适合自动化:批量处理成百上千个文件、图层、要素,只需简单的 for 循环

✅ Cursor 精细化数据操作:SearchCursor / UpdateCursor / InsertCursor 支持逐要素读写,是数据质检和自动修复的核心工具

✅ ArcGIS Pro Notebook 集成:交互式空间数据分析,代码 + 可视化地图同页显示

✅ 快速迭代:修改脚本后立即运行,无需编译,调试周期极短

5.2 Python 最佳使用场景

场景一:大规模批量地理数据处理

处理几十到几千个要素类、栅格文件、地理数据库,Python 的循环结构是最自然的解决方案。例如:将目录下所有 shapefile 批量转换为 CGCS2000 坐标系并导入 GDB。

场景二:空间分析与地理处理工作流自动化

将一套固定的地理分析步骤(叠加分析 → 属性统计 → 导出 Excel)自动化为脚本,一行命令跑完整个分析流程,并可以定时执行或集成到 Windows 任务计划程序。

场景三:数据质检与自动修复

利用 arcpy.da.SearchCursor 遍历每个要素,校验属性值的合规性(如林地类型代码是否在规定值域、面积是否为正数),发现问题时用 UpdateCursor 自动修复,无需人工逐条检查。

场景四:GIS + 数据科学联合分析

当 GIS 分析任务与统计、机器学习、可视化高度耦合时,Python 是唯一选择:

遥感影像建筑物足迹提取(结合深度学习模型)

土地利用变化的时序分析(pandas + arcpy 联合)

林地资源的统计报表自动生成(pandas + openpyxl)

场景五:脚本工具开发(SPToolsForPro 类型)

开发嵌入工具箱的 Python 脚本工具,提供参数对话框给用户使用,无需用户了解脚本细节。这类工具具备参数验证、进度条(arcpy.SetProgressorLabel)、错误提示等功能,是工具箱扩展的主流方式。

场景六:外部数据源集成与 API 调用

当 GIS 工作流需要与外部系统交互,Python 是最灵活的选择:

读取 Excel/CSV 与 GIS 属性表做关联更新(pandas + UpdateCursor)

调用 REST API 获取实时气象/土地数据(requests 库)

连接 PostgreSQL/SQLite 进行空间数据库操作(psycopg2 / sqlite3)

5.3 Python 开发的局限与边界


⚠️ Python 无法替代 C# 的场景  以下需求 Python 无法实现,需切换到 C# SDK:

❌ 在 ArcGIS Pro 的 Ribbon 工具栏增加自定义按钮或工具组

❌ 开发嵌入 ArcGIS Pro 的自定义停靠面板(Dockpane)

❌ 监听并响应用户在地图画布上的鼠标操作(MapTool)

❌ 修改或扩展 ArcGIS Pro 的编辑工作流(自定义编辑操作)

❌ 打包成 .addin 插件进行标准化团队部署


六、底层差异:为什么是这样的格局

理解 C# 和 Python 在 ArcGIS Pro 开发中的定位差异,需要从 Esri 的技术架构说起。

架构层次

技术组件

开放接口

UI 展示层

ArcGIS Pro 应用程序(WPF + C#)

ArcGIS Pro SDK → C# 独享

业务逻辑层

ArcGIS Pro 核心引擎(C++ / C#)

SDK API(C#)/ arcpy(Python)

地理处理层

Geoprocessing Framework(GP 引擎)

arcpy 调用全部 GP 工具

数据访问层

Geodatabase Engine / File System

arcpy Cursor / SDK Data API


核心结论:ArcGIS Pro 的 UI 层仅对 C# SDK 开放;GP 工具层对 Python 和 C# 均开放,但 Python 调用更简便;数据访问层两者均可,Python 的 Cursor 更灵活。


🔍 本质区别  C# 面向「应用程序开发」,目标是构建一个可交付的 GIS 软件产品;Python 面向「数据工程」,目标是高效处理和分析 GIS 数据。 


七、决策框架:如何选择开发语言

7.1 任务场景决策矩阵

使用场景

C# 开发

Python 开发

推荐

在 Pro 工具栏增加自定义按钮

原生支持(MapButton)

不支持

C#(唯一选择)

批量处理 GIS 数据文件

可实现但繁琐

for 循环天然适合

Python

开发停靠面板(Dockpane)

原生支持

不支持

C#(唯一选择)

属性表质检与自动修复

间接实现,成本高

UpdateCursor 精确控制

Python

读 Excel 关联更新 GIS 属性

需引入第三方库

pandas + UpdateCursor

Python

地图鼠标事件响应(MapTool)

原生支持

不支持

C#(唯一选择)

调用机器学习模型

弱(需 COM 互操作)

丰富(scikit-learn 等)

Python

高性能内存几何运算

GeometryEngine(极快)

arcpy.Geometry(较慢)

C#(性能优先)

调用 REST API 获取外部数据

可实现(HttpClient)

requests 库更简便

Python(优先)

打包 .addin 分发给团队

原生支持

不支持此格式

C#

开发脚本工具嵌入工具箱

不适用

Python 脚本工具原生支持

Python

与 SQL Server 深度集成

Entity Framework / ADO.NET

pyodbc(可实现)

C#(更成熟)

遥感影像分析与 ML 结合

不适用

arcpy + rasterio + pytorch

Python

ArcGIS Pro Notebook 探索分析

不支持

原生支持

Python

林权证等文档批量生成

OpenXML(较复杂)

python-docx / COM 互操作

Python(更快)


 

7.2 项目维度快速决策树

遇到一个开发需求,按以下顺序快速判断:

Step 1.需要修改 ArcGIS Pro 的界面(按钮/面板/菜单)吗?→ 是 → 必须用 C#

Step 2.需要响应地图上的鼠标/交互事件吗?→ 是 → 必须用 C#

Step 3.需要打包成 .addin 进行标准化部署吗?→ 是 → 必须用 C#

Step 4.以上都不是,主要做数据处理/分析/自动化?→ 优先用 Python

Step 5.数据处理中有超高性能几何计算需求?→ 考虑 C# SDK Geometry API 或混合方案


八、协同模式:C# 与 Python 的联合作战

在实际工程中,C# 和 Python 可以形成强大的协同。以下是两种经典协同架构:

协同模式一:C# 触发 Python 脚本

在 C# 开发的 ArcGIS Pro 插件中,通过按钮点击触发后台 Python 脚本执行繁重的数据处理任务:


// C# 侧:按钮点击后调用 Python 脚本           
protected override async void OnClick() {           
    await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() => {           
        var gp = Geoprocessing.ExecuteToolAsync(           
            "python", new[] { @"D:\scripts\batch_update.py" }           
        );           
    }); }


✅ 适用场景  C# 提供「企业级 UI 入口」,Python 承担「数据处理引擎」,用户无需感知内部语言的切换。


协同模式二:Python 调用 C# 封装的 GP 工具

将复杂的 C# 地理处理逻辑封装为自定义 GP 工具,通过 Python 脚本统一调度:


# Python 侧:调用 C# 开发的自定义工具           
import arcpy           

# 批量调用企业级 C# 工具处理每个地块           
for parcel in parcel_list:     arcpy.EnterpriseTools.HighPerfIntersect(parcel, boundary, output_gdb)


✅ 适用场景  C# 实现性能敏感的核心算法,Python 实现业务编排逻辑,最大化各自优势。

九、宁夏林业 GIS 项目实战建议

结合宁夏林业 GIS 项目工作特点与 SPToolsForPro 工具箱的扩展方向,以下是具体的语言选型建议:

工作任务

推荐语言

理由

林地空间相交与面积计算(批量)

Python

批量循环 + UpdateCursor,简洁高效

林班属性质检与自动修复

Python

SearchCursor + 条件判断,精确控制

SPToolsForPro 工具开发(数据处理类)

Python 脚本工具

参数对话框 + GP 工具调用,主流方式

SPToolsForPro 工具开发(UI 类)

C# .addin

需要 Pro 界面定制,只能用 C# SDK

遥感影像建筑物提取(ML 结合)

Python

rasterio + pytorch / onnx 集成

林权证文档批量生成

Python(docx/COM)

模板填写、批量生成,Python 生态丰富

征地数据叠加统计报表

Python(pandas)

Excel 导出、数据透视,pandas 更强

开发「一键导出林地报告」Ribbon 按钮

C# SDK

界面定制,.addin 部署,C# 唯一能实现

ArcGIS Pro 地图上点击查询档案

C# SDK(MapTool)

地图交互事件,C# 独占接口

Notebook 中探索性空间分析

Python Notebook

交互式可视化,保留分析思路

批量修改 GDB 中 SRS/投影

Python(arcpy)

循环 + DefineProjection,代码 5 行搞定

高性能几何相交(实时 UI 场景)

C# GeometryEngine

内存操作,避免 GP 工具的磁盘 IO


 

🏆 工具箱扩展原则  SPToolsForPro 中「数据处理类工具」优先用 Python 脚本工具实现;「界面集成类工具」(需要嵌入 Pro 界面)用 C# SDK 开发 .addin,两者可以通过「C# 调用 Python GP 工具」的方式互补。


十、结语与学习路径建议

C# 和 Python 在 ArcGIS Pro 开发中并不竞争,而是构成了一个完整的技术栈:Python 是数据工程的脊梁,C# 是应用程序的骨架。理解这一点,就能避免「用 Python 去做 C# 该做的事」或「用 C# 去写数据处理脚本」这类常见的方向性错误。

维度

C#(ArcGIS Pro SDK)

Python(arcpy)

定位

GIS 软件产品开发

GIS 数据工程自动化

最强场景

界面定制 · 地图交互 · .addin 分发

批量处理 · 数据分析 · 工具箱扩展

学习优先级

有界面开发需求再学

入门 GIS 开发首选

与 Pro 关系

深度嵌入(修改 Pro 本身)

外部调用(驱动 Pro 的功能)


 

学习路径建议

Python 路径(GIS 数据工程方向)

1.Python 基础(数据类型 / 控制流 / 函数 / 文件操作)—— 2-4 周

2.arcpy 核心 API:GP 工具调用 / Cursor 类 / 环境变量 —— 2 周

3.pandas + openpyxl 数据处理 + 报表生成 —— 1 周

4.开发第一个完整的 Python 脚本工具并嵌入工具箱 —— 1 周

5.进阶:arcpy 空间分析 / Notebook / 遥感影像处理 —— 持续学习

C# 路径(GIS 应用开发方向)

1.C# 语言基础(类型系统 / 面向对象 / async/await)—— 4-6 周

2.WPF 基础 + MVVM 设计模式 —— 2-3 周

3.ArcGIS Pro SDK 入门(Add-in 开发 / Button / MapTool)—— 2 周

4.开发第一个完整 .addin 并部署测试 —— 1 周

5.进阶:Dockpane / Geometry API / 企业系统集成 —— 持续学习

一句话总结:先精通 Python(arcpy),能让你的日常 GIS 工作效率提升 10 倍;再学 C# SDK,能让你把 GIS 能力做成可交付的专业软件产品。


——  GIS 技术文档系列

2026 年 6 月

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