分享

ArcGIS 在玩一种很新的东西,CIM Access,控制一切?

 GIS荟 2023-08-04 发布于四川

前言:ArcPy翻身做主人,终于能完全掌控 ArcGIS 啦!

以下内容说的 ArcPy 是 ArcGIS Pro 中的,而不是 ArcMap,ArcMap 的 ArcPy 有一个系列教程《ArcPy指南》,感兴趣可以看看。

1.ArcPy 的定位与突破

如果你使用过 ArcPy,那么就知道 ArcPy 的定位就是辅助为主,很多较为细致的东西是无法控制的,你需要结合软件来实现,比如创建工程文件或模板或样式,在有了现成的东西以后,才可以结合 ArcPy 去自动化的批量套用或者工作流程的自动化,从而实现数据的计算、符号系统、布局等等的控制。

简而言之 ArcPy 模块是一个粗粒度 Python API,旨在提供对许多常见地图自动化任务的访问权限。它包含一组不同的公开类、类属性和帮助程序函数,但不提供对 ArcGIS Pro 中的所有属性、设置和功能的访问权限。

但今天,一个全新模块,或者说一种全新的访问机制或许会打破这一定义,实现更加细致、更广泛的控制和自定义,那就是 CIM(Cartographic Information Model)。

2.什么是 CIM

这个 CIM 不是城市信息模型的那个 CIM,而是指 Esri 制图信息模型。

它是一个地图内容规范,用于记录在保存、读取、引用或打开时如何永久保留描述不同项目组件的信息。该规范以 JSON 表示,适用于 ArcGIS 应用程序和 API 中的地图、场景、布局、图层、符号和样式。

虽然叫制图信息模型,但通过 CIM 可操纵的功能远不止于此。

3.怎样用 CIM

3.1CIM的本质

制图信息模型(CIM)说白了就是一种 json 规范的文本,是明文存储的。

ArcGIS Pro 可以导出这三种后缀为 .mapx.lyrx.pagx 的文件,他们都是一种 json 文本。

后缀用途(来源)
.mapx地图文档打包文件
.lyrx图层文件
.pagx布局样式文件

你可以通过修改文件后缀,再以文本方式打开,就可以查看其内部的数据结构,也就是 CIM 的定义。

在 CIM 的定义中你可以几乎修改所有的信息,非常的强大。

3.2使用ArcPy控制 CIM 模型

你可以手动修改保存出来的三种文件( .mapx 、 .lyrx、 .pagx ),但是对于在 ArcGIS Pro 工程里面的地图文件、图层、布局就无可奈何了,你需要使用 ArcPy 来访问 CIM 模型。

控制 CIM 的主要两个方法是 getDefinition() :返回对象的 CIM 定义,然后使用 setDefinition() 方法将更改推送回同一对象。

如果您正在为 ArcGIS Pro 2.x 创作脚本,将 cim_version 指定为 'V2',如getDefinition('V2');

如果您正在为 ArcGIS Pro 3.x 创作脚本,将 cim_version 指定为 'V3',如getDefinition('V3');

使用 cim_version 'V2' 创作的脚本可继续在 ArcGIS Pro 3.x 中使用。

getDefinition()

这里就来看看如何使用该方法获得 CIM 定义:

import arcpy

aprx_path = r"..\ArcGIS Pro中设计地球仪.aprx"
p = arcpy.mp.ArcGISProject(aprx_path)
m = p.listMaps('地图')[0]
l = m.listLayers('国家矢量')[0]

l_cim = l.getDefinition('V3')
print(l_cim)

该 ArcGIS Pro 工程文件的地址为..\ArcGIS Pro中设计地球仪.aprx

工程文件中存在一个地图对象名为“地图”,在该地图对象中有一个图层对象,名为“国家矢量”。

那上面的代码就是层层递进,最后获取“国家矢量”图层对象的 CIM 定义。

setDefinition()

修改图层的符号系统。修改轮廓颜色,切记最后需要使用 save() 方法保存整个 ArcGIS Pro 工程文件。

import arcpy

aprx_path = r"..\ArcGIS Pro中设计地球仪.aprx"
p = arcpy.mp.ArcGISProject(aprx_path)
m = p.listMaps('地图')[0]
l = m.listLayers('国家矢量')[0]

l_cim = l.getDefinition('V3')

sym = l_cim.renderer.symbol.symbol.symbolLayers[0]
sym.color.values = [250, 250, 40, 50]
l.setDefinition(l_cim)

p.save()
运行前运行后

4.更多资料

4.1作用空间详细说明

esri 官方在 github 上的 CIM 说明,不是单纯是概念说明哦,而是 CIM 对象中的所有属性、字段、级别等详细说明。

  • https://github.com/Esri/cim-spec

4.2示例教程

ArcGIS Pro 2.5 CIM Samples V1

  • https://www./home/item.html?id=8772f61319584882bb697ba003030636

4.3官方CIM简单帮助

Python CIM 访问

  • https://pro./zh-cn/pro-app/latest/arcpy/mapping/python-cim-access.htm

5.问题

最大的问题在 Python 中获取了 CIM 对象,但是却不能直接查看 json 的数据结构,就算导入了 json 库,依然解析不出来。

除非像开始一样,导出文件后,修改后缀为 json 才能看到,但这没实际意义。

通过官方的资料、自己导出的 json 按图索骥?然后配合 hasattr 做判断进行后续的解析并修改?

  • https://community./t5/python-questions/get-cim-layer-object-type/td-p/453485

这是目前的一个问题,还没想到如何解决,或许本来就是这样的呢。

6.心得

CIM 模型对于空间地理计算方面目前没看到太大的用处,但有什么关系呢?ArcPy 可以调用每一种地理工具,还有 numpy 助阵。

CIM 模型对于配图和高级样式的一键制作却非常有用,特别是GIS荟一直在更新的制图样式工具箱,目前正在向 ArcGIS Pro 持续推进,CIM 模型从根本上提升了 ArcPy 在这方面的能力,前景不错。

希望我的文章能对你有启发,图文分享难做,求星标

–END–

投稿、找我、加群,微信号 hygnic


图文分享难做,感谢点个再看 、星标

更多GIS荟精选文章:


GIS荟制图工具箱(点击图案获取)

高级又好看的制图效果,一键完成!

全球地形渲染教程合集

微信群

QQ群

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多