ogr2ogrは複数のシェープファイルをマージします:-nlnタグの目的は何ですか?


11

サブフォルダーを再帰的に繰り返し、すべてのシェープファイルを単一のシェープファイルにマージするための基本的なスクリプトは次のとおりです。

#!/bin/bash
consolidated_file="./consolidated.shp"
for i in $(find . -name '*.shp'); do
    if [ ! -f "$consolidated_file" ]; then
        # first file - create the consolidated output file
        ogr2ogr -f "ESRI Shapefile" $consolidated_file $i
    else
        # update the output file with new file content
        ogr2ogr -f "ESRI Shapefile" -update -append $consolidated_file $i
    fi
done

ホバーのウェブ上のすべての例に、私は出力ファイルを更新する場合に、-nlnタグが追加されていることに気づきました。たとえば:

ogr2ogr -f "ESRI Shapefile" -update -append $consolidated_file $i -nln merged

ドキュメントによると:

新しいレイヤーに別名を割り当てます

そして、「マージ」と呼ばれる一時的なシェープファイルを作成し、ループの最後で、ファイルは最後にマージしたシェープファイルと同じであることに気付きました。

なぜこれが必要なのか分かりませんか?このタグなしで正常にマージできたからです。

回答:


19

GDALには、レイヤーを含むデータストアがあります。データベースやGMLなどの一部のデータストアは複数のレイヤーを保持できますが、シェープファイルなどの一部のデータストアは1つのレイヤーのみを含むことができます。

たとえばGeoPackageドライバーを使用して、多くのレイヤーを含むことができるデータストアで-nlnスイッチを使用しないとどうなるかをテストできます。

ogr2ogr -f gpkg merged.gpkg a.shp
ogr2ogr -f gpkg -append -update merged.gpkg b.shp

ogrinfo merged.gpkg
INFO: Open of `merged.gpkg'
      using driver `GPKG' successful.
1: a (Polygon)
2: b (Polygon)

データストア名に「a.shp」を指定すると、ドライバーには、シェープファイルのベース名で名前が付けられた単一のレイヤーを表示するロジックがあるため、シェープファイルドライバーは必ずしもレイヤー名を必要としません。したがって、次のコマンドを使用して「merged.shp」にデータを追加できます。

ogr2ogr -f "ESRI Shapefile" merged.shp a.shp
ogr2ogr -f "ESRI Shapefile" -append -update merged.shp b.shp

ただし、シェープファイルドライバーには、.shp拡張子なしで名前が付けられたデータストアをマルチレイヤーデータストアとして考慮する別のロジックもあります。実際には、これは1つ以上のシェープファイルをレイヤーとして含むディレクトリを意味します。コマンドで何が起こるかをテストできます

ogr2ogr -f "ESRI Shapefile" merged a.shp
ogr2ogr -f "ESRI Shapefile" -append -update merged b.shp

または、スクリプトを少し編集して、

consolidated_file="./consolidated"

ogr2ogrを使用してデータを追加する場合は、複数のレイヤーをサポートしないドライバーを含む一部のドライバーで-nlnスイッチを使用する必要があります。他の一部のドライバーでは厳密に必要ではありませんが、-nlnを使用することは常に安全であり、幸いなことに発見した例で使用されています。それ以外の場合、シェープファイルへのマージが成功する理由について多くの質問がありますが、他の形式へのマージは新しいレイヤーを作成するだけです。


あなたは私よりも速かった!また、ディレクトリへのシェープファイルの出力について知らなかった新しい情報もあります。すごい!
-pLumo

4

シェープファイルには1つのデータセット(レイヤー)のみが含まれるため、レイヤー名を設定する必要はありません。

1つのファイルで複数のレイヤーを処理できるPostGIS、SQLite、KMLなどを使用する場合は、-nlnを設定する必要があります。そうでない場合、レイヤーはファイル名のようになるため、マージされません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.