使用 gml 文件中的多边形屏蔽栅格的最快方法
Quickest way to mask raster using polygons from gml file
我正在构建一个无头脚本来预处理 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 栅格化的方法吗?
谢谢
所以解决方案实际上是让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" 但到目前为止我找不到任何缺点。
我正在构建一个无头脚本来预处理 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 栅格化的方法吗?
谢谢
所以解决方案实际上是让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" 但到目前为止我找不到任何缺点。