vascobnunes, inilah cara saya menyelesaikan masalah ini dengan menggunakan skrip Python untuk membuat daisy-chain beberapa instruksi ogr2ogr bersamaan. Anda dapat dengan mudah mengubahnya menjadi skrip batch, pada dasarnya saya hanya menyatukan instruksi ogr2ogr ( cmd
), kemudian menjalankannya dengan memanggil os.system(cmd)
, meneruskan perintah ogr2ogr yang saya gabungkan bersama.
Senjata rahasianya adalah ( seperti yang ditunjukkan oleh capooti ) menerapkan OGR_SQL untuk memaksakan nama file sebagai nilai konstan dari dataset sumber yang Anda tambahkan ke dalam hasil gabungan Anda.
Dalam contoh saya, -sql
flag menangani ini, dalam kode seperti ini:
-sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'
Tapi itu membingungkan untuk dibaca karena saya perlu menerapkan tanda kutip tunggal dan ganda dalam rangkaian yang dihasilkan. Untuk melakukan itu saya harus melarikan diri dari tanda kutip tunggal (yaitu \ ') untuk menggunakannya "nyata". Jadi untuk keterbacaan, membantu melihatnya tanpa variabel dan menghindari urutan. Jika Anda berpura-pura nama file adalah "jalan1" untuk iterasi tertentu, hasil gabungan akan terlihat seperti ini dalam kalimat ogr2ogr:
-sql "SELECT 'roads1.shp' AS filename, * FROM roads1"
Skrip .py ini adalah penggabungan tiga trik yang saya curi dari matt wilkie (klon kosong dari shapefile), j03lar50n (menambahkan kolom ke shapefile menggunakan ogrinfo dan ogr_sql), dan capooti (menggunakan ogr_sql untuk memaksakan nilai kolom tetap pada semua catatan dalam suatu shapefile). Jadi inilah skrip lengkapnya:
# 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