在将shapefile与ogr2ogr合并时,添加具有文件名的字段?


14

我正在合并一些shapefile,但在QGIS中这样做时遇到了一些问题,因此我直接使用了ogr2ogr。我正在这样做(批量):

ogr2ogr -overwrite %destination% %n1%
ogr2ogr -update -append %destination% %n2% -nln all_new
ogr2ogr -update -append %destination% %n3% -nln all_new
ogr2ogr -update -append %destination% %n4% -nln all_new

它工作正常,但现在我需要在生成的shapefile中有一个字段,其中包含我合并的原始shapefile的名称。听起来并不困难,但我没有设法做到这一点。

有人可以帮忙吗?谢谢!

Answers:


14

使用小的脚本,这将是可行的。使用类似以下的方法,您应该能够将列添加到文件夹中所有shapefile中的shapefile中,并将它们合并到merged.shp文件中

for %f in (*.shp) do (
  ogrinfo %f -sql "ALTER TABLE %f ADD COLUMN filename character(15)"
  ogrinfo %f -sql "UPDATE TABLE %f filename = '%f'"
  ogr2ogr -update -append merged.shp %f -f esri shapefile -nln merge 
)

编辑:与Bash脚本相同,但进行一些更改以使其起作用:

for f in *.shp
do 
  base=${f%.shp}
  ogrinfo $f -sql "ALTER TABLE $base ADD COLUMN filename character(15)"
  ogrinfo $f -dialect SQLite -sql "UPDATE $base SET filename = '$base'"
  ogr2ogr -update -append merged.shp $f
done

仅当您所有的图层/ shapefile具有相同的名称(例如“ CHEMIN”正确)时,此解决方案才有效。我正在寻找一种解决方案,以脚本编写具有不同图层名称的文件。
oeon 2012年

正确,如果用%f替换CHEMIN,则它可以使用任何名称,因为shapefile表名称是图层名称。我编辑了答案。我没有Windows可以真正测试它
JaakL

9

我将使用-sql选项,并通过以下方式导入shapefile:

ogr2ogr -update -append %destination% %n2% -sql 'SELECT "%n2%" as SHAPE_ORIG, field1, field2, ... FROM %n2%'

Paolo-我正在努力使它正常工作。只能使用ogr2​​ogr来完成,不能使用ogrinfo吗?我已经张贴到GDAL-dev的太多,用我的例子lists.osgeo.org/pipermail/gdal-dev/2012-November/034849.html不能做到这一点在Windows或击..
oeon

Joe,单个ogrinfo行是否失败,还是仅在脚本上下文中(在循环内)失败?
capooti 2012年

Paolo-我将在下面添加对我有用的答案。亲爱的先生,谢谢您跟我来!:)
oeon 2012年

7

有一些合并shapefile的方法。

  • 如果要将图层合并为一层,可以使用MMqgis工具进行合并...

mmqgis

  • 如果要合并文件夹中的所有shapefile,可以在此处使用DARREN COPE简单代码。

mkdir merged
for %f in (*.shp) do (
if not exist merged\merged.shp (
ogr2ogr -f esri shapefile merged\merged.shp %f) else (
ogr2ogr -f esri shapefile -update -append merged\merged.shp %f -nln Merged )
)
  • 除此之外,还可以使用免费的GeoMerge工具来合并大量文件,但不要忘记考虑文件大小以进行处理。

并将属性添加到shapefile @dango Directon是好的。您可以使用layer.CreateField(field_name)创建一个新列,该列从

import os
shapeFileName = os.path.splitext("your_shape_file_path")[0]

我希望它可以帮助您...


5

vascobnunes,这是我通过使用Python脚本将多个ogr2ogr指令菊花链式链接在一起的方法来解决此问题。您可以轻松地将其转换为批处理脚本,基本上我只是将ogr2ogr指令(cmd)连接在一起,然后通过调用os.system(cmd),传入我串联在一起的ogr2ogr命令来执行它们。

