[processing] adapted algorithm to function refactoring

Also set threaded execution to false by default, since it was behaving strangely
This commit is contained in:
Victor Olaya 2013-09-11 19:32:38 +02:00
parent ff5e1ee3a8
commit 236c239844
11 changed files with 116 additions and 178 deletions

View File

@ -16,6 +16,7 @@
* *
***************************************************************************
"""
from processing.tools import dataobjects
__author__ = 'Victor Olaya'
__date__ = 'October 2012'
@ -24,7 +25,6 @@ __copyright__ = '(C) 2012, Victor Olaya'
__revision__ = '$Format:%H$'
import os
from processing.core.QGisLayers import QGisLayers
from processing.parameters.ParameterBoolean import ParameterBoolean
from processing.parameters.ParameterVector import ParameterVector
from processing.core.GeoAlgorithm import GeoAlgorithm
@ -81,7 +81,7 @@ class ImportIntoPostGIS(GeoAlgorithm):
options['overwrite'] = True
layerUri = self.getParameterValue(self.INPUT);
layer = QGisLayers.getObjectFromUri(layerUri)
layer = dataobjects.getObjectFromUri(layerUri)
ret, errMsg = QgsVectorLayerImport.importLayer(layer, uri.uri(), providerName, self.crs, False, False, options)
if ret != 0:
raise GeoAlgorithmExecutionException(u"Error importing to PostGIS\n%s" % errMsg)

View File

@ -24,14 +24,10 @@ __copyright__ = '(C) 2013, Alexander Bruy'
__revision__ = '$Format:%H$'
import math
from PyQt4.QtCore import *
from qgis.core import *
from processing.tools import dataobjects, vector
from processing.core.GeoAlgorithm import GeoAlgorithm
from processing.core.QGisLayers import QGisLayers
from processing.parameters.ParameterVector import ParameterVector
from processing.parameters.ParameterNumber import ParameterNumber
from processing.parameters.ParameterBoolean import ParameterBoolean
@ -58,12 +54,12 @@ class PointsDisplacement(GeoAlgorithm):
horizontal = self.getParameterValue(self.HORIZONTAL)
output = self.getOutputFromName(self.OUTPUT_LAYER)
layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT_LAYER))
layer = dataobjects.getObjectFromUri(self.getParameterValue(self.INPUT_LAYER))
provider = layer.dataProvider()
writer = output.getVectorWriter(provider.fields(), provider.geometryType(), provider.crs())
features = QGisLayers.features(layer)
features = vector.features(layer)
current = 0
total = 100.0 / len(features)

View File

@ -24,21 +24,14 @@ __copyright__ = '(C) 2013, Alexander Bruy'
__revision__ = '$Format:%H$'
from PyQt4.QtCore import *
from osgeo import gdal
from qgis.core import *
from processing.tools import vector, raster, dataobjects
from processing.core.GeoAlgorithm import GeoAlgorithm
from processing.core.QGisLayers import QGisLayers
from processing.parameters.ParameterRaster import ParameterRaster
from processing.parameters.ParameterVector import ParameterVector
from processing.outputs.OutputVector import OutputVector
from processing.algs import QGISUtils as utils
class PointsFromLines(GeoAlgorithm):
INPUT_RASTER = "INPUT_RASTER"
@ -47,7 +40,7 @@ class PointsFromLines(GeoAlgorithm):
OUTPUT_LAYER = "OUTPUT_LAYER"
def defineCharacteristics(self):
self.name = "Points from lines"
self.name = "Get raster values at layer point"
self.group = "Vector geometry tools"
self.addParameter(ParameterRaster(self.INPUT_RASTER, "Raster layer"))
@ -55,7 +48,7 @@ class PointsFromLines(GeoAlgorithm):
self.addOutput(OutputVector(self.OUTPUT_LAYER, "Output layer"))
def processAlgorithm(self, progress):
layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT_VECTOR))
layer = dataobjects.getObjectFromUri(self.getParameterValue(self.INPUT_VECTOR))
rasterPath = unicode(self.getParameterValue(self.INPUT_RASTER))
@ -78,7 +71,7 @@ class PointsFromLines(GeoAlgorithm):
self.pointId = 0
current = 0
features = QGisLayers.features(layer)
features = vector.features(layer)
total = 100.0 / len(features)
for f in features:
geom = f.geometry()
@ -89,8 +82,8 @@ class PointsFromLines(GeoAlgorithm):
p1 = line[i]
p2 = line[i + 1]
x1, y1 = utils.mapToPixel(p1.x(), p1.y(), geoTransform)
x2, y2 = utils.mapToPixel(p2.x(), p2.y(), geoTransform)
x1, y1 = raster.mapToPixel(p1.x(), p1.y(), geoTransform)
x2, y2 = raster.mapToPixel(p2.x(), p2.y(), geoTransform)
self.buildLine(x1, y1, x2, y2, geoTransform, writer, outFeature)
else:
@ -99,8 +92,8 @@ class PointsFromLines(GeoAlgorithm):
p1 = points[i]
p2 = points[i + 1]
x1, y1 = utils.mapToPixel(p1.x(), p1.y(), geoTransform)
x2, y2 = utils.mapToPixel(p2.x(), p2.y(), geoTransform)
x1, y1 = raster.mapToPixel(p1.x(), p1.y(), geoTransform)
x2, y2 = raster.mapToPixel(p2.x(), p2.y(), geoTransform)
self.buildLine(x1, y1, x2, y2, geoTransform, writer, outFeature)
@ -114,7 +107,6 @@ class PointsFromLines(GeoAlgorithm):
def buildLine(self, startX, startY, endX, endY, geoTransform, writer, feature):
point = QgsPoint()
if startX == endX:
if startY > endY:
startY, endY = endY, startY
@ -168,7 +160,7 @@ class PointsFromLines(GeoAlgorithm):
startY += dy2
def createPoint(self, pX, pY, geoTransform, writer, feature):
x, y = utils.pixelToMap(pX, pY, geoTransform)
x, y = raster.pixelToMap(pX, pY, geoTransform)
feature.setGeometry(QgsGeometry.fromPoint(QgsPoint(x, y)))
feature["id"] = self.fid

View File

@ -23,21 +23,15 @@ __copyright__ = '(C) 2013, Alexander Bruy'
# This will get replaced with a git SHA1 when you do a git archive
__revision__ = '$Format:%H$'
from PyQt4.QtCore import *
from osgeo import gdal
from qgis.core import *
from PyQt4.QtCore import *
from processing.core.GeoAlgorithm import GeoAlgorithm
from processing.core.QGisLayers import QGisLayers
from processing.parameters.ParameterRaster import ParameterRaster
from processing.parameters.ParameterVector import ParameterVector
from processing.outputs.OutputVector import OutputVector
from processing.algs import QGISUtils as utils
from processing.tools import dataobjects, vector
from processing.tools.general import *
class PointsFromPolygons(GeoAlgorithm):
@ -55,7 +49,7 @@ class PointsFromPolygons(GeoAlgorithm):
self.addOutput(OutputVector(self.OUTPUT_LAYER, "Output layer"))
def processAlgorithm(self, progress):
layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT_VECTOR))
layer = dataobjects.getObjectFromUri(self.getParameterValue(self.INPUT_VECTOR))
rasterPath = unicode(self.getParameterValue(self.INPUT_RASTER))
@ -79,7 +73,7 @@ class PointsFromPolygons(GeoAlgorithm):
pointId = 0
current = 0
features = QGisLayers.features(layer)
features = vector.features(layer)
total = 100.0 / len(features)
for f in features:
geom = f.geometry()
@ -90,12 +84,12 @@ class PointsFromPolygons(GeoAlgorithm):
yMin = bbox.yMinimum()
yMax = bbox.yMaximum()
startRow, startColumn = utils.mapToPixel(xMin, yMax, geoTransform)
endRow, endColumn = utils.mapToPixel(xMax, yMin, geoTransform)
startRow, startColumn = mapToPixel(xMin, yMax, geoTransform)
endRow, endColumn = mapToPixel(xMax, yMin, geoTransform)
for row in xrange(startRow, endRow + 1):
for col in xrange(startColumn, endColumn + 1):
x, y = utils.pixelToMap(row, col, geoTransform)
x, y = pixelToMap(row, col, geoTransform)
point.setX(x)
point.setY(y)

View File

@ -1,98 +0,0 @@
# -*- coding: utf-8 -*-
"""
***************************************************************************
QGISUtils.py
---------------------
Date : August 2013
Copyright : (C) 2013 by Alexander Bruy
Email : alexander dot bruy at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************
"""
__author__ = 'Alexander Bruy'
__date__ = 'August 2013'
__copyright__ = '(C) 2013, Alexander Bruy'
# This will get replaced with a git SHA1 when you do a git archive
__revision__ = '$Format:%H$'
import math
from PyQt4.QtCore import *
from qgis.core import *
def mapToPixel(mX, mY, geoTransform):
'''Convert map coordinates to pixel coordinates.
@param mX Input map X coordinate (double)
@param mY Input map Y coordinate (double)
@param geoTransform Input geotransform (six doubles)
@return pX, pY Output coordinates (two doubles)
'''
if geoTransform[2] + geoTransform[4] == 0:
pX = (mX - geoTransform[0]) / geoTransform[1]
pY = (mY - geoTransform[3]) / geoTransform[5]
else:
pX, pY = applyGeoTransform(mX, mY, invertGeoTransform(geoTransform))
return int(pX), int(pY)
def pixelToMap(pX, pY, geoTransform):
'''Convert pixel coordinates to map coordinates.
@param pX Input pixel X coordinate (double)
@param pY Input pixel Y coordinate (double)
@param geoTransform Input geotransform (six doubles)
@return mX, mY Output coordinates (two doubles)
'''
mX, mY = applyGeoTransform(pX + 0.5, pY + 0.5, geoTransform)
return mX, mY
def applyGeoTransform(inX, inY, geoTransform):
'''Apply a geotransform to coordinates.
@param inX Input coordinate (double)
@param inY Input coordinate (double)
@param geoTransform Input geotransform (six doubles)
@return outX, outY Output coordinates (two doubles)
'''
outX = geoTransform[0] + inX * geoTransform[1] + inY * geoTransform[2]
outY = geoTransform[3] + inX * geoTransform[4] + inY * geoTransform[5]
return outX, outY
def invertGeoTransform(geoTransform):
'''Invert standard 3x2 set of geotransform coefficients.
@param geoTransform Input GeoTransform (six doubles - unaltered)
@return outGeoTransform Output GeoTransform (six doubles - updated)
on success, None if the equation is uninvertable
'''
# we assume a 3rd row that is [1 0 0]
# compute determinate
det = geoTransform[1] * geoTransform[5] - geoTransform[2] * geoTransform[4]
if abs(det) < 0.000000000000001:
return
invDet = 1.0 / det
# compute adjoint and divide by determinate
outGeoTransform = [0, 0, 0, 0, 0, 0]
outGeoTransform[1] = geoTransform[5] * invDet
outGeoTransform[4] = -geoTransform[4] * invDet
outGeoTransform[2] = -geoTransform[2] * invDet
outGeoTransfrom[5] = geoTransform[1] * invDet
outGeoTransform[0] = (geoTransform[2] * geoTransform[3] - geoTransform[0] * geoTransform[5]) * invDet
outGeoTransform[3] = (-geoTransform[1] * geoTransform[3] + geoTransform[0] * geoTransform[4]) * invDet
return outGeoTransform

View File

@ -24,26 +24,19 @@ __copyright__ = '(C) 2013, Alexander Bruy'
__revision__ = '$Format:%H$'
from PyQt4.QtCore import *
import numpy
from osgeo import gdal, ogr, osr
from qgis.core import *
from processing.tools.raster import mapToPixel
from processing.tools import dataobjects, vector
from processing.core.GeoAlgorithm import GeoAlgorithm
from processing.core.QGisLayers import QGisLayers
from processing.parameters.ParameterVector import ParameterVector
from processing.parameters.ParameterRaster import ParameterRaster
from processing.parameters.ParameterString import ParameterString
from processing.parameters.ParameterNumber import ParameterNumber
from processing.parameters.ParameterBoolean import ParameterBoolean
from processing.outputs.OutputVector import OutputVector
from processing.algs.ftools import FToolsUtils as ftools_utils
from processing.algs import QGISUtils as utils
class ZonalStatistics(GeoAlgorithm):
INPUT_RASTER = "INPUT_RASTER"
@ -65,7 +58,7 @@ class ZonalStatistics(GeoAlgorithm):
self.addOutput(OutputVector(self.OUTPUT_LAYER, "Output layer"))
def processAlgorithm(self, progress):
layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT_VECTOR))
layer = dataobjects.getObjectFromUri(self.getParameterValue(self.INPUT_VECTOR))
rasterPath = unicode(self.getParameterValue(self.INPUT_RASTER))
bandNumber = self.getParameterValue(self.RASTER_BAND)
@ -99,8 +92,8 @@ class ZonalStatistics(GeoAlgorithm):
yMin = rasterBBox.yMinimum()
yMax = rasterBBox.yMaximum()
startColumn, startRow = utils.mapToPixel(xMin, yMax, geoTransform)
endColumn, endRow = utils.mapToPixel(xMax, yMin, geoTransform)
startColumn, startRow = mapToPixel(xMin, yMax, geoTransform)
endColumn, endRow = mapToPixel(xMax, yMin, geoTransform)
width = endColumn - startColumn
height = endRow - startRow
@ -120,15 +113,15 @@ class ZonalStatistics(GeoAlgorithm):
memRasterDriver = gdal.GetDriverByName("MEM")
fields = layer.pendingFields()
idxMin, fields = ftools_utils.findOrCreateField(layer, fields, columnPrefix + "min", 21, 6)
idxMax, fields = ftools_utils.findOrCreateField(layer, fields, columnPrefix + "max", 21, 6)
idxSum, fields = ftools_utils.findOrCreateField(layer, fields, columnPrefix + "sum", 21, 6)
idxCount, fields = ftools_utils.findOrCreateField(layer, fields, columnPrefix + "count", 21, 6)
idxMean, fields = ftools_utils.findOrCreateField(layer, fields, columnPrefix + "mean", 21, 6)
idxStd, fields = ftools_utils.findOrCreateField(layer, fields, columnPrefix + "std", 21, 6)
idxUnique, fields = ftools_utils.findOrCreateField(layer, fields, columnPrefix + "unique", 21, 6)
idxRange, fields = ftools_utils.findOrCreateField(layer, fields, columnPrefix + "range", 21, 6)
idxCV, fields = ftools_utils.findOrCreateField(layer, fields, columnPrefix + "cv", 21, 6)
idxMin, fields = vector.findOrCreateField(layer, fields, columnPrefix + "min", 21, 6)
idxMax, fields = vector.findOrCreateField(layer, fields, columnPrefix + "max", 21, 6)
idxSum, fields = vector.findOrCreateField(layer, fields, columnPrefix + "sum", 21, 6)
idxCount, fields = vector.findOrCreateField(layer, fields, columnPrefix + "count", 21, 6)
idxMean, fields = vector.findOrCreateField(layer, fields, columnPrefix + "mean", 21, 6)
idxStd, fields = vector.findOrCreateField(layer, fields, columnPrefix + "std", 21, 6)
idxUnique, fields = vector.findOrCreateField(layer, fields, columnPrefix + "unique", 21, 6)
idxRange, fields = vector.findOrCreateField(layer, fields, columnPrefix + "range", 21, 6)
idxCV, fields = vector.findOrCreateField(layer, fields, columnPrefix + "cv", 21, 6)
#idxMedian, fields = ftools_utils.findOrCreateField(layer, fields, columnPrefix + "median", 21, 6)
writer = self.getOutputFromName(self.OUTPUT_LAYER).getVectorWriter(fields.toList(),
@ -140,7 +133,7 @@ class ZonalStatistics(GeoAlgorithm):
outFeat.setFields(fields)
current = 0
features = QGisLayers.features(layer)
features = vector.features(layer)
total = 100.0 / len(features)
for f in features:
geom = f.geometry()
@ -156,8 +149,8 @@ class ZonalStatistics(GeoAlgorithm):
yMin = bbox.yMinimum()
yMax = bbox.yMaximum()
startColumn, startRow = utils.mapToPixel(xMin, yMax, geoTransform)
endColumn, endRow = utils.mapToPixel(xMax, yMin, geoTransform)
startColumn, startRow = mapToPixel(xMin, yMax, geoTransform)
endColumn, endRow = mapToPixel(xMax, yMin, geoTransform)
width = endColumn - startColumn
height = endRow - startRow

View File

@ -143,7 +143,7 @@ class PointDistance(GeoAlgorithm):
first = True
current = 0
features = QGisLayers.features(inLayer)
features = vector.features(inLayer)
total = 100.0 / float(len(features))
for inFeat in features:

View File

@ -54,8 +54,8 @@ class ProcessingConfig():
def initialize():
icon = QtGui.QIcon(os.path.dirname(__file__) + "/../images/alg.png")
ProcessingConfig.settingIcons["General"] = icon
ProcessingConfig.addSetting(Setting("General", ProcessingConfig.USE_THREADS, "Run algorithms in a new thread", True))
ProcessingConfig.addSetting(Setting("General", ProcessingConfig.SHOW_DEBUG_IN_DIALOG, "Show extra info in Log panel (threaded execution only)", True))
ProcessingConfig.addSetting(Setting("General", ProcessingConfig.USE_THREADS, "Run algorithms in a new thread (unstable)", False))
ProcessingConfig.addSetting(Setting("General", ProcessingConfig.SHOW_DEBUG_IN_DIALOG, "Show extra info in Log panel", True))
ProcessingConfig.addSetting(Setting("General", ProcessingConfig.KEEP_DIALOG_OPEN, "Keep dialog open after running an algorithm", False))
ProcessingConfig.addSetting(Setting("General", ProcessingConfig.USE_SELECTED, "Use only selected features", True))
ProcessingConfig.addSetting(Setting("General", ProcessingConfig.TABLE_LIKE_PARAM_PANEL, "Show table-like parameter panels", False))

View File

@ -5,14 +5,11 @@
##Output_table=output table
import os
from processing.raster import *
from osgeo import gdal, ogr, osr
from processing.core.TableWriter import TableWriter
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
from processing.algs import QGISUtils as utils
raster = gdal.Open(Input_raster)
rasterBaseName = os.path.splitext(os.path.basename(Input_raster))[0]
@ -81,7 +78,7 @@ for i in xrange(bandCount):
pnt = coordTransform.TransformPoint(x, y, 0)
x = pnt[0]
y = pnt[1]
rX, rY = utils.mapToPixel(x, y, geoTransform)
rX, rY = raster.mapToPixel(x, y, geoTransform)
if rX > rasterXSize or rY > rasterYSize:
feature = layer.GetNextFeature()
continue

View File

@ -5,12 +5,9 @@
##Output_layer=output vector
import os
from osgeo import gdal, ogr, osr
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
from processing.algs import QGISUtils as utils
from processing.tools.raster import mapToPixel
raster = gdal.Open(Input_raster)
@ -104,7 +101,7 @@ for i in xrange(bandCount):
pnt = coordTransform.TransformPoint(x, y, 0)
x = pnt[0]
y = pnt[1]
rX, rY = utils.mapToPixel(x, y, geoTransform)
rX, rY = mapToPixel(x, y, geoTransform)
if rX > rasterXSize or rY > rasterYSize:
feature = layer.GetNextFeature()
continue

View File

@ -5,7 +5,7 @@
raster.py
---------------------
Date : February 2013
Copyright : (C) 2013 by Victor Olaya
Copyright : (C) 2013 by Victor Olaya and Alexander Bruy
Email : volayaf at gmail dot com
***************************************************************************
* *
@ -17,9 +17,9 @@
***************************************************************************
"""
__author__ = 'Victor Olaya'
__author__ = 'Victor Olaya and Alexander Bruy'
__date__ = 'February 2013'
__copyright__ = '(C) 2013, Victor Olaya'
__copyright__ = '(C) 2013, Victor Olaya and Alexander Bruy'
# This will get replaced with a git SHA1 when you do a git archive
__revision__ = '$Format:%H$'
@ -40,3 +40,70 @@ def scanraster(layer, progress):
if value == nodata:
value = None
yield value
def mapToPixel(mX, mY, geoTransform):
'''Convert map coordinates to pixel coordinates.
@param mX Input map X coordinate (double)
@param mY Input map Y coordinate (double)
@param geoTransform Input geotransform (six doubles)
@return pX, pY Output coordinates (two doubles)
'''
if geoTransform[2] + geoTransform[4] == 0:
pX = (mX - geoTransform[0]) / geoTransform[1]
pY = (mY - geoTransform[3]) / geoTransform[5]
else:
pX, pY = applyGeoTransform(mX, mY, invertGeoTransform(geoTransform))
return int(pX), int(pY)
def pixelToMap(pX, pY, geoTransform):
'''Convert pixel coordinates to map coordinates.
@param pX Input pixel X coordinate (double)
@param pY Input pixel Y coordinate (double)
@param geoTransform Input geotransform (six doubles)
@return mX, mY Output coordinates (two doubles)
'''
mX, mY = applyGeoTransform(pX + 0.5, pY + 0.5, geoTransform)
return mX, mY
def applyGeoTransform(inX, inY, geoTransform):
'''Apply a geotransform to coordinates.
@param inX Input coordinate (double)
@param inY Input coordinate (double)
@param geoTransform Input geotransform (six doubles)
@return outX, outY Output coordinates (two doubles)
'''
outX = geoTransform[0] + inX * geoTransform[1] + inY * geoTransform[2]
outY = geoTransform[3] + inX * geoTransform[4] + inY * geoTransform[5]
return outX, outY
def invertGeoTransform(geoTransform):
'''Invert standard 3x2 set of geotransform coefficients.
@param geoTransform Input GeoTransform (six doubles - unaltered)
@return outGeoTransform Output GeoTransform (six doubles - updated)
on success, None if the equation is uninvertable
'''
# we assume a 3rd row that is [1 0 0]
# compute determinate
det = geoTransform[1] * geoTransform[5] - geoTransform[2] * geoTransform[4]
if abs(det) < 0.000000000000001:
return
invDet = 1.0 / det
# compute adjoint and divide by determinate
outGeoTransform = [0, 0, 0, 0, 0, 0]
outGeoTransform[1] = geoTransform[5] * invDet
outGeoTransform[4] = -geoTransform[4] * invDet
outGeoTransform[2] = -geoTransform[2] * invDet
outGeoTransform[5] = geoTransform[1] * invDet
outGeoTransform[0] = (geoTransform[2] * geoTransform[3] - geoTransform[0] * geoTransform[5]) * invDet
outGeoTransform[3] = (-geoTransform[1] * geoTransform[3] + geoTransform[0] * geoTransform[4]) * invDet
return outGeoTransform