vascobnunes, así es como logré este problema usando un script de Python para encadenar varias instrucciones ogr2ogr juntas. Puede convertirlo fácilmente en un script por lotes, básicamente solo concateno las instrucciones de ogr2ogr ( cmd
), luego las ejecuto llamando os.system(cmd)
, pasando el comando ogr2ogr que concatenamos juntos.
El arma secreta es ( como demostró Capooti ) aplicar OGR_SQL para imponer el nombre de archivo como un valor constante del conjunto de datos de origen que está agregando a su resultado de fusión.
En mi ejemplo, la -sql
bandera maneja esto, en el código es así:
-sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'
Pero eso es confuso de leer porque necesito aplicar comillas simples y comillas dobles en la concatenación resultante. Para hacerlo, tengo que escapar de las comillas simples (es decir, \ ') para usarlas "de verdad". Entonces, para facilitar la lectura, es útil verlo sin variables y secuencias de escape. Si finge que el nombre de archivo era "roads1" para una iteración particular, la concatenación resultante se vería así en la oración ogr2ogr:
-sql "SELECT 'roads1.shp' AS filename, * FROM roads1"
Este script .py es una amalgama de tres trucos que le robé a matt wilkie (un clon vacío de un shapefile), j03lar50n (agregando una columna a un shapefile usando ogrinfo y ogr_sql) y capooti (usando ogr_sql para imponer un valor de columna fijo en todos los registros en un shapefile). Así que aquí está el guión completo:
# 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