ogr2ogr mescla vários shapefiles: Qual é o objetivo da tag -nln?

11

O script básico para iterar recursivamente sobre subpastas e mesclar todos os shapefiles em um único é:

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

Pairando em quase todos os exemplos da Web, notei que, no caso em que atualizo o arquivo de saída, a -nlntag é adicionada, por exemplo:

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

De acordo com a documentação, diz:

Atribua um nome alternativo à nova camada

E notei que ele cria um shapefile temporário chamado "mesclado" e, no final do loop, o arquivo é idêntico ao último shapefile que mesclei.

Não entendo por que preciso disso? Porque consegui mesclar com sucesso sem essa tag.

Michael
fonte

Respostas:

19

Para o GDAL, existem datastores que contêm camadas. Alguns datastores, como os de banco de dados ou GML, podem conter várias camadas, mas outros, como shapefiles, podem conter apenas uma camada.

Você pode testar, por exemplo, com o driver GeoPackage, o que acontece se você não usar a opção -nln com um armazenamento de dados que pode conter muitas camadas.

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)

O driver shapefile não precisa necessariamente do nome da camada, porque se você der o nome do armazenamento de dados "a.shp", o driver terá lógica para ver uma única camada, nomeada pelo nome de base do shapefile. Portanto, você pode adicionar dados ao "merged.shp" com o comando:

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

No entanto, o driver shapefile também tem outra lógica para considerar um armazenamento de dados cujo nome é dado sem a extensão .shp como um armazenamento de dados de várias camadas. Praticamente, isso significa um diretório que contém um ou mais shapefiles como camadas. Você pode testar o que acontece com um comando

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

Ou então, você pode editar seu script levemente para ter

consolidated_file="./consolidated"

Se você deseja acrescentar dados com ogr2ogr, é obrigatório usar a opção -nln com alguns drivers, incluindo alguns que não suportam várias camadas. Para alguns outros drivers, não é estritamente necessário, mas o uso de -nln é sempre seguro e, felizmente, é usado nos exemplos que você encontrou. Caso contrário, teríamos um monte de perguntas sobre por que a fusão em shapefiles é bem-sucedida, mas a fusão com outros formatos apenas cria novas camadas.

user30184
fonte
você foi mais rápido que eu! E também com algumas informações novas que eu não sabia sobre a saída do Shapefile em um diretório. Ótimo!
PLumo
4

Os arquivos shapefiles incluem apenas um conjunto de dados (camada), portanto, a configuração de um nome de leito não é necessária.

Se você trabalha com PostGIS, SQLite, KML etc. que podem lidar com várias camadas em um arquivo, é necessário definir -nln. Caso contrário, as camadas serão como os nomes dos arquivos e, portanto, não serão mescladas.

pLumo
fonte