vascobnunes, hier ist, wie ich dieses Problem gelöst habe, indem ich ein Python-Skript verwendet habe, um mehrere ogr2ogr-Anweisungen zu verketten. Sie können es problemlos in ein Stapelskript konvertieren. Im Grunde genommen verknüpfe ich ogr2ogr-Anweisungen ( cmd
) und führe sie dann aus os.system(cmd)
, indem Sie den Befehl ogr2ogr übergeben, den ich verknüpft habe.
Die Geheimwaffe ist ( wie capooti demonstriert ), OGR_SQL anzuwenden , um den Dateinamen als konstanten Wert des Quelldatensatzes festzulegen , den Sie in Ihr Zusammenführungsergebnis einfügen .
In meinem Beispiel behandelt das -sql
Flag dies, im Code sieht es so aus:
-sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'
Das ist jedoch verwirrend zu lesen, da ich in der resultierenden Verkettung einfache und doppelte Anführungszeichen verwenden muss. Um das zu tun, muss ich mich den einfachen Anführungszeichen entziehen , um sie "für echt" zu verwenden. Zur besseren Lesbarkeit ist es daher hilfreich, das Dokument ohne Variablen und Escape-Sequenzen anzuzeigen. Wenn Sie für eine bestimmte Iteration den Dateinamen "roads1" vorgeben, würde die resultierende Verkettung im Satz ogr2ogr folgendermaßen aussehen:
-sql "SELECT 'roads1.shp' AS filename, * FROM roads1"
Dieses .py-Skript ist eine Zusammenführung von drei Tricks, die ich Matt Wilkie (einem leeren Klon eines Shapefiles), j03lar50n (Hinzufügen einer Spalte zu einem Shapefile mithilfe von ogrinfo und ogr_sql) und capooti (mithilfe von ogr_sql, um einen festen Spaltenwert festzulegen) gestohlen habe auf allen Datensätzen in einem Shapefile). Also hier ist das vollständige Skript:
# 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