| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,77 @@ | ||
| # -*- coding: utf-8 -*- | ||
|
|
||
| """ | ||
| *************************************************************************** | ||
| RasterLayerHistogram.py | ||
| --------------------- | ||
| Date : January 2013 | ||
| Copyright : (C) 2013 by Victor Olaya | ||
| Email : volayaf 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__ = 'Victor Olaya' | ||
| __date__ = 'January 2013' | ||
| __copyright__ = '(C) 2013, Victor Olaya' | ||
| # This will get replaced with a git SHA1 when you do a git archive | ||
| __revision__ = '$Format:%H$' | ||
|
|
||
| from sextante.outputs.OutputTable import OutputTable | ||
| import matplotlib.pyplot as plt | ||
| import matplotlib.pylab as lab | ||
| from PyQt4.QtCore import * | ||
| from qgis.core import * | ||
| from sextante.core.GeoAlgorithm import GeoAlgorithm | ||
| from sextante.outputs.OutputHTML import OutputHTML | ||
| from sextante.core.QGisLayers import QGisLayers | ||
| from sextante.parameters.ParameterNumber import ParameterNumber | ||
| from sextante.parameters.ParameterRaster import ParameterRaster | ||
| from sextante.tools import raster | ||
|
|
||
| class RasterLayerHistogram(GeoAlgorithm): | ||
|
|
||
| INPUT = "INPUT" | ||
| PLOT = "PLOT" | ||
| TABLE = "TABLE" | ||
| BINS = "BINS" | ||
|
|
||
|
|
||
| def processAlgorithm(self, progress): | ||
| uri = self.getParameterValue(self.INPUT) | ||
| layer = QGisLayers.getObjectFromUri(uri) | ||
| outputplot = self.getOutputValue(self.PLOT) | ||
| outputtable = self.getOutputFromName(self.TABLE) | ||
| values = raster.scanraster(layer, progress) | ||
| nbins = self.getParameterValue(self.BINS) | ||
| #ALERT:this is potentially blocking if the layer is too big | ||
| plt.close() | ||
| valueslist = [] | ||
| for v in values: | ||
| if v is not None: | ||
| valueslist.append(v) | ||
| n, bins, values = plt.hist(valueslist, nbins) | ||
| fields = [QgsField("CENTER_VALUE", QVariant.Double), QgsField("NUM_ELEM", QVariant.Double)] | ||
| writer = outputtable.getTableWriter(fields) | ||
| for i in xrange(len(values)): | ||
| writer.addRecord([str(bins[i]) + "-" + str(bins[i+1]) , n[i]]) | ||
| plotFilename = outputplot +".png" | ||
| lab.savefig(plotFilename) | ||
| f = open(outputplot, "w") | ||
| f.write("<img src=\"" + plotFilename + "\"/>") | ||
| f.close() | ||
|
|
||
| def defineCharacteristics(self): | ||
| self.name = "Raster layer histogram" | ||
| self.group = "Graphics" | ||
| self.addParameter(ParameterRaster(self.INPUT, "Input layer")) | ||
| self.addParameter(ParameterNumber(self.BINS, "Number of bins", 2, None, 10)) | ||
| self.addOutput(OutputHTML(self.PLOT, "Output plot")) | ||
| self.addOutput(OutputTable(self.TABLE, "Output table")) | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,120 @@ | ||
| # -*- coding: utf-8 -*- | ||
|
|
||
| """ | ||
| *************************************************************************** | ||
| RasterLayerStatistics.py | ||
| --------------------- | ||
| Date : January 2013 | ||
| Copyright : (C) 2013 by Victor Olaya | ||
| Email : volayaf 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__ = 'Victor Olaya' | ||
| __date__ = 'January 2013' | ||
| __copyright__ = '(C) 2013, Victor Olaya' | ||
| # 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 * | ||
| from sextante.core.GeoAlgorithm import GeoAlgorithm | ||
| from sextante.core.QGisLayers import QGisLayers | ||
| from sextante.parameters.ParameterRaster import ParameterRaster | ||
| from sextante.tools import raster | ||
| from sextante.outputs.OutputNumber import OutputNumber | ||
| from sextante.outputs.OutputHTML import OutputHTML | ||
|
|
||
| class RasterLayerStatistics(GeoAlgorithm): | ||
|
|
||
| INPUT = "INPUT" | ||
|
|
||
| MIN = "MIN" | ||
| MAX = "MAX" | ||
| SUM = "SUM" | ||
| MEAN = "MEAN" | ||
| COUNT = "COUNT" | ||
| NO_DATA_COUNT = "NO_DATA_COUNT" | ||
| STD_DEV = "STD_DEV" | ||
| OUTPUT_HTML_FILE = "OUTPUT_HTML_FILE" | ||
|
|
||
| def processAlgorithm(self, progress): | ||
| outputFile = self.getOutputValue(self.OUTPUT_HTML_FILE) | ||
| uri = self.getParameterValue(self.INPUT) | ||
| layer = QGisLayers.getObjectFromUri(uri) | ||
| values = raster.scanraster(layer, progress) | ||
|
|
||
| n = 0 | ||
| nodata = 0 | ||
| mean = 0 | ||
| M2 = 0 | ||
| sum = 0 | ||
| minvalue = None | ||
| maxvalue = None | ||
|
|
||
| for v in values: | ||
| if v is not None: | ||
| sum += v | ||
| n = n + 1 | ||
| delta = v - mean | ||
| mean = mean + delta/n | ||
| M2 = M2 + delta*(v - mean) | ||
| if minvalue is None: | ||
| minvalue = v | ||
| maxvalue = v | ||
| else: | ||
| minvalue = min(v, minvalue) | ||
| maxvalue = max(v, maxvalue) | ||
| else: | ||
| nodata += 1 | ||
|
|
||
| variance = M2/(n - 1) | ||
| stddev = math.sqrt(variance) | ||
|
|
||
| data = [] | ||
| data.append("Valid cells: " + unicode(n)) | ||
| data.append("No-data cells: " + unicode(nodata)) | ||
| data.append("Minimum value: " + unicode(minvalue)) | ||
| data.append("Maximum value: " + unicode(maxvalue)) | ||
| data.append("Sum: " + unicode(sum)) | ||
| data.append("Mean value: " + unicode(mean)) | ||
| data.append("Standard deviation: " + unicode(stddev)) | ||
|
|
||
| self.createHTML(outputFile, data) | ||
|
|
||
| self.setOutputValue(self.COUNT, n) | ||
| self.setOutputValue(self.NO_DATA_COUNT, nodata) | ||
| self.setOutputValue(self.MIN, minvalue) | ||
| self.setOutputValue(self.MAX, maxvalue) | ||
| self.setOutputValue(self.SUM, sum) | ||
| self.setOutputValue(self.MEAN, mean) | ||
| self.setOutputValue(self.STD_DEV, stddev) | ||
|
|
||
|
|
||
| def defineCharacteristics(self): | ||
| self.name = "Raster layer statistics" | ||
| self.group = "Raster tools" | ||
| self.addParameter(ParameterRaster(self.INPUT, "Input layer")) | ||
| self.addOutput(OutputHTML(self.OUTPUT_HTML_FILE, "Statistics")) | ||
| self.addOutput(OutputNumber(self.MIN, "Minimum value")) | ||
| self.addOutput(OutputNumber(self.MAX, "Maximum value")) | ||
| self.addOutput(OutputNumber(self.SUM, "Sum")) | ||
| self.addOutput(OutputNumber(self.MEAN, "Mean value")) | ||
| self.addOutput(OutputNumber(self.COUNT, "valid cells count")) | ||
| self.addOutput(OutputNumber(self.COUNT, "No-data cells count")) | ||
| self.addOutput(OutputNumber(self.STD_DEV, "Standard deviation")) | ||
|
|
||
| def createHTML(self, outputFile, algData): | ||
| f = open(outputFile, "w") | ||
| for s in algData: | ||
| f.write("<p>" + str(s) + "</p>") | ||
| f.close() |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,82 @@ | ||
| # -*- coding: utf-8 -*- | ||
|
|
||
| """ | ||
| *************************************************************************** | ||
| StatisticsByCategories.py | ||
| --------------------- | ||
| Date : September 2012 | ||
| Copyright : (C) 2012 by Victor Olaya | ||
| Email : volayaf 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. * | ||
| * * | ||
| *************************************************************************** | ||
| """ | ||
| import math | ||
|
|
||
| __author__ = 'Victor Olaya' | ||
| __date__ = 'September 2012' | ||
| __copyright__ = '(C) 2012, Victor Olaya' | ||
| # This will get replaced with a git SHA1 when you do a git archive | ||
| __revision__ = '$Format:%H$' | ||
|
|
||
| from PyQt4.QtCore import * | ||
| from qgis.core import * | ||
| from scipy import stats | ||
| from sextante.outputs.OutputTable import OutputTable | ||
| from sextante.core.GeoAlgorithm import GeoAlgorithm | ||
| from sextante.core.QGisLayers import QGisLayers | ||
| from sextante.parameters.ParameterVector import ParameterVector | ||
| from sextante.parameters.ParameterTableField import ParameterTableField | ||
|
|
||
| class StatisticsByCategories(GeoAlgorithm): | ||
|
|
||
| INPUT_LAYER = "INPUT_LAYER" | ||
| VALUES_FIELD_NAME = "VALUES_FIELD_NAME" | ||
| CATEGORIES_FIELD_NAME = "CATEGORIES_FIELD_NAME" | ||
| OUTPUT = "OUTPUT" | ||
|
|
||
| def defineCharacteristics(self): | ||
| self.name = "Statistics by categories" | ||
| self.group = "Vector table tools" | ||
|
|
||
| self.addParameter(ParameterVector(self.INPUT_LAYER, "Input vector layer", ParameterVector.VECTOR_TYPE_ANY, False)) | ||
| self.addParameter(ParameterTableField(self.VALUES_FIELD_NAME, "Field to calculate statistics on", | ||
| self.INPUT_LAYER, ParameterTableField.DATA_TYPE_NUMBER)) | ||
| self.addParameter(ParameterTableField(self.CATEGORIES_FIELD_NAME, "Field with categories", | ||
| self.INPUT_LAYER, ParameterTableField.DATA_TYPE_ANY)) | ||
|
|
||
| self.addOutput(OutputTable(self.OUTPUT, "Statistics for numeric field")) | ||
|
|
||
| def processAlgorithm(self, progress): | ||
| layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT_LAYER)) | ||
| valuesFieldName = self.getParameterValue(self.VALUES_FIELD_NAME) | ||
| categoriesFieldName = self.getParameterValue(self.CATEGORIES_FIELD_NAME) | ||
|
|
||
| output = self.getOutputFromName(self.OUTPUT) | ||
| valuesField = layer.fieldNameIndex(valuesFieldName) | ||
| categoriesField = layer.fieldNameIndex(categoriesFieldName) | ||
|
|
||
| features = QGisLayers.features(layer) | ||
| nFeat = len(features) | ||
| values = {} | ||
| for feat in features: | ||
| attrs = feat.attributes() | ||
| value = float(attrs[valuesField].toDouble()[0]) | ||
| cat = unicode(attrs[categoriesField].toString()) | ||
| if cat not in values: | ||
| values[cat] = [] | ||
| values[cat].append(value) | ||
|
|
||
| fields = [QgsField("category", QVariant.String), QgsField("mean", QVariant.Double), QgsField("variance", QVariant.Double)] | ||
| writer = output.getTableWriter(fields) | ||
| for cat, value in values.items(): | ||
| n, min_max, mean, var, skew, kurt = stats.describe(value) | ||
| record = [cat, mean, math.sqrt(var)] | ||
| writer.addRecord(record) | ||
|
|
||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,68 @@ | ||
| # -*- coding: utf-8 -*- | ||
|
|
||
| """ | ||
| *************************************************************************** | ||
| EquivalentNumField.py | ||
| --------------------- | ||
| Date : January 2013 | ||
| Copyright : (C) 2013 by Victor Olaya | ||
| Email : volayaf 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__ = 'Victor Olaya' | ||
| __date__ = 'January 2013' | ||
| __copyright__ = '(C) 2013, Victor Olaya' | ||
| # This will get replaced with a git SHA1 when you do a git archive | ||
| __revision__ = '$Format:%H$' | ||
|
|
||
| import matplotlib.pyplot as plt | ||
| import matplotlib.pylab as lab | ||
| from PyQt4.QtCore import * | ||
| from qgis.core import * | ||
| from sextante.parameters.ParameterVector import ParameterVector | ||
| from sextante.parameters.ParameterTableField import ParameterTableField | ||
| from sextante.core.GeoAlgorithm import GeoAlgorithm | ||
| from sextante.outputs.OutputHTML import OutputHTML | ||
| from sextante.tools import * | ||
| from sextante.core.QGisLayers import QGisLayers | ||
| from sextante.parameters.ParameterNumber import ParameterNumber | ||
|
|
||
| class VectorLayerHistogram(GeoAlgorithm): | ||
|
|
||
| INPUT = "INPUT" | ||
| OUTPUT = "OUTPUT" | ||
| FIELD = "FIELD" | ||
| BINS = "BINS" | ||
|
|
||
|
|
||
| def processAlgorithm(self, progress): | ||
| uri = self.getParameterValue(self.INPUT) | ||
| layer = QGisLayers.getObjectFromUri(uri) | ||
| fieldname = self.getParameterValue(self.FIELD) | ||
| output = self.getOutputValue(self.OUTPUT) | ||
| values = vector.getAttributeValues(layer, fieldname) | ||
| plt.close() | ||
| bins = self.getParameterValue(self.BINS) | ||
| plt.hist(values[fieldname], bins) | ||
| plotFilename = output +".png" | ||
| lab.savefig(plotFilename) | ||
| f = open(output, "w") | ||
| f.write("<img src=\"" + plotFilename + "\"/>") | ||
| f.close() | ||
|
|
||
| def defineCharacteristics(self): | ||
| self.name = "Vector layer histogram" | ||
| self.group = "Graphics" | ||
| self.addParameter(ParameterVector(self.INPUT, "Input layer", ParameterVector.VECTOR_TYPE_ANY)) | ||
| self.addParameter(ParameterTableField(self.FIELD, "Attribute", self.INPUT,ParameterTableField.DATA_TYPE_NUMBER)) | ||
| self.addParameter(ParameterNumber(self.BINS, "number of bins", 2, None, 10)) | ||
| self.addOutput(OutputHTML(self.OUTPUT, "Output")) | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,69 @@ | ||
| # -*- coding: utf-8 -*- | ||
|
|
||
| """ | ||
| *************************************************************************** | ||
| EquivalentNumField.py | ||
| --------------------- | ||
| Date : January 2013 | ||
| Copyright : (C) 2013 by Victor Olaya | ||
| Email : volayaf 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. * | ||
| * * | ||
| *************************************************************************** | ||
| """ | ||
| from sextante.parameters.ParameterNumber import ParameterNumber | ||
|
|
||
| __author__ = 'Victor Olaya' | ||
| __date__ = 'January 2013' | ||
| __copyright__ = '(C) 2013, Victor Olaya' | ||
| # This will get replaced with a git SHA1 when you do a git archive | ||
| __revision__ = '$Format:%H$' | ||
|
|
||
| import matplotlib.pyplot as plt | ||
| import matplotlib.pylab as lab | ||
| from PyQt4.QtCore import * | ||
| from qgis.core import * | ||
| from sextante.parameters.ParameterVector import ParameterVector | ||
| from sextante.parameters.ParameterTableField import ParameterTableField | ||
| from sextante.core.GeoAlgorithm import GeoAlgorithm | ||
| from sextante.outputs.OutputHTML import OutputHTML | ||
| from sextante.tools import * | ||
| from sextante.core.QGisLayers import QGisLayers | ||
|
|
||
| class VectorLayerScatterplot(GeoAlgorithm): | ||
|
|
||
| INPUT = "INPUT" | ||
| OUTPUT = "OUTPUT" | ||
| XFIELD = "XFIELD" | ||
| YFIELD = "YFIELD" | ||
|
|
||
|
|
||
| def processAlgorithm(self, progress): | ||
| uri = self.getParameterValue(self.INPUT) | ||
| layer = QGisLayers.getObjectFromUri(uri) | ||
| xfieldname = self.getParameterValue(self.YFIELD) | ||
| yfieldname = self.getParameterValue(self.XFIELD) | ||
| output = self.getOutputValue(self.OUTPUT) | ||
| values = vector.getAttributeValues(layer, xfieldname, yfieldname) | ||
| plt.close() | ||
|
|
||
| plt.scatter(values[xfieldname], values[yfieldname]) | ||
| plotFilename = output +".png" | ||
| lab.savefig(plotFilename) | ||
| f = open(output, "w") | ||
| f.write("<img src=\"" + plotFilename + "\"/>") | ||
| f.close() | ||
|
|
||
| def defineCharacteristics(self): | ||
| self.name = "Vector layer scatterplot" | ||
| self.group = "Graphics" | ||
| self.addParameter(ParameterVector(self.INPUT, "Input layer", ParameterVector.VECTOR_TYPE_ANY)) | ||
| self.addParameter(ParameterTableField(self.XFIELD, "X attribute", self.INPUT,ParameterTableField.DATA_TYPE_NUMBER)) | ||
| self.addParameter(ParameterTableField(self.YFIELD, "Y attribute", self.INPUT,ParameterTableField.DATA_TYPE_NUMBER)) | ||
| self.addOutput(OutputHTML(self.OUTPUT, "Output")) | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,2 @@ | ||
| from sextante.tools.vector import getAttributeValues | ||
| from sextante.tools.raster import scanraster |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
| from osgeo import gdal | ||
| from gdalconst import * | ||
| import struct | ||
|
|
||
| def scanraster(layer, progress): | ||
| filename = unicode(layer.source()) | ||
| dataset = gdal.Open(filename, GA_ReadOnly) | ||
| band = dataset.GetRasterBand(1) | ||
| nodata = band.GetNoDataValue() | ||
| for y in xrange(band.YSize): | ||
| progress.setPercentage(y / float(band.YSize) * 100) | ||
| scanline = band.ReadRaster(0, y, band.XSize, 1,band.XSize, 1, band.DataType) | ||
| values = struct.unpack('f' * band.XSize, scanline) | ||
| for value in values: | ||
| if value == nodata: | ||
| value = None | ||
| yield value |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,21 @@ | ||
| from sextante.core.QGisLayers import QGisLayers | ||
|
|
||
|
|
||
| def getAttributeValues(layer, *attributeNames): | ||
| ret = {} | ||
| for name in attributeNames: | ||
| values = [] | ||
| features = QGisLayers.features(layer) | ||
| index = layer.fieldNameIndex(name) | ||
| if index == -1: | ||
| raise ValueError('Wrong field name') | ||
| for feature in features: | ||
| try: | ||
| v = float(feature.attributes()[index].toString()) | ||
| values.append(v) | ||
| except: | ||
| values.append(None) | ||
| ret[name] = values; | ||
| return ret | ||
|
|
||
|
|