GDAL 多边形化命令行和 python

Lea*_*wly 2 python gdal

我一直在使用gdal命令行将asc文件转换为GeoJSON输出。我可以成功地做到这一点:

gdal_polygonize.py input.asc -f "GeoJSON" output.json

现在我希望使用 Python 并针对一系列文件遵循此过程。

import gdal
import glob
for file in glob.glob("dir/*.asc"):
    new_name = file[:-4] + ".json"
    gdal.Polygonize(file, "-f", "GeoJSON", new_name)
Run Code Online (Sandbox Code Playgroud)

Hpwever,对于完全相同的文件,我收到以下错误TypeError: in method 'Polygonize', argument 1 of type 'GDALRasterBandShadow *'

为什么命令行版本可以工作而python版本不行?

Log*_*ers 5

查找 gdal.Polygonize 调用出现问题的最简单方法是研究该函数的文档。您可以通过 C 算法 API在这里找到它。诚然,GDAL 的文档并不是最连贯且易于访问的。对于 C API 到 Python 的转换来说更是如此。

GDAL多边形化

GDALPolygonize  (GDALRasterBandH    hSrcBand,
                 GDALRasterBandH    hMaskBand,
                 OGRLayerH          hOutLayer,
                 int                iPixValField,
                 char **            papszOptions,
                 GDALProgressFunc   pfnProgress,
                 void *             pProgressArg 
                )
Run Code Online (Sandbox Code Playgroud)

您可以看到前两个参数是 RasterBand 类型。输出类型是 OGRLayer,还有其他(在本例中是不必要的)选项。

要使用,gdal.Polygonize()您需要使用 gdal 打开输入文件,获取光栅波段,并将其传递到函数中。同样,您需要创建一个新的 geojson 矢量文件,并将其图层传递到函数中。

使用subprocess

作为替代方案,您可以使用 python 的subprocess模块来调用您已经知道的相同命令行程序。

import subprocess
import glob
import os

for f in glob.glob("dir/*.asc"): # don't override python's file variable
    out_file = f[:-4] + ".json"
    in_file = os.path.join("dir", f) # need the full path of the input
    cmdline = ['gdal_polygonize.py', in_file, ,"-f", "GeoJSON", out_file]
    subprocess.call(cmdline)
Run Code Online (Sandbox Code Playgroud)