【问题标题】:Quickest way to mask raster using polygons from gml file使用 gml 文件中的多边形遮罩栅格的最快方法
【发布时间】:2018-06-11 17:39:23
【问题描述】:

我正在构建一个无头脚本来预处理 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 的栅格化吗?

谢谢

【问题讨论】:

    标签: python vector raster gdal qgis


    【解决方案1】:

    所以解决方案实际上是让 Gdal 直接处理光栅化: 所以首先我按照标准 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)
    

    事实证明,这比找到的所有其他解决方案都要快得多。它可能不那么优雅或“pytonic”,但到目前为止我找不到任何缺点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 2018-02-06
      • 2010-12-05
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      • 2016-12-13
      相关资源
      最近更新 更多