ogr2ogr scala wiele plików kształtów: Do czego służy tag -nln?

11

Podstawowym skryptem w celu iteracyjnego rekurencyjnego przechodzenia między podfolderami i scalania wszystkich plików kształtów w jeden jest:

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

Hoverrer we wszystkich przykładach w Internecie zauważyłem, że w przypadku aktualizacji pliku wyjściowego -nlndodaje się znacznik, na przykład:

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

Zgodnie z dokumentacją mówi:

Przypisz alternatywną nazwę do nowej warstwy

Zauważyłem, że tworzy tymczasowy plik kształtu o nazwie „scalony”, a na końcu pętli plik jest identyczny z ostatnim scalonym plikiem kształtu.

Nie rozumiem, dlaczego tego potrzebuję? Ponieważ udało mi się scalić bez tego znacznika.

Michael
źródło

Odpowiedzi:

19

W przypadku GDAL istnieją magazyny danych zawierające warstwy. Niektóre magazyny danych, takie jak bazy danych lub GML, mogą zawierać kilka warstw, ale inne, takie jak pliki kształtów, mogą zawierać tylko jedną warstwę.

Możesz na przykład przetestować za pomocą sterownika GeoPackage, co się stanie, jeśli nie użyjesz przełącznika -nln z magazynem danych, który może zawierać wiele warstw.

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)

Sterownik shapefile niekoniecznie potrzebuje nazwy warstwy, ponieważ jeśli nadasz nazwie magazynu danych „a.shp”, sterownik ma logikę, aby zobaczyć pojedynczą warstwę, nazwaną przez basename pliku shapefile. Dlatego możesz dodać dane do pliku „scaled.shp” za pomocą polecenia:

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

Jednak sterownik shapefile ma również inną logikę do rozważenia magazynu danych, którego nazwa jest nadawana bez rozszerzenia .shp jako wielowarstwowy magazyn danych. W praktyce oznacza to katalog zawierający jeden lub więcej plików kształtów jako warstw. Możesz sprawdzić, co dzieje się z poleceniem

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

Możesz też nieco zmodyfikować skrypt, aby go mieć

consolidated_file="./consolidated"

Jeśli chcesz dołączyć dane do ogr2ogr, obowiązkowe jest użycie przełącznika -nln z niektórymi sterownikami, w tym kilkoma, które nie obsługują wielu warstw. W przypadku niektórych innych sterowników nie jest to absolutnie konieczne, ale użycie opcji -nln jest zawsze bezpieczne i na szczęście jest używane w znalezionych przykładach. W przeciwnym razie mielibyśmy wiele pytań na temat tego, dlaczego scalanie w pliki kształtu jest udane, ale scalanie z innymi formatami tworzy tylko nowe warstwy.

użytkownik30184
źródło
byłeś szybszy ode mnie! A także z nowymi informacjami, których nie wiedziałem o wyjściu Shapefile do katalogu. Świetny!
pLumo
4

Pliki kształtów zawierają tylko jeden zestaw danych (Warstwa), więc ustawienie nazwy warstwy nie jest konieczne.

Jeśli pracujesz z PostGIS, SQLite, KML itp., Które mogą obsługiwać wiele warstw w jednym pliku, musisz ustawić -nln. W przeciwnym razie warstwy będą podobne do nazw plików, a zatem nie zostaną scalone.

pLumo
źródło