0101-ArcPy:使用内存作为工作空间,提升地理处理工具性能


在上一篇文章【0101-ArcPy:将脚本工具的处理结果作为参数输出】中,我们在执行要素裁剪工具的时候,会生成一个要素类,按说这个要素类不是最终想要的结果,最终想要的是这个要素类缓冲10公里之后的要素。类似这样的中间结果,默认的情况下一般是保存在临时工作空间中。临时工作空间的位置可以通过以下代码指定:

# Set the scratchWorkspace environment to local file geodatabase
arcpy.env.scratchWorkspace = "c:/data/scratchoutput.gdb"

但是,这里有个不好的一点的,需要把数据写入到文件中,如果执行的脚步中有很多的中间数据,那么工具的执行效率是会慢很多。所以Esri提供了将临时数据放到内存中的解决方案。具体可以参考以下代码:

# -*- coding:utf-8 -*-
import arcpy
# 设置输入要素
inputFeatures = arcpy.GetParameterAsText(0)
# 设置裁剪要素
clipFeatures = arcpy.GetParameterAsText(1)
# 设置输出要素
outFeatures = arcpy.GetParameterAsText(2)
# 在内存中创建一个临时要素类,使用in_memory来表示空间空间为内存
tempData = arcpy.CreateScratchName("tempClipOutFC",data_type="FeatureClass",workspace="in_memory")
# 设置输出结果是否覆盖
arcpy.env.overwriteOutput = True

try:
      clipOutFeatureClass = arcpy.Clip_analysis(inputFeatures, clipFeatures, tempData, 1.5)
      arcpy.Buffer_analysis(clipOutFeatureClass, outFeatures, "10 Kilometers", "FULL", "ROUND", "NONE")
except Exception as err:
    arcpy.AddError(err)
    print err

在上面的代码中,我们使用了:

tempData = arcpy.CreateScratchName("tempClipOutFC",data_type="FeatureClass",workspace="in_memory")

CreateScratchName方法的目的是为指定的数据类型创建唯一的临时路径名称,要使用内存作为工作空间,需要指定workspace为in_memory。将数据写入内存工作空间要明显快于写入其他格式(如 shapefile 或地理数据库要素类)。但写入内存工作空间的数据是临时性的,将在关闭应用程序时被删除。
同时,需要注意的是我们还对生成的结果设置了覆盖操作:

# 设置输出结果是否覆盖
arcpy.env.overwriteOutput = True

测试的时候一般是这样操作,生产环境需要根据业务需要配置。
要使用内存作为工作空间,需要留意以下几点:
1. 写入内存工作空间的数据是临时性的,将在关闭应用程序时被删除。
2. 表、要素类和栅格可写入内存工作空间。
3. 内存工作空间不支持扩展的地理数据库元素,如子类型、属性域、制图表达、拓扑、几何网络以及网络数据集。
4. 不能在内存工作空间中创建要素数据集或文件夹。

转载自:https://blog.csdn.net/peckerzeng/article/details/79317149

You may also like...