ogr2ogr fusionner plusieurs fichiers de formes: à quoi sert la balise -nln?

11

Le script de base pour itérer récursivement sur des sous-dossiers et fusionner tous les fichiers de formes en un seul est:

#!/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 dans vertaully tous les exemples sur le web, j'ai remarqué que pour le cas où je mets à jour le fichier de sortie, une -nlnbalise est ajoutée, par exemple:

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

Selon la documentation, il est dit:

Attribuer un autre nom au nouveau calque

Et j'ai remarqué qu'il crée un fichier de formes temporaire appelé "fusionné", et à la fin de la boucle, le fichier est identique au dernier fichier de formes que j'ai fusionné.

Je ne comprends pas pourquoi j'ai besoin de ça? Parce que j'ai réussi à fusionner avec succès sans cette balise.

Michael
la source

Réponses:

19

Pour GDAL, il existe des banques de données qui contiennent des couches. Certaines banques de données, comme celles de la base de données ou GML, peuvent contenir plusieurs couches, mais d'autres comme les fichiers de formes ne peuvent contenir qu'une seule couche.

Vous pouvez tester avec par exemple le pilote GeoPackage ce qui se passe si vous n'utilisez pas le commutateur -nln avec une banque de données pouvant contenir de nombreuses couches.

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)

Le pilote de fichier de formes n'a pas nécessairement besoin du nom de couche car si vous donnez le nom de magasin de données "a.shp", le pilote a la logique de voir une seule couche, nommée par le nom de base du fichier de formes. Par conséquent, vous pouvez ajouter des données à "merged.shp" avec la commande:

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

Cependant, le pilote de fichier de formes a également une autre logique pour considérer une banque de données dont le nom est donné sans extension .shp en tant que banque de données multicouche. Cela signifie pratiquement un répertoire qui contient un ou plusieurs fichiers de formes en tant que couches. Vous pouvez tester ce qui se passe avec une commande

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

Ou alors vous pouvez modifier légèrement votre script pour avoir

consolidated_file="./consolidated"

Si vous souhaitez ajouter des données avec ogr2ogr, il est obligatoire d'utiliser le commutateur -nln avec certains pilotes, dont certains qui ne prennent pas en charge plusieurs couches. Pour certains autres pilotes, ce n'est pas strictement nécessaire, mais l'utilisation de -nln est toujours sûre et heureusement, elle est utilisée dans les exemples que vous avez trouvés. Sinon, nous aurions beaucoup de questions sur la raison pour laquelle la fusion dans des fichiers de formes est réussie, mais la fusion vers d'autres formats crée simplement de nouveaux calques.

user30184
la source
tu étais plus rapide que moi! Et aussi avec de nouvelles informations que je ne connaissais pas sur la sortie de Shapefile dans un répertoire. Génial!
pLumo
4

Les fichiers de formes ne comprennent qu'un seul ensemble de données (couche), il n'est donc pas nécessaire de définir un nom de couche.

Si vous travaillez avec PostGIS, SQLite, KML, etc. qui peuvent gérer plusieurs couches dans un seul fichier, vous devez définir -nln. Sinon, les calques seront comme les noms de fichiers et ne seront donc pas fusionnés.

pLumo
la source