Самый быстрый способ замаскировать растр с помощью полигонов из файла gml

Я создаю сценарий без головы для предварительной обработки изображений 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 в шейп-файл

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, но это не ускоряет работу.

Знаете ли вы, почему такая разница во времени? Можете ли вы предложить способ ускорить растрирование шейп-файла?

Спасибо


person ciskoh    schedule 06.06.2018    source источник


Ответы (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)

Это оказалось намного быстрее, чем все другие найденные решения. Это может быть менее элегантно или «питонически», но пока я не нашел в этом никаких недостатков.

person ciskoh    schedule 11.06.2018