秘密武器是(如capooti所示)应用OGR_SQL将文件名强加为要追加到合并结果中的源数据集的常量值。

在我的示例中,-sql标志在代码中处理如下:

-sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'

但这令人困惑,因为我需要在结果串联中应用单引号和双引号。为此,我必须转义单引号(即\')以“实际”使用它们。因此,为了提高可读性,有助于查看没有变量和转义序列的代码。如果您将文件名假装为特定迭代的“ roads1”,则在ogr2ogr语句中产生的连接看起来像这样:

-sql "SELECT 'roads1.shp' AS filename, * FROM roads1"

这个.py脚本是我从Matt wilkie(一个空的shapefile的克隆),j03lar50n(使用ogrinfo和ogr_sql将一个列添加到shapefile中)和capooti(使用ogr_sql施加一个固定的列值)中窃取的三个技巧的组合在shapefile中的所有记录上)。所以这是完整的脚本:


# merge_shps.py
import os    

path = "D:/GIS/01_tutorials/ND_Roads/extracted"  # path to your folder of .shp files
merge = "merge_filename"                         # this will be the name of your merged result

directory = os.listdir(path)

count = 0
for filename in directory:
    if ".SHP" in filename.upper() and not ".XML" in filename.upper():

        # On the first pass, create a clone and add the filename column.
        if count == 0:
            # Make a clone (matt wilkie)..
            cmd = 'ogr2ogr ' + path + '/' + merge + '.shp ' + path + '/' + filename + ' -where "FID < 0"'
            os.system(cmd)

            # Add the field (j03lar50n)..
            cmd = 'ogrinfo ' + path + '/' + merge + '.shp -sql "ALTER TABLE ' + merge + ' ADD COLUMN filename character(50)"'
            os.system(cmd)

        # Now populate the data (capooti)..
        print "Merging: " + str(filename)

        # You'll need the filename without the .shp extension for the OGR_SQL..
        filenameNoExt = filename.replace(".shp","")

        cmd = 'ogr2ogr -f "esri shapefile" -update -append ' + \
                path + '/' + merge + '.shp ' + \
                path + '/' + filename + \
                ' -sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'

        # Uncomment this line to spit the ogr2ogr sentence to the terminal..
        #print "\n" + cmd + "\n"

        os.system(cmd)

        count += 1

4

从shapefile的文件夹中添加带有源文件名的列。需要GDAL 1.10dev,我删除.shp扩展名的尝试无效,但总的来说可以。-我想可以将其添加到与OGR合并的行中。

for f in *.shp;

do

name=${f%.shp}

/Users/you/gdal_src/bin/ogrinfo $f -sql "ALTER TABLE $name ADD COLUMN filename character(21)"
/Users/you/gdal_src/bin/ogrinfo $f -dialect SQLite -sql "UPDATE $name SET filename = '$f'"
done;

方言规范为+1。由于OGR SQL未进行更新,因此我在最佳答案上遇到错误。
user15741 '19

3

嗨,也许这个链接会有所帮助。它显示了如何使用python gdal绑定将形状添加到shapefile。



0

JaaKL答案的略微修改版本。请注意,-append foo.shp和-nln foo需要匹配。另外,请注意使用SQLite方言(GDAL显然不接受关键字“ Update”,因此必须立即使用SQLite方言),并在单词“ UPDATE”后缺少关键字“ TABLE”(不需要)或被SQLite接受)。

for %%f in (*.shp) do (
  if not "%%f" == "merge.shp" (
    ogrinfo %%f -sql "ALTER TABLE %%~nf ADD COLUMN fname character(15)"
    ogrinfo %%f -dialect SQLite -sql "UPDATE %%~nf SET fname = '%%~nf'"
    ogr2ogr -update -append merge.shp %%f -f "ESRI SHAPEFILE" -nln merge 
  )
)

0

讨论有点晚了,但现在也有了

ogrmerge.py -single -o merged.shp *.shp -src_layer_field_content {DS_BASENAME}
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.