vascobnunes, ben bu sorunu birkaç ogr2ogr talimat birlikte papatya zinciri için bir Python komut dosyası kullanarak nasıl başardı. Kolayca bir toplu iş komut dosyasına dönüştürebilirsiniz, temelde ben sadece ogr2ogr talimatları ( cmd
) birleştirmek , sonra arayarak os.system(cmd)
ogr2ogr komut birlikte geçirerek onları yürütün .
Gizli silah ( capooti'nin gösterdiği gibi ) , dosya adını birleştirme sonucunuza eklediğiniz kaynak veri kümesinin sabit bir değeri olarak uygulamak için OGR_SQL kullanıyor.
-sql
Örneğimde , bayrak bunu işliyor, kodda şöyle:
-sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'
Ancak bu, okumak için kafa karıştırıcıdır, çünkü sonuçta birleştirmede tek tırnak ve çift tırnak kullanmam gerekiyor. Bunu yapmak için "gerçek" onları kullanmak için tek tırnak (yani \ ') kaçmak zorunda. Bu nedenle, okunabilirlik için, değişkenler ve kaçış dizileri olmadan görmeye yardımcı olur. Dosya adının belirli bir yineleme için "roads1" olduğunu varsayarsanız, sonuçtaki birleştirme ogr2ogr cümlesinde şöyle görünür:
-sql "SELECT 'roads1.shp' AS filename, * FROM roads1"
Bu .py komut dosyası, matt wilkie'den (boş, bir şekil dosyasının klonu), j03lar50n'den (ogrinfo ve ogr_sql kullanarak bir şekil dosyasına bir sütun ekleyerek) ve kapooti'den (sabit bir sütun değeri uygulamak için ogr_sql kullanarak) çaldığım üç hilenin birleşimidir. şekil dosyasındaki tüm kayıtlarda). İşte tam komut dosyası:
# 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