vascobnunes, he aquí cómo he logrado este problema mediante una secuencia de comandos de Python para la conexión en cadena de varios ogr2ogr instrucciones juntos. Usted puede convertir fácilmente a una secuencia de comandos por lotes, básicamente sólo concatenar juntos ogr2ogr instrucciones (cmd
), a continuación, ejecutar llamando os.system(cmd)
, pasando-en el ogr2ogr comando que se concatenan entre sí.
El arma secreta es (como capooti demostrado) la aplicación de OGR_SQL para imponer el nombre de archivo como un valor constante de la fuente de datos está anexando en su resultado de la combinación.
En mi ejemplo, el -sql
bandera se encarga de esto, en el código como este:
-sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'
Pero que esto es confuso para leer porque tengo que aplicar comillas simples y comillas dobles en el resultado de la concatenación. Para hacer eso tengo que escapar las comillas simples (es decir,\') para el uso de ellos "real". Así que para facilitar la lectura, ayuda a ver sin variables y secuencias de escape. Si se pretende que el nombre de archivo "roads1" para una iteración particular, el resultado de la concatenación tendría este aspecto en el ogr2ogr frase:
-sql "SELECT 'roads1.shp' AS filename, * FROM roads1"
Este .py script es una fusión de tres trucos que le robé a matt wilkie (vacía, clon de un shapefile), j03lar50n (agregar una columna a un shapefile utilizando ogrinfo y ogr_sql), y capooti (utilizando ogr_sql para imponer una columna fija de valor en todos los registros en un archivo shapefile). Así que aquí está el guion 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