2013-08-26 3 views
1

Я только начал использовать ArcPy для анализа геоданных с помощью ArcGIS. Анализ имеет разные этапы, которые должны выполняться один за другим.Как организовать GIS-проект Python с несколькими этапами анализа?

Вот некоторые псевдо-код:

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.

Я также пробовал this, но я получил ту же ошибку, что и выше.

Я полный новичок Python (как вы могли понять из-за неправильного использования любых выражений, связанных с Python), и я был бы очень благодарен за любые советы о том, как организовать такой проект ГИС.

ответ

1

Я думаю, что вы хотите сделать каждый шаг в функции. Эти функции могут быть сохранены в том же файле сценария или в их собственном модуле, который загружается с помощью оператора import (точно так же, как дуговая). Псевдо-код будет выглядеть примерно так:

#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 

Теперь вы можете выборочно называть различные этапы вашего кода, и это требует только комментирование/исключая одну строку вместо whle куска кода. Надеюсь, я правильно понял ваш вопрос.

+0

Это было именно то, что я хотел сделать, и он работает очень хорошо. Благодаря! –