为什么在ModelBuilder中使用要素图层很重要?


Answers:



9

为什么要在ModelBuilder中引用要素图层(而不是要素类)有两个原因。首先,了解差异是有帮助的。

  • “功能类”是对整个原始数据的简单引用。一个简单的示例,其中FC是磁盘上的shapefile。
  • “要素层”是对数据抽象的引用,您可以在其中与原始数据集(而不是整个数据集)中的一个或多个要素进行交互。将数据加载到ArcMap后,图层就是您与之有效地交互的对象。

因此,鉴于此背景,以下是一些您为什么要使用“制作要素图层”工具作为原始数据和其他地理处理工具之间的中介的一些原因。

  1. ModelBuilder中的许多GP工具都需要使用图层,并且不会接受FC作为输入。如果您的GP工具需要选择数据,则尤其如此。在这种情况下,您需要与LAYER进行交互,而不是与原始数据进行交互。示例:如果您没有打开ArcMap(或其他GIS程序),则如何从原始shapefile中选择要素...您将无法。您需要与ArcMap中的图层进行交互才能进行选择。
  2. 如果您想从ArcCatalog运行模型,或者将模型导出到可以在ArcGIS外部运行的Python脚本,则需要使用“功能层”才能将原始源数据转换为“层”。这将类似于“向ArcMap会话中添加数据”。

  3. 使用图层使您可以轻松地在ModelBuilder流程中对数据进行子集化。假设您要用一种方法处理属性为“ A”的所有数据,而要用另一种方法处理属性为“ B”的所有数据。您可以一次引用原始数据,然后使用要素图层将数据分为两个“分支”,并分别处理每个集合,但会影响/更新单个源数据集。

  4. 您可以创建“ in_memory”要素图层,这些要素图层是真正的临时数据处理“容器”,并且与每次操作之后写入磁盘相比,可以更快地处理数据。它还限制了处理完成后必须清理的垃圾量。

非常感谢Ryan。您的答案非常完整清晰。
Diego Pardo

7

将临时层合并到模型中还可以减少处理时间。从处理的角度来看,与写入磁盘相比,写入内存要高效得多。同样,您可以将临时数据写入in_memory工作空间,这也将提高计算效率。

ArcGIS中的许多操作都需要临时图层作为输入。例如,“ 按位置选择图层(数据管理)”是一个非常强大且便捷的工具,可让您选择与其他选择要素共享空间关系的图层要素。您可以指定复杂的关系,例如“ HAVE_THEIR_CENTER_IN”或“ BOUNDARY_TOUCHES”等。

编辑:

出于好奇,为了详细说明使用要素图层和in_memory工作空间的处理差异,请考虑以下速度测试,其中39,000个点被缓冲100m:

import arcpy, time
from arcpy import env

# Set overwrite
arcpy.env.overwriteOutput = 1

# Parameters
input_features = r'C:\temp\39000points.shp'
output_features = r'C:\temp\temp.shp'

###########################
# Method 1 Buffer a feature class and write to disk
StartTime = time.clock()
arcpy.Buffer_analysis(input_features,output_features, "100 Feet")
EndTime = time.clock()
print "Method 1 finished in %s seconds" % (EndTime - StartTime)
time.sleep(5)

############################
# Method 2 Buffer a feature class and write in_memory
StartTime = time.clock()
arcpy.Buffer_analysis(input_features, "in_memory/temp", "100 Feet")
EndTime = time.clock()
print "Method 2 finished in %s seconds" % (EndTime - StartTime)
time.sleep(5)

############################
# Method 3 Make a feature layer, buffer then write to in_memory
StartTime = time.clock()
arcpy.MakeFeatureLayer_management(input_features, "out_layer")
arcpy.Buffer_analysis("out_layer", "in_memory/temp", "100 Feet")
EndTime = time.clock()
print "Method 3 finished in %s seconds" % (EndTime - StartTime)
time.sleep(5)

在此处输入图片说明


我们可以看到方法2和3等效,并且比方法1快3倍。这显示了在较大的工作流中将要素层用作中间步骤的强大功能。


这似乎在混淆两件事(内存数据层和要素层)。他们不一样。写入in_memory工作区的数据仍然是数据(例如要素类和表),仍然占据(可能很多)空间。另一方面,要素层是数据的视图,使您可以选择数据的子集并在后续过程中使用它,而不仅仅是复制数据以获取数据的子集。特征图层几乎不占用任何空间。我喜欢将它们视为“带有元数据的指针”,例如,它们指向一些数据并描述如何查询/呈现数据。
blah238 2013年

只是为了补充我以前的评论,我在该站点的某个地方读到,in-memory工作区基本上是一个位于内存中的文件地理数据库,如果您想这样想的话。
blah238 2013年

就像文件地理数据库一样,但是in_memory时不计算形状区域-稍后将提供链接。
PolyGeo

在更新的第二个示例中,您将在内存中创建要素类,而不是要素图层。
blah238 2013年

2
已经有一段时间了,但是这是我六个月前承诺的链接
PolyGeo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.