vascobnunes, đây là cách tôi giải quyết vấn đề này bằng cách sử dụng tập lệnh Python để tạo chuỗi các hướng dẫn ogr2ogr cùng nhau. Bạn có thể dễ dàng chuyển đổi nó thành một tập lệnh bó, về cơ bản tôi chỉ cần ghép các lệnh ogr2ogr với nhau ( cmd
), sau đó thực hiện chúng bằng cách gọi os.system(cmd)
, truyền lệnh ogr2ogr mà tôi ghép lại với nhau.
Vũ khí bí mật là ( như capooti đã trình diễn ) áp dụng OGR_Query để đặt tên tệp là giá trị không đổi của tập dữ liệu nguồn mà bạn đang thêm vào kết quả hợp nhất của mình.
Trong ví dụ của tôi, -sql
cờ xử lý điều này, trong mã nó giống như thế này:
-sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'
Nhưng điều đó thật khó hiểu vì tôi cần phải áp dụng các trích dẫn đơn và trích dẫn kép trong phần kết quả. Để làm điều đó, tôi phải thoát các dấu ngoặc đơn (nghĩa là \ ') để sử dụng chúng "thực sự". Vì vậy, để dễ đọc, nó giúp nhìn thấy nó mà không có các biến và thoát các chuỗi. Nếu bạn giả vờ tên tệp là "đường1" cho một lần lặp cụ thể, kết quả kết quả sẽ giống như thế này trong câu ogr2ogr:
-sql "SELECT 'roads1.shp' AS filename, * FROM roads1"
Kịch bản py Đây là một sự pha trộn của ba thủ thuật tôi đã đánh cắp từ mờ Wilkie (một trống, tạo bản sao của một shapefile), j03lar50n (thêm một cột vào một shapefile sử dụng ogrinfo và ogr_sql), và capooti (sử dụng ogr_sql để áp đặt một giá trị cột cố định trên tất cả các hồ sơ trong một shapefile). Vì vậy, đây là kịch bản đầy đủ:
# 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