2013-08-26 2 views
1

방금 ​​ArcPIS를 사용하여 ArcGIS로 지리 데이터를 분석하기 시작했습니다. 분석은 서로 다른 단계를 거치며 순차적으로 실행됩니다. 이 코드는 지금까지 놀라 울 정도로 잘 작동여러 분석 단계로 파이썬 GIS 프로젝트를 구성하는 방법은 무엇입니까?

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을 시도했지만 위와 같은 오류가 발생했습니다.

필자는 파이썬 관련 새 표현식의 오용으로 알 수 있듯이 파이썬 초보자입니다. 그런 GIS 프로젝트를 구성하는 방법에 대한 조언은 매우 감사 할 것입니다.

답변

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 

이제 코드의 다른 단계를 선택적으로 호출 할 수 있으며 whle 청크 대신 한 줄만 주석 처리/제외해야합니다. 바라기를 나는 당신의 질문을 정확하게 이해했다.

+0

정확히 내가하고 싶었던 것이고, 그것은 아주 잘 작동합니다. 감사! –