vascobnunes, 여기에 파이썬 스크립트를 사용하여 여러 ogr2ogr 명령어를 데이지 체인 방식으로 연결 하여이 문제를 해결 한 방법이 있습니다. 배치 스크립트로 쉽게 변환 할 수 있습니다. 기본적으로 ogr2ogr 명령 ( cmd
)을 함께 연결 한 다음을 호출 os.system(cmd)
하여 함께 연결 한 ogr2ogr 명령을 전달 하여 실행 하십시오.
비밀 무기는 ( capooti가 시연 한 것처럼 ) OGR_SQL 을 적용 하여 파일 이름을 병합 결과에 추가하는 소스 데이터 세트의 상수 값으로 적용하는 것입니다.
내 예제에서 -sql
플래그는 다음과 같이 코드에서 처리합니다.
-sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'
그러나 결과 연결에 작은 따옴표와 큰 따옴표를 적용해야하기 때문에 읽기가 혼란 스럽습니다. 그렇게하려면 작은 따옴표 (예 : \ ')를 이스케이프하여 "실제로"사용해야합니다. 따라서 가독성을 위해 변수없이 이스케이프 시퀀스를 보는 것이 좋습니다. 특정 반복에 대해 파일 이름이 "roads1"인 경우 결과 연결은 ogr2ogr 문장에서 다음과 같습니다.
-sql "SELECT 'roads1.shp' AS filename, * FROM roads1"
이 .py 스크립트는 matt wilkie (빈, shapefile의 복제본), j03lar50n (ogrinfo 및 ogr_sql을 사용하여 shapefile에 열 추가) 및 capooti (ogr_sql을 사용하여 고정 열 값 적용) 에서 훔친 세 가지 트릭의 융합입니다. shapefile의 모든 레코드에서). 전체 스크립트는 다음과 같습니다.
# merge_shps.py
import os
path = "D:/GIS/01_tutorials/ND_Roads/extracted" # path to your folder of .shp files
merge = "merge_filename" # this will be the name of your merged result
directory = os.listdir(path)
count = 0
for filename in directory:
if ".SHP" in filename.upper() and not ".XML" in filename.upper():
# On the first pass, create a clone and add the filename column.
if count == 0:
# Make a clone (matt wilkie)..
cmd = 'ogr2ogr ' + path + '/' + merge + '.shp ' + path + '/' + filename + ' -where "FID < 0"'
os.system(cmd)
# Add the field (j03lar50n)..
cmd = 'ogrinfo ' + path + '/' + merge + '.shp -sql "ALTER TABLE ' + merge + ' ADD COLUMN filename character(50)"'
os.system(cmd)
# Now populate the data (capooti)..
print "Merging: " + str(filename)
# You'll need the filename without the .shp extension for the OGR_SQL..
filenameNoExt = filename.replace(".shp","")
cmd = 'ogr2ogr -f "esri shapefile" -update -append ' + \
path + '/' + merge + '.shp ' + \
path + '/' + filename + \
' -sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'
# Uncomment this line to spit the ogr2ogr sentence to the terminal..
#print "\n" + cmd + "\n"
os.system(cmd)
count += 1