使用gml文件中的多边形屏蔽栅格的最快方法

时间:2018-06-06 10:18:40

标签: python vector raster gdal qgis

我正在构建一个无头脚本来预处理Sentinel图像。有关信息,会话设置如下:

import sys
import os
import qgis
from qgis.core import *
#from PyQt4.QtGui import *

QgsApplication.setPrefixPath("/usr", False)
app = QgsApplication([], False)
app.initQgis()
sys.path.append('/usr/share/qgis/python/plugins')
from processing.core.Processing import Processing
Processing.initialize()
import processing as p

其中一个步骤包括获取提供的云掩码文件(.gml),将其转换为栅格并使用它来掩盖Sentinel映像。 如下:

将gml转换为shapefile

ogr2ogr.main(["","-f", "ESRI Shapefile", "-s_srs", "EPSG:32630", cpv, clMpath])

栅格化云遮罩以获得仅具有0(无云)和1(云)的栅格

# parameters to rasterize
fName=[field.name() for field in QgsVectorLayer(cpv, "cl", "ogr").pendingFields()][0]
p.runalg("gdalogr:rasterize", cpv, fName, 1, 10,10, extImg, False, 5,0,4,75, 6,1,False,0,"-burn 1 -a_srs 'EPSG:32630'",cloudRast)

屏蔽阴天像素

rMaskPath=wod+"clMaskNDVI.tif"
    p.runalg("gdalogr:rastercalculator", img, "1", cloudRast, "1", None, "1", None, "1", None, "1", None, "1", "A*((-1*B)+1)", "", 5, "", rMaskPath)

此操作以交互方式(约1分钟)快速完成,但是当我通过脚本启动它时大约需要40分钟(主要是光栅化多边形图层)。我还尝试过其他方法:直接使用GML文件或grass7模块,但这不会加快操作速度。

你知道为什么会有这样的时间差异吗?你能建议一种加速光栅化shapefile的方法吗?

由于

1 个答案:

答案 0 :(得分:0)

所以解决方案实际上是让Gdal直接处理rastertization:  所以首先我构建一个字符串,遵循标准的gdal语法:

cmd="gdal_rasterize -burn 0 -a_nodata 1000 -a_srs %s -te %s -tr %s %s %s %s" %(imgCrs.authid(), extImg.replace(","," "), cloudRes, cloudRes, cpv, cloudRast)

然后我让系统运行它:

  os.system(cmd)

事实证明,这比其他所有解决方案都要快得多。它可能不那么优雅或者#py; 34#pytonic"但到目前为止,我无法找到任何缺点。