我试图理解使用ModelBuilder创建地理处理的过程,但是我不知道为什么在使用ModelBuilder创建地理处理时使用要素图层而不是要素类很重要。有人可以解释为什么吗?
我试图理解使用ModelBuilder创建地理处理的过程,但是我不知道为什么在使用ModelBuilder创建地理处理时使用要素图层而不是要素类很重要。有人可以解释为什么吗?
Answers:
为什么要在ModelBuilder中引用要素图层(而不是要素类)有两个原因。首先,了解差异是有帮助的。
因此,鉴于此背景,以下是一些您为什么要使用“制作要素图层”工具作为原始数据和其他地理处理工具之间的中介的一些原因。
如果您想从ArcCatalog运行模型,或者将模型导出到可以在ArcGIS外部运行的Python脚本,则需要使用“功能层”才能将原始源数据转换为“层”。这将类似于“向ArcMap会话中添加数据”。
使用图层使您可以轻松地在ModelBuilder流程中对数据进行子集化。假设您要用一种方法处理属性为“ A”的所有数据,而要用另一种方法处理属性为“ B”的所有数据。您可以一次引用原始数据,然后使用要素图层将数据分为两个“分支”,并分别处理每个集合,但会影响/更新单个源数据集。
将临时层合并到模型中还可以减少处理时间。从处理的角度来看,与写入磁盘相比,写入内存要高效得多。同样,您可以将临时数据写入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
工作区的数据仍然是数据(例如要素类和表),仍然占据(可能很多)空间。另一方面,要素层是数据的视图,使您可以选择数据的子集并在后续过程中使用它,而不仅仅是复制数据以获取数据的子集。特征图层几乎不占用任何空间。我喜欢将它们视为“带有元数据的指针”,例如,它们指向一些数据并描述如何查询/呈现数据。
in-memory
工作区基本上是一个位于内存中的文件地理数据库,如果您想这样想的话。