ogr2ogr unisce più shapefile: qual è lo scopo del tag -nln?


11

Lo script di base per iterare ricorsivamente su sottocartelle e unire tutti gli shapefile in uno solo è:

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

Passando il mouse sopra tutti gli esempi sul Web, ho notato che per il caso in cui aggiorno il file di output, -nlnviene aggiunto un tag, ad esempio:

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

Secondo la documentazione si dice:

Assegna un nome alternativo al nuovo livello

E ho notato che crea un file di forma temporaneo chiamato "unito" e alla fine del ciclo il file è identico all'ultimo file di forma che ho unito.

Non capisco perché ho bisogno di questo? Perché sono riuscito a unirmi con successo senza questo tag.

Risposte:


19

Per GDAL ci sono datastore che contengono livelli. Alcuni archivi di dati, come quelli del database o GML, possono contenere diversi livelli, ma altri come gli shapefile possono contenere solo un livello.

È possibile verificare, ad esempio, con il driver GeoPackage cosa succede se non si utilizza l'opzione -nln con un archivio dati che può contenere molti livelli.

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)

Il driver dello shapefile non ha necessariamente bisogno del nome del layer perché se si dà il nome del datastore "a.shp" il driver ha la logica per vedere un singolo layer, chiamato dal nome di base del shapefile. Pertanto è possibile aggiungere dati a "merged.shp" con il comando:

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

Tuttavia, il driver shapefile ha anche un'altra logica per considerare un archivio dati il ​​cui nome viene dato senza estensione .shp come archivio dati multistrato. In pratica questo significa una directory che contiene uno o più shapefile come layer. Puoi testare cosa succede con un comando

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

Oppure puoi modificare leggermente il tuo script per avere

consolidated_file="./consolidated"

Se si desidera aggiungere dati con ogr2ogr, è obbligatorio utilizzare l'opzione -nln con alcuni driver, inclusi alcuni che non supportano più livelli. Per alcuni altri driver non è strettamente necessario, ma l'uso di -nln è sempre sicuro e fortunatamente viene usato negli esempi che hai trovato. Altrimenti avremmo un sacco di domande sul perché la fusione in shapefile abbia successo, ma la fusione con altri formati crea solo nuovi livelli.


eri più veloce di me! E anche con alcune nuove informazioni che non conoscevo l'output di Shapefile in una directory. Grande!
pLumo,

4

Gli Shapefile includono solo un set di dati (livello), quindi non è necessario impostare un nome utente.

Se lavori con PostGIS, SQLite, KML ecc. In grado di gestire più livelli in un unico file, devi impostare -nln. Altrimenti i livelli saranno come i nomi dei file e quindi non uniti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.