vascobnunes, ecco come ho realizzato questo problema usando uno script Python per collegare in sequenza diverse istruzioni di ogr2ogr. Potresti facilmente convertirlo in uno script batch, in pratica ho semplicemente concatenato insieme le istruzioni ogr2ogr ( cmd
), quindi eseguirle chiamandoos.system(cmd)
, passando il comando ogr2ogr che ho concatenato insieme.
L'arma segreta sta ( come ha dimostrato capooti ) applicando OGR_SQL per imporre il nome del file come valore costante del set di dati di origine che stai aggiungendo al risultato della fusione.
Nel mio esempio, la -sql
bandiera gestisce questo, nel codice è così:
-sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'
Ma è confuso da leggere perché ho bisogno di applicare virgolette singole e doppie virgolette nella concatenazione risultante. Per fare ciò devo sfuggire alle virgolette singole (cioè \ ') per usarle "per davvero". Quindi, per leggibilità, aiuta a vederlo senza variabili e sequenze di escape. Se fingi che il nome file fosse "roads1" per una particolare iterazione, la concatenazione risultante sarebbe simile a questa nella frase ogr2ogr:
-sql "SELECT 'roads1.shp' AS filename, * FROM roads1"
Questo script .py è una fusione di tre trucchi che ho rubato da matt wilkie (un vuoto, clone di un file di forma), j03lar50n (aggiungendo una colonna a un file di forma usando ogrinfo e ogr_sql) e capooti (usando ogr_sql per imporre un valore di colonna fisso su tutti i record in uno shapefile). Quindi, ecco lo script 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