如何在ArcGIS Pro中使用ArcPy检查一个层是否已经存在于地图上?

3254
7
04-24-2019 04:31 am
NickKnowles
通过
新贡献者II

我有一个进程,从lyrx文件添加一个层到地图上的组层。我需要在我的脚本中添加一些东西来检查它是否已经存在,这样它就不会再添加它了,但我很难在网上找到关于ArcGIS Pro的任何东西。以下是我目前拥有的(对不起,我是新手):

LyrDir“C: \ \ mydir \ \”off_pk“离线组层\\”近似arcpy国会议员ArcGISProject“当前”aprxMap近似listMaps“地图”0offGrpaprxMaplistLayers“离线群组层”0my_lyrarcpy国会议员LayerFileLyrDir+“myfile.lyrx”aprxMapaddLayerToGroupoffGrpmy_lyr2offlyraprxMaplistLayersoff_pk+“我层”offlyr可见

我希望它能像输入以下内容一样简单:

如果存在mylayer= =aprxMapaddLayerToGroupoffGrpmy_lyr2offlyraprxMaplistLayersoff_pk+“我层”offlyr可见

如果有人能帮忙,先谢谢你。

7回复
DanPatterson_Retired
尊敬的贡献者

| ArcGIS桌面

我认为会这样做,但你需要提供路径

NickKnowles
通过
新贡献者II

谢谢你的帮助,丹。这让我明白了一部分。如果我检查一个层存在于组层之外,它返回“True”,但当我试图找到我的层“我的组\我的层”时,它总是返回“False”,即使它存在。我假设如果某些东西是嵌套的,它需要一个稍微不同的过程。什么好主意吗?

谢谢。

0荣誉
DanPatterson_Retired
尊敬的贡献者

听起来你必须检查这个层是否是一个组层,或者检查每个层的“longName”属性来获得它的完整路径

longName
(只读)

一个层的完整路径,包括组层文件夹结构。

Layer-ArcPy | ArcGIS Desktop

NickKnowles
通过
新贡献者II

谢谢,这很有帮助。不幸的是,我很难实现它。我找不到指定一个特定的组。我增加了以下内容:

aprxMaplistLayers“我层”如果longName打印longName

我把打印在第三行,看看我得到了什么反应,这是预期的。问题是我有两个组层,其中有一个层。我想指定脱机层,因为我实际上是将数据从在线组层复制到脱机组层。

谢谢。

0荣誉
DanPatterson_Retired
尊敬的贡献者

听起来很复杂,所以您似乎也想要解析路径以找到源组层,这样您就可以复制(或其他)到目标组层。因此,层名将保持不变,但长名称将有所不同

0荣誉
NickKnowles
通过
新贡献者II

抱歉,我可能没解释清楚。

我有一个来自ArcGIS online的在线版本的功能层,位于组层“在线组层”中。然后我有了这个层的离线版本(一个文件gdb),它位于本地,作为组层“离线组层”中的一个层存在。

该过程之前将在线层的数据复制到文件gdb中,并且没有发生任何太复杂的事情,然而,从ArcGIS Pro 2.2版本开始,由于一个现在Esri已经知道的错误,基于gdb的层在被覆盖时从地图中删除。

我必须做的是在gdb更新后使用lyrx文件将它添加回来。在某些情况下,该层的离线版本有可能没有从地图中删除,为了确保它不会再次添加,我想做一个检查,告诉它只添加到lyrx文件中的“离线组层”,如果它已经不在离线组层中。

所有的名称都是静态的,所以地图内容大致如下所示:

v地图

v离线组层

>我的层

v在线组层

>我的层

因此,“离线组层”中的“我的层”来自gdb文件/从lyrx文件插入,“在线组层”中的“我的层”来自ArcGIS Online

谢谢

0荣誉
LeandraGordon
通过
临时贡献者II

我认为丹斯回答检查在地理数据库中的特征类。要在地图中检查层,使用for循环遍历层。

currentProject = arcpy.mp.ArcGISProject("CURRENT")
我认为这假设只有一个映射
layers = currenmap . listlayers ()

For layer in layers:

if layer.name == "Property_LYR":
#对图层做一些事情
arcpy.management。ApplySymbologyFromLayer (PROPERTY_LYR PROPERTY_LYRX)
其他:
#做其他事情