ogr2ogr объединяет несколько шейп-файлов: для чего нужен тег -nln?

11

Основной сценарий для рекурсивной итерации по подпапкам и объединения всех шейп-файлов в один:

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

Однако во всех примерах в Интернете я заметил, что для случая, когда я обновляю выходной файл, -nlnдобавляется тег, например:

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

Согласно документации это говорит:

Назначьте альтернативное имя новому слою

И я заметил, что он создает временный шейп-файл под названием «объединенный», и в конце цикла файл идентичен последнему шейп-файлу, который я слил.

Я не понимаю, зачем мне это? Потому что мне удалось слить успешно без этого тега.

Майкл
источник

Ответы:

19

Для GDAL есть хранилища данных, которые содержат слои. Некоторые хранилища данных, такие как базы данных или GML, могут содержать несколько слоев, но некоторые другие, например шейп-файлы, могут содержать только один слой.

Например, вы можете протестировать драйвер GeoPackage, что произойдет, если вы не используете ключ -nln с хранилищем данных, которое может содержать много слоев.

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)

Драйверу шейп-файла не обязательно нужно имя слоя, потому что если вы дадите имя хранилища данных «a.shp», у драйвера будет логика видеть один слой, названный базовым именем шейп-файла. Поэтому вы можете добавить данные в «merged.shp» с помощью команды:

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

Однако драйвер шейп-файла также имеет другую логику, чтобы рассматривать хранилище данных, имя которого дано без расширения .shp, как многоуровневое хранилище данных. Практически это означает каталог, который содержит один или несколько шейп-файлов в качестве слоев. Вы можете проверить, что происходит с командой

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

Или тогда вы можете немного отредактировать свой скрипт, чтобы иметь

consolidated_file="./consolidated"

Если вы хотите добавить данные с помощью ogr2ogr, обязательно используйте ключ -nln с некоторыми драйверами, включая некоторые, которые не поддерживают несколько слоев. Для некоторых других драйверов это не является строго необходимым, но использование -nln всегда безопасно и, к счастью, оно используется в найденных вами примерах. В противном случае у нас возникнет куча вопросов о том, почему объединение в шейп-файлы является успешным, а объединение с другими форматами просто создает новые слои.

user30184
источник
ты был быстрее меня! А также с некоторой новой информацией, которую я не знал о выводе Shapefile в каталог. Большой!
pLumo
4

Шейп-файлы содержат только один набор данных (слой), поэтому указывать имя слоя не обязательно.

Если вы работаете с PostGIS, SQLite, KML и т. Д., Которые могут обрабатывать несколько слоев в одном файле, вам нужно установить -nln. В противном случае слои будут похожи на имена файлов и, следовательно, не будут объединены.

pLumo
источник