vascobnunes, ось, як я вирішив цю проблему, використовуючи сценарій Python для того, щоб з'єднати кілька інструкцій 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-скрипт - це об'єднання трьох трюків, які я вкрав з матового вілкі (порожній, клон формфайлу ), j03lar50n (додавання стовпця до файлу форми за допомогою ogrinfo та ogr_sql) та capooti (використовуючи ogr_sql для накладення фіксованого значення стовпця на всіх записах у форміфайлу). Отже ось повний сценарій:
# 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