分享

琢磨不透的 ArcPy,之日怪的replaceDataSource方法

 GIS荟 2023-03-21 发布于四川

前言:探索 ArcGIS 之 Python API 的奇思妙想,带你走进它琢磨不透的小小心思……

参考:

Arcpy's replaceDataSource Error.https://gis./questions/41635/arcpys-replacedatasource-error

replaceDataSource,是 ArcPy 中的一个方法,这个小小的方法,却隐藏着大大的巧思在背后,使用起来贴心又温暖,带你回味一下,避免踩坑。

至于什么是 ArcPy,或者想要学习 ArcPy,可以看看这几篇系列教程,最早 ArcGIS 10 正式引入 ArcPy,这是一个 Python 站点包,其中包含了ArcGIS Desktop 软件的大部分功能的调用接口。比如 ArcGIS 空间分析中的擦除操作,在 ArcPy 中就有正好对应的方法。

replaceDataSource 是什么

先解释一下什么是 replaceDataSource,它的功能是什么?

replaceDataSource是 Layer 类中的一个方法,Layer 类用于对图层的属性和方法进行访问,它可以引用地图文档 (.mxd) 或图层 (.lyr) 文件中的图层,提供了对图层的数据源、样式、名称、可见性、四至、参考空间的访问或修改。

replaceDataSource允许你更改工作空间类型、或更改数据集名称。

所以这个方法是一个非常常见的方法,如果你接触过 ArcPy,那么你很可能避不开这个方法。

正是这样一个小小的方法,却似乎有一些隐藏的秘密,给我折腾的够呛,下面让我们走进科学……

replaceDataSource 的小秘密

参数讲解

replaceDataSource(workspace_path="",
                  workspace_type="",
                  dataset_name="",
                  validate=True)

该方法有三个主要参数,最后一个默认就行。

从左到右依次来看,之前我们讲过,这个方法用于替换图层的源数据

  • 所以第一个参数需要填上用于替换旧数据的新数据的存放数据库路径或者文件夹路径,

    有点绕啊,比如你要把这个图层的源数据更改为C:/test.gdb/DLTB,那么第一个参数可以填 C:/test.gdb

  • 第二个填新数据的储存方式,比如以GDB存储,或者就以shp格式来存储,具体的关键字请查阅官方文档,

    那么这里需要填入 "FILEGDB_WORKSPACE";

  • 第三个就是数据的名称,

    那么填入 DLTB;

举例

replaceDataSource(workspace_path="C:/test.gdb",
                  workspace_type="FILEGDB_WORKSPACE",
                  dataset_name="DLTB",
                  validate=True)

第一个小秘密

基本来说就是这个道理。但这里举例使用的是以GDB数据库作为存储的数据。

那如果我们是以shp文件形式存储的数据呢?

有的人就会在最后填上文件后缀,像这样 DLTB.shp,看上去没有问题,但一运行就会报错哦,直接报 ValueError 的错误!

正确的做法是依然不加后缀,就是文件最简简单单的名称就好。

第二个小秘密

如果我们需要把数据源替换为存储在要素数据集里的数据呢?

先说什么是要素数据集,这是存在于地理数据库 GDB 中的一个数据结构,简单理解就是 GDB 里面的一个文件夹或者分类。

如果存在 Dataset 要素数据该怎么办呢?

replaceDataSource(workspace_path="C:/test.gdb",
                  workspace_type="FILEGDB_WORKSPACE",
                  dataset_name="DLTB",
                  validate=True)

我们使用上面的示例来改,要怎么改呢,是第一个参数这样改?

workspace_path="C:/test.gdb/Dataset"

还是改第三个参数?

dataset_name="Dataset/DLTB"

以上两种改法都涉及到了要素数据集,按理说是这个道理,但这次就要不走寻常路了,看好咯我这里不认要素数据集啦!我上次无语还是在上一次。

原封不动拿过来用就行啦!!路径直接 GDB 完事儿,根本不需要管里面存不存在要素数据集。

#正确改法,就不不改!
replaceDataSource(workspace_path="C:/test.gdb",
                  workspace_type="FILEGDB_WORKSPACE",
                  dataset_name="DLTB",
                  validate=True)

那么你是故意的还是不小心的?

Esri:我是故意的!

其实这种问题我还记得还有几个方法有,一下记不到了,以前再说吧,反正吃多了,总能吃出点味来。

好的再见。

荟GIS精粹,关注公众号:GIS荟
求每日赞赞

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多