vascobnunes, यहाँ है कि कैसे मैं एक साथ कई ogr2ogr निर्देशों को डेज़ी-चेन को पायथन स्क्रिप्ट का उपयोग करके इस समस्या को पूरा किया। आप इसे आसानी से एक बैच स्क्रिप्ट में परिवर्तित कर सकते हैं, मूल रूप से मैं सिर्फ ogr2ogr निर्देशों ( cmd
) को एक साथ मिलाता हूं , फिर उन्हें कॉल करके निष्पादित करता हूं os.system(cmd)
, पास होने वाले ogr2ogr कमांड में मैंने एक साथ संक्षिप्त किया।
गुप्त हथियार है ( जैसा कि कैपूटी ने प्रदर्शित किया है ) OGR_SQL को लागू करने के लिए फ़ाइल नाम को उस स्रोत डेटासेट के निरंतर मान के रूप में लागू करना है जिसे आप अपने मर्ज परिणाम में जोड़ रहे हैं।
मेरे उदाहरण में, -sql
ध्वज इसे संभालता है, कोड में यह इस प्रकार है:
-sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'
लेकिन यह पढ़ने के लिए भ्रामक है क्योंकि मुझे परिणामी सहमति में एकल उद्धरण और दोहरे उद्धरण लागू करने की आवश्यकता है। ऐसा करने के लिए मुझे उन्हें "वास्तविक के लिए" उपयोग करने के लिए एकल उद्धरण (यानी \ ') से बचना होगा । तो पठनीयता के लिए, यह इसे चर और भागने के दृश्यों के बिना देखने में मदद करता है। यदि आप एक विशेष पुनरावृत्ति के लिए फ़ाइल नाम "सड़कों 1" का ढोंग करते हैं, तो परिणामी निष्कर्ष इस तरह से होगा जैसे Or2ogr वाक्य:
-sql "SELECT 'roads1.shp' AS filename, * FROM roads1"
यह .py स्क्रिप्ट तीन तरकीबों का एक समामेलन है जो मैंने मैट विल्की (एक खाली, एक आकृति के क्लोन) से चुराया , j03lar50n (एक स्तंभ को ogrinfo और ogk_sql का उपयोग करके जोड़कर), और capooti (एक निश्चित स्तंभ मान लगाने के लिए ogr_sql का उपयोग करके ) एक आकृति में सभी रिकॉर्ड पर)। तो यहाँ पूरी स्क्रिप्ट है:
# 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