1

我刚开始使用 ArcPy 通过 ArcGIS 分析地理数据。分析有不同的步骤,要一个接一个地执行。

这是一些伪代码:

import arcpy

# create a masking variable
mask1 = "mask.shp"    

# create a list of raster files
files_to_process = ["raster1.tif", "raster2.tif", "raster3.tif"]

# step 1 (e.g. clipping of each raster to study extent)
for index, item in enumerate(files_to_process):
        raster_i = "temp/ras_tem_" + str(index) + ".tif"
        arcpy.Clip_management(item, '#', raster_i, mask1)

# step 2 (e.g. change projection of raster files)
...

# step 3 (e.g. calculate some statistics for each raster)
...

etc.

到目前为止,这段代码运行得非常好。但是,光栅文件很大,一些步骤需要很长时间才能执行(5-60 分钟)。因此,我只想在输入栅格数据发生变化时执行这些步骤。从 GIS 工作流程的角度来看,这应该不是问题,因为每一步都会在硬盘上保存一个物理结果,然后将其用作下一步的输入。

我想如果我想暂时禁用例如步骤 1,我可以简单地#在这一步的每一行前面放一个。但是,在实际分析中,每个步骤可能有很多行代码,因此我更愿意将每个步骤的代码外包到一个单独的文件中(例如“step1.py”、“step2.py”、.. .),然后执行每个文件。

我尝试过execfile(step1.py),但收到错误NameError: global name 'files_to_process' is not defined。似乎主脚本中定义的变量不会自动传递给execfile.

我也试过这个,但我收到了与上面相同的错误。

我是一个完全的 Python 新手(正如您可能通过滥用任何与 Python 相关的表达式而发现的那样),我将非常感谢有关如何组织这样一个 GIS 项目的任何建议。

4

1 回答 1

1

我认为你想要做的是将每一步构建成一个函数。这些函数可以存储在同一个脚本文件中,也可以存储在使用 import 语句加载的它们自己的模块中(就像 arcpy 一样)。伪代码将是这样的:

#file 1: steps.py
def step1(input_files):
  # step 1 code goes here
  print 'step 1 complete'
  return

def step2(input_files):
  # step 2 code goes here
    print 'step 2 complete'
    return output # optionally return a derivative here

#...and so on

然后在同一目录中的第二个文件中,您可以导入和调用将栅格作为输入的函数。

#file 2: analyze.py
import steps
files_to_process = ["raster1.tif", "raster2.tif", "raster3.tif"]

steps.step1(files_to_process)

#steps.step2(files_to_process) # uncomment this when you're ready for step 2

现在您可以有选择地调用代码的不同步骤,并且只需要注释/排除一行而不是一大块代码。希望我正确理解了您的问题。

于 2013-08-27T00:44:50.007 回答