SVG是一种专为二维图形设计的矢量图像格式,具有分辨率无关的可缩放能力、易于编辑修改,以及通常比栅格图像更小的文件体积等显著优势。在 ArcGIS Pro 中,SVG 文件可被导入并集成到样式文件(.stylx)中,用于创建高度定制化的地图符号。本文将介绍如何通过 Python 脚本在Pro 中批量导入 SVG 文件至style样式文件。借助 Python 自动化处理,不仅能够高效完成大量符号的导入,还能统一应用元数据,自动生成符合制图信息模型(CIM)规范的可重用样式项,大幅提升工作效率,避免逐一手动添加符号的繁琐操作。具体步骤:
1、创建用于存放工程和 .svg文件的文件夹:
2、打开ArcGIS Pro工程,新建空的style样式文件如teststyle.stylx,并将该样式保存在主项目文件夹里:
3、打开 Python 窗口,导入必要的模块:
import osimport sqlite3import requests
4、ArcGIS Server或GeoScene Server 提供了SymbolServer 实用工具,用于以构建和生成符号图像。SymbolServer 提供了两个核心操作:
generateImage—用于从 2D 或字典式 Web 样式中生成(提取)符号图像;
generateSymbol—用于将可缩放矢量图形(SVG)图像转换为制图信息模型(CIM)符号。
这里我们用到了generateSymbol这个操作。
接下来准备.svg所在文件夹路径、SymbolServer REST URL 和样式文件路径:
# 包含SVG文件的文件夹路径folder_path=r"E:\testsvg\symbols"# generateSymbol,这里我们可以使用arcgis SymbolServer在线的服务url地址url="https://utility.arcgisonline.com/arcgis/rest/services/Utilities/Symbols/SymbolServer/generateSymbol"# 指定.stylx 文件作为一个SQLite databasestylx_path=r"E:\testsvg\teststyle.stylx"
5、建立与样式文件的数据库连接:
conn=sqlite3.connect(stylx_path, timeout=60) cursor=conn.cursor()print("已连接")
6、将SVG文件上传到REST端点,并转换为CIM符号格式。把转换后的符号保存到样式文件中。
for filename in os.listdir(folder_path): if filename.lower().endswith(".svg"): svg_path = os.path.join(folder_path, filename) print(f"Found SVG: {svg_path}") with open(svg_path, "rb") as f: files = { "svgImage": (filename, f, "image/svg+xml"), } data = { "f": "json" } resp = requests.post(url, files=files, data=data) print("status:", resp.status_code) print("body:", resp.content) new_row = ( 3, # CLASS (symbol class - 3 = Point Symbol) "", # CATEGORY filename, # NAME "Custom Symbol", # TAGS resp.content, # CONTENT (CIM symbol JSON) filename, # KEY ) cursor.execute( "INSERT INTO ITEMS(CLASS, CATEGORY, NAME, TAGS, CONTENT, KEY) VALUES(?,?,?,?,?,?)", new_row, ) print(f"Inserted symbol: {filename}") conn.commit() conn.close() print("所有符号均已添加到 .stylx 文件中")
可以直接在pro的python窗口运行代码:
执行结果:
下图展示了在“符号系统”窗格中以符号形式显示的 SVG 文件: