社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

GISAI • 2 月前 • 179 次点击  


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