vascobnunes, voici comment j'ai résolu ce problème en utilisant un script Python pour chaîner plusieurs instructions ogr2ogr ensemble. Vous pouvez facilement le convertir en script batch, en gros je concatène ensemble les instructions ogr2ogr ( cmd
), puis je les exécute en appelant os.system(cmd)
, en transmettant la commande ogr2ogr que j'ai concaténée ensemble.
L'arme secrète consiste ( comme Capooti l'a démontré ) à appliquer OGR_SQL pour imposer le nom de fichier en tant que valeur constante de l'ensemble de données source que vous ajoutez à votre résultat de fusion.
Dans mon exemple, le -sql
drapeau gère cela, dans le code, c'est comme ceci:
-sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'
Mais c'est déroutant à lire car j'ai besoin d'appliquer des guillemets simples et des guillemets doubles dans la concaténation résultante. Pour ce faire, je dois échapper aux guillemets simples (c'est-à-dire \ ') pour les utiliser "pour de vrai". Donc, pour la lisibilité, cela aide à le voir sans variables et séquences d'échappement. Si vous prétendez que le nom de fichier était "routes1" pour une itération particulière, la concaténation résultante ressemblerait à ceci dans la phrase ogr2ogr:
-sql "SELECT 'roads1.shp' AS filename, * FROM roads1"
Ce script .py est une fusion de trois astuces que j'ai volées à matt wilkie (un vide, clone d'un fichier de formes), j03lar50n (ajout d'une colonne à un fichier de formes à l'aide d'ogrinfo et ogr_sql) et capooti (à l'aide d'ogr_sql pour imposer une valeur de colonne fixe sur tous les enregistrements d'un fichier de formes). Voici donc le script complet:
# 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