当前位置: 首页 > news >正文

基于ArcGIS Pro SDK 3.4.2 + C# + .NET 8 的自动化制图系统初探

引言

在GIS项目中,地图出图是成果交付的重要环节。然而,面对多样化的制图需求——如不同边框样式、复杂表格、竖向文本、多尺寸图纸等——传统手工布局方式效率低下,且难以维护。为解决这一问题,我们初步开发了一套基于 ArcGIS Pro SDK 3.4.2C#.NET 8 的自动化制图系统。

目前系统已能基本满足现有项目的出图需求,实现了通过配置驱动地图元素生成的核心功能。本文将分享该系统的初步设计与实现过程,为后续优化和扩展提供基础。


一、项目背景与目标

1. 面临的挑战

  • 出图样式多样:单边框、双边框、含表格、上下/左右文字等
  • 图纸尺寸不一,但布局逻辑相似
  • 手动配置耗时,后期样式变更需重复调整
  • 要求输出风格统一、位置精准

2. 初期目标

  • 实现可配置的布局元素生成
  • 支持文本、表格、边框、比例尺、指北针等基础元素
  • 通过JSON配置文件控制出图样式
  • 提高出图效率,降低人工干预

当前状态:系统已实现基本功能,能稳定生成符合要求的地图布局,但尚未大规模应用。


二、技术选型与架构

技术栈

组件 版本
开发平台 ArcGIS Pro SDK for .NET 3.4.2
编程语言 C# 12
运行环境 .NET 8
IDE Visual Studio 2022

三、核心配置设计

系统采用 JSON 配置文件 驱动布局生成,分为 样式定义对象实例 两部分。

1. 样式配置(Styles)

文本样式

{"textStyles": {"default": {"fontName": "宋体","fontSize": 5.0,"foreColor": "0,0,0","bold": false,"hAlignment": "Left","vAlignment": "Top","direction": "Horizontal"}}
}

线样式(用于边框)

"lineStyles": {"border": {"style": "Solid","rgb": "0,0,0","width": 1.0}
}

2. 对象配置(Elements)

文本对象

{"type": "Text","name": "unit","text": "某某市自然资源局","styleKey": "default","position": "Left_Bottom","anchor": "Bottom_Left","spacing": { "horizontal": 0.5, "vertical": 0.0 },"inBorder": false,"index": 0
}

position 决定停靠边,index 控制同侧元素的排列顺序。

表格对象(含合并单元格模拟)

{"type": "Table","name": "infoTable","rows": 2,"columns": 6,"cellHeight": 8.0,"cells": [{ "row": 0, "col": 0, "text": "权利人", "colSpan": 1, "rowSpan": 1 },{ "row": 0, "col": 1, "text": "张三", "colSpan": 5, "rowSpan": 1 }],"textStyleKey": "table","lineStyleKey": "grid","position": "Top","inBorder": true,"index": 0
}

注:目前通过多个 TextElement + RectangleElement 模拟表格与合并效果。

双边框配置

[{"type": "Border","name": "inner","margin": { "left": 5, "top": 25, "right": 5, "bottom": 5 },"lineStyleKey": "border","index": 0},{"type": "Border","name": "outer","margin": { "left": 3, "top": 3, "right": 3, "bottom": 3 },"lineStyleKey": "border","index": 1}
]

四、关键技术实现(C# 示例)

1. 主流程:从配置生成布局

public class LayoutBuilder 
{private Layout _layout;public async Task BuildFromConfig(string configPath){var config = ConfigManager.Load(configPath);foreach (var elementConfig in config.Elements.OrderBy(e => e.Index)){await ElementFactory.Create(elementConfig, _layout);}}
}

2. 文本元素创建

public class TextElement : IMapElement
{public async Task Create(JObject config, Layout layout){var textElem = await QueuedTask.Run(() => layout.CreateElement<TextElement>(new GeometricEnvelope()));var style = ConfigManager.GetTextStyle(config["styleKey"].ToString());textElem.Text = config["text"].ToString();textElem.TextSymbol = new CIMTextSymbol { Symbol = style.ToCimSymbol() };// 根据 position 和 index 计算锚点位置var position = ParsePosition(config["position"].ToString());var anchor = CalculateAnchor(position, config["index"].Value<int>());await SetElementPosition(textElem, anchor, config["spacing"].ToObject<Spacing>());}
}

3. 边框创建

public class BorderElement : IMapElement
{public async Task Create(JObject config, Layout layout){var margin = config["margin"].ToObject<Thickness>();var pageWidth = layout.Page.PageWidth;var pageHeight = layout.Page.PageHeight;var rect = new GeometricEnvelope(margin.Left, margin.Bottom,pageWidth - margin.Right, pageHeight - margin.Top);var borderElem = await QueuedTask.Run(() => layout.CreateElement<RectangleElement>(rect));var lineStyle = ConfigManager.GetLineStyle(config["lineStyleKey"].ToString());borderElem.Symbol = new CIMRectangleSymbol {Symbol = new CIMPolygonSymbol { Outline = lineStyle.ToCimLineSymbol() }};}
}

五、当前能力与局限

✅ 已实现功能

  • 支持多种文本布局(水平/垂直、多位置停靠)
  • 支持表格生成(含单元格合并模拟)
  • 支持单/双边框、比例尺、指北针
  • 通过JSON配置灵活调整样式
  • 基本满足当前项目出图需求

⚠️ 当前局限

  • 暂未实现动态图例:图例为静态配置,后续将根据视图范围动态过滤
  • 暂不支持地图配图模板:如标题、副标题、数据来源等未抽象为模板
  • 表格为模拟实现,非原生表格对象
  • 配置文件需手动编写,暂无可视化编辑器

六、未来展望

尽管系统尚处于初期阶段,但已展现出良好的扩展潜力。下一步计划:

  1. 实现动态图例:根据当前地图范围自动显示可见图层的图例
  2. 支持地图配图模板:抽象为“标题区”、“信息区”、“图例区”等模块
  3. 开发配置编辑器:提供可视化界面降低配置门槛
  4. 增强错误处理与日志:提升系统健壮性
  5. 集成到Pro插件菜单:支持一键出图

结语

本文介绍的自动化制图系统虽处于初步实现阶段,但已能有效提升出图效率,减少重复劳动。通过将制图逻辑与配置分离,我们为后续的扩展和优化打下了坚实基础。

技术的价值在于持续迭代。我们相信,随着功能的不断完善,该系统将在更多GIS项目中发挥价值。


http://www.wxhsa.cn/company.asp?id=2906

相关文章:

  • Kali Linux 虚拟机安装(VMware Workstation 17)
  • 单例模式:线程安全,以及volatile关键字
  • lilctf 部分wp - Elma
  • 用 Python 和 Tesseract 实现验证码识别
  • Java 和 Tesseract 实现验证码识别
  • 基于 Weiler–Atherton 算法的 IoU 求解
  • Selenium应用中的核心JavaScript操作技巧
  • 25.9.13 字符编码标准
  • 哭了,散了,明白了
  • 用 Java 和 Tesseract 实现验证码识别
  • Microsoft-Activation-Scripts,好用,记录一下。
  • 双重map 的赋值初始化
  • 0voice-1.4.1
  • 9.13 模拟赛 T3
  • Docker应用 - FileBrowser
  • AI踩坑之Nlog使用
  • 论文解读-《OpenGSL A Comprehensive Benchmark for Graph Structure Learning》 - zhang
  • Cmake介绍
  • Git 生成 ssh key
  • 基础篇:消息队列理论部分,另一种环境搭建Docker运行RabbitMQ
  • 项目案例作业1:学生信息管理系统(面向对象初步接触)
  • P1097 合唱队形
  • 一生一芯学习:pa2.1 RTFM
  • Linux网络:初识网络 - 详解
  • 20250909比赛总结
  • 又寸入生白勺司烤
  • Ubuntu 安装 GIPM
  • 手动下载vscode扩展的方法
  • GAS_Aura-Aura Projectile
  • CF1583F Defender of Childhood Dreams