diff --git a/python/plugins/processing/admintools/ImportIntoPostGIS.py b/python/plugins/processing/admintools/ImportIntoPostGIS.py index 2702a6bbe87..dba093d0eaa 100644 --- a/python/plugins/processing/admintools/ImportIntoPostGIS.py +++ b/python/plugins/processing/admintools/ImportIntoPostGIS.py @@ -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) diff --git a/python/plugins/processing/algs/PointsDisplacement.py b/python/plugins/processing/algs/PointsDisplacement.py index b4563ab6e0f..ee5e02e71aa 100644 --- a/python/plugins/processing/algs/PointsDisplacement.py +++ b/python/plugins/processing/algs/PointsDisplacement.py @@ -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) diff --git a/python/plugins/processing/algs/PointsFromLines.py b/python/plugins/processing/algs/PointsFromLines.py index 0414775b0e6..26d88b6cee4 100644 --- a/python/plugins/processing/algs/PointsFromLines.py +++ b/python/plugins/processing/algs/PointsFromLines.py @@ -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 diff --git a/python/plugins/processing/algs/PointsFromPolygons.py b/python/plugins/processing/algs/PointsFromPolygons.py index caa1c419d6d..4d53c0ba1d5 100644 --- a/python/plugins/processing/algs/PointsFromPolygons.py +++ b/python/plugins/processing/algs/PointsFromPolygons.py @@ -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) diff --git a/python/plugins/processing/algs/QGISUtils.py b/python/plugins/processing/algs/QGISUtils.py deleted file mode 100644 index a802788a643..00000000000 --- a/python/plugins/processing/algs/QGISUtils.py +++ /dev/null @@ -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 diff --git a/python/plugins/processing/algs/ZonalStatistics.py b/python/plugins/processing/algs/ZonalStatistics.py index 61807e459ac..05c21edec39 100644 --- a/python/plugins/processing/algs/ZonalStatistics.py +++ b/python/plugins/processing/algs/ZonalStatistics.py @@ -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 diff --git a/python/plugins/processing/algs/ftools/PointDistance.py b/python/plugins/processing/algs/ftools/PointDistance.py index b59ca43b495..2e64b79bb7b 100644 --- a/python/plugins/processing/algs/ftools/PointDistance.py +++ b/python/plugins/processing/algs/ftools/PointDistance.py @@ -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: diff --git a/python/plugins/processing/core/ProcessingConfig.py b/python/plugins/processing/core/ProcessingConfig.py index 331627a26c0..62adcf302ca 100644 --- a/python/plugins/processing/core/ProcessingConfig.py +++ b/python/plugins/processing/core/ProcessingConfig.py @@ -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)) diff --git a/python/plugins/processing/script/scripts/Extract_raster_values_to_CSV.py b/python/plugins/processing/script/scripts/Extract_raster_values_to_CSV.py index de36cce01ec..a1e9b5b9a56 100644 --- a/python/plugins/processing/script/scripts/Extract_raster_values_to_CSV.py +++ b/python/plugins/processing/script/scripts/Extract_raster_values_to_CSV.py @@ -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 diff --git a/python/plugins/processing/script/scripts/Extract_raster_values_to_shapefile.py b/python/plugins/processing/script/scripts/Extract_raster_values_to_shapefile.py index 6b270b86779..cc3c8900ef8 100644 --- a/python/plugins/processing/script/scripts/Extract_raster_values_to_shapefile.py +++ b/python/plugins/processing/script/scripts/Extract_raster_values_to_shapefile.py @@ -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 diff --git a/python/plugins/processing/tools/raster.py b/python/plugins/processing/tools/raster.py index 158f10383f3..a02cce8e41e 100644 --- a/python/plugins/processing/tools/raster.py +++ b/python/plugins/processing/tools/raster.py @@ -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 \ No newline at end of file