vascobnunes, eis como eu consegui esse problema usando um script Python para encadear várias instruções ogr2ogr juntas. Você pode facilmente convertê-lo em um script em lote, basicamente apenas concatenar as instruções ogr2ogr ( cmd
) e executá-las chamando os.system(cmd)
, passando o comando ogr2ogr que eu concatenou.
A arma secreta é ( como demonstrado pelo capooti ) aplicando OGR_SQL para impor o nome do arquivo como um valor constante do conjunto de dados de origem que você está anexando ao resultado da mesclagem.
No meu exemplo, a -sql
flag lida com isso, no código é assim:
-sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'
Mas isso é confuso para ler porque eu preciso aplicar aspas simples e aspas duplas na concatenação resultante. Para fazer isso, preciso escapar das aspas simples (ou seja, \ ') para usá-las "de verdade". Portanto, para facilitar a leitura, ajuda a vê-lo sem variáveis e seqüências de escape. Se você fingir que o nome do arquivo era "roads1" para uma iteração específica, a concatenação resultante ficaria assim na sentença ogr2ogr:
-sql "SELECT 'roads1.shp' AS filename, * FROM roads1"
Esse script .py é uma amálgama de três truques que eu roubei de matt wilkie (um clone vazio de um shapefile), j03lar50n (adicionando uma coluna a um shapefile usando ogrinfo e ogr_sql) e capooti (usando ogr_sql para impor um valor fixo da coluna em todos os registros em um shapefile). Então, aqui está o 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