ogr2ogr mehrere Shapefiles zusammenführen: Was ist der Zweck des Tags -nln?

11

Das grundlegende Skript, um rekursiv über Unterordner zu iterieren und alle Shapefiles zu einem einzigen zusammenzuführen, lautet:

#!/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

Hoverer in vertaully allen Beispielen im Web Ich habe festgestellt, dass für den Fall, dass ich die Ausgabedatei aktualisiere, -nlnTag hinzugefügt wird, zum Beispiel:

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

Laut Dokumentation heißt es:

Weisen Sie der neuen Ebene einen alternativen Namen zu

Und ich habe festgestellt, dass ein temporäres Shapefile namens "zusammengeführt" erstellt wird. Am Ende der Schleife ist die Datei identisch mit dem zuletzt zusammengeführten Shapefile.

Ich verstehe nicht, warum ich das brauche? Weil es mir gelungen ist, ohne dieses Tag erfolgreich zusammenzuführen.

Michael
quelle

Antworten:

19

Für GDAL gibt es Datenspeicher, die Ebenen enthalten. Einige Datenspeicher, wie die Datenbankspeicher oder GML, können mehrere Ebenen enthalten, andere, wie Shapefiles, können nur eine Ebene enthalten.

Sie können beispielsweise mit dem GeoPackage-Treiber testen, was passiert, wenn Sie den Schalter -nln nicht mit einem Datenspeicher verwenden, der viele Ebenen enthalten kann.

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)

Der Shapefile-Treiber benötigt nicht unbedingt den Layernamen, denn wenn Sie den Datenspeichernamen "a.shp" angeben, verfügt der Treiber über die Logik, einen einzelnen Layer anzuzeigen, der nach dem Basisnamen des Shapefiles benannt ist. Daher können Sie mit dem folgenden Befehl Daten zu "fusioned.shp" hinzufügen:

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

Der Shapefile-Treiber verfügt jedoch auch über eine andere Logik, um einen Datenspeicher zu betrachten, dessen Name ohne die Erweiterung .shp als mehrschichtiger Datenspeicher angegeben wird. Praktisch bedeutet dies ein Verzeichnis, das ein oder mehrere Shapefiles als Ebenen enthält. Sie können testen, was mit einem Befehl passiert

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

Oder dann können Sie Ihr Skript leicht bearbeiten, um zu haben

consolidated_file="./consolidated"

Wenn Sie Daten mit ogr2ogr anhängen möchten, müssen Sie bei einigen Treibern den Schalter -nln verwenden, darunter einige, die nicht mehrere Ebenen unterstützen. Für einige andere Treiber ist dies nicht unbedingt erforderlich, aber die Verwendung von -nln ist immer sicher und wird zum Glück in den Beispielen verwendet, die Sie gefunden haben. Andernfalls hätten wir eine Reihe von Fragen, warum das Zusammenführen in Shapefiles erfolgreich ist, aber das Zusammenführen mit anderen Formaten nur neue Ebenen erzeugt.

user30184
quelle
Du warst schneller als ich! Und auch mit einigen neuen Informationen wusste ich nichts über die Shapefile-Ausgabe in ein Verzeichnis. Groß!
pLumo
4

Shapefiles enthalten nur einen Datensatz (Layer), sodass das Festlegen eines Layernamens nicht erforderlich ist.

Wenn Sie mit PostGIS, SQLite, KML usw. arbeiten, die mehrere Ebenen in einer Datei verarbeiten können, müssen Sie -nln festlegen. Andernfalls entsprechen die Ebenen den Dateinamen und werden daher nicht zusammengeführt.

pLumo
quelle