vascobnunes นี่คือวิธีที่ฉันประสบความสำเร็จในปัญหานี้โดยใช้สคริปต์ Python เพื่อ daisy-chain คำแนะนำ ogr2ogr หลายคำพร้อมกัน คุณสามารถแปลงเป็นสคริปต์แบบแบตช์ได้ง่ายๆโดยทั่วไปฉันเพียงแค่เชื่อมคำสั่ง ogr2ogr ( cmd
) เข้าด้วยกันแล้วดำเนินการโดยการเรียกos.system(cmd)
ผ่านคำสั่ง ogr2ogr ที่ต่อกันเข้าด้วยกัน
อาวุธลับคือ ( ดังที่ capooti แสดง ) ใช้OGR_SQLเพื่อกำหนดชื่อไฟล์เป็นค่าคงที่ของชุดข้อมูลต้นฉบับที่คุณผนวกเข้ากับผลการผสาน
ในตัวอย่างของฉันการ-sql
จัดการค่าสถานะนี้ในรหัสเป็นดังนี้:
-sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'
แต่นั่นทำให้สับสนเพราะฉันต้องใช้เครื่องหมายคำพูดเดี่ยวและเครื่องหมายคำพูดคู่ในการต่อผลลัพธ์ที่ได้ ในการทำเช่นนั้นฉันต้องหลีกเลี่ยงอัญประกาศเดี่ยว (เช่น \ ') เพื่อใช้คำว่า "เป็นของจริง" ดังนั้นเพื่อความสะดวกในการอ่านจะช่วยให้เห็นได้โดยไม่ต้องมีตัวแปรและลำดับการยกเว้น หากคุณแกล้งชื่อไฟล์คือ "roads1" สำหรับการวนซ้ำโดยเฉพาะการต่อผลลัพธ์ที่เกิดขึ้นจะมีลักษณะเช่นนี้ในประโยค ogr2ogr:
-sql "SELECT 'roads1.shp' AS filename, * FROM roads1"
สคริปต์. py นี้เป็นการรวมกันของสามเทคนิคที่ฉันขโมยมาจากmatt wilkie (ว่างเปล่า, โคลนของ shapefile), j03lar50n (เพิ่มคอลัมน์ไปยัง shapefile โดยใช้ ogrinfo และ ogr_sql) และcapooti (ใช้ ogr_sql เพื่อกำหนดค่าคอลัมน์ถาวร ในบันทึกทั้งหมดใน shapefile) ดังนั้นนี่คือสคริปต์เต็มรูปแบบ:
# 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