ogr2ogr合并多个shapefile:-nln标签的作用是什么?


11

为了在子文件夹上递归迭代并将所有shapefile合并为一个脚本,基本脚本是:

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

根据文档说:

为新图层分配一个备用名称

我注意到它创建了一个名为“ merged”的临时shapefile,在循环的最后,该文件与我合并的最后一个shapefile相同。

我不明白为什么我需要这个?因为我成功地合并了没有这个标签的人。

Answers:


19

对于GDAL,存在包含图层的数据存储。一些数据存储区(如数据库存储区或GML)可以容纳多层,而另一些数据集(如shapefile)则只能包含一层。

您可以使用例如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)

shapefile驱动程序不一定需要图层名称,因为如果您给数据存储名称“ a.shp”,则该驱动程序具有查看单个图层的逻辑,该图层由shapefile的基本名称命名。因此,您可以使用以下命令将数据添加到“ merged.shp”:

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

但是,shapefile驱动程序还有另一种逻辑来考虑一个数据存储库,该存储库的名称不带.shp扩展名,它是一个多层数据存储库。实际上,这意味着包含一个或多个shapefile作为图层的目录。您可以测试命令会发生什么

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

或者,您也可以稍微修改一下脚本

consolidated_file="./consolidated"

如果要使用ogr2​​ogr附加数据,则必须在某些驱动程序中使用-nln开关,其中包括一些不支持多层的驱动程序。对于其他一些驱动程序,并非绝对必要,但是使用-nln始终是安全的,幸运的是,已在示例中使用了它。否则,我们会有很多疑问,为什么合并到shapefile中会成功,但是合并到其他格式只会创建新的图层。


你比我快!还有一些我不知道的关于Shapefile输出到目录的新信息。大!
pLumo

4

Shapefile仅包含一个数据集(图层),因此无需设置图层名称。

如果您使用的PostGIS,SQLite,KML等可以在一个文件中处理多个图层,则需要设置-nln。否则,图层将像文件名一样,因此不会合并。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.