vascobnunes、Pythonスクリプトを使用していくつかの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スクリプトは私から盗んだ3つのトリックの融合であるマットウィルキー(シェープファイルの空の、クローン)、j03lar50n(ogrinfoとogr_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