[processing] attempt to fix proximity algorithm

This commit is contained in:
Alexander Bruy 2013-09-15 17:47:27 +03:00
parent 6910a2ed8e
commit 47e27d1e2e
3 changed files with 110 additions and 103 deletions

View File

@ -47,6 +47,7 @@ from processing.gdal.ClipByExtent import ClipByExtent
from processing.gdal.ClipByMask import ClipByMask
from processing.gdal.contour import contour
from processing.gdal.rasterize import rasterize
from processing.gdal.proximity import proximity
from processing.gdal.ogr2ogr import Ogr2Ogr
from processing.gdal.ogrinfo import OgrInfo
@ -96,7 +97,7 @@ class GdalOgrAlgorithmProvider(AlgorithmProvider):
self.preloadedAlgs = [nearblack(), information(), warp(), translate(),
rgb2pct(), pct2rgb(), merge(), polygonize(),
gdaladdo(), ClipByExtent(), ClipByMask(),
contour(), rasterize(),
contour(), rasterize(), proximity(),
OgrInfo(), Ogr2Ogr(), OgrSql()]
#And then we add those that are created as python scripts

View File

@ -0,0 +1,108 @@
# -*- coding: utf-8 -*-
"""
***************************************************************************
proximity.py
---------------------
Date : August 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. *
* *
***************************************************************************
"""
__author__ = 'Victor Olaya'
__date__ = 'August 2012'
__copyright__ = '(C) 2012, Victor Olaya'
# This will get replaced with a git SHA1 when you do a git archive
__revision__ = '$Format:%H$'
import os
from PyQt4 import QtGui, QtCore
from processing.core.GeoAlgorithm import GeoAlgorithm
from processing.parameters.ParameterRaster import ParameterRaster
from processing.parameters.ParameterString import ParameterString
from processing.parameters.ParameterSelection import ParameterSelection
from processing.parameters.ParameterNumber import ParameterNumber
from processing.outputs.OutputRaster import OutputRaster
from processing.tools.system import *
from processing.gdal.GdalUtils import GdalUtils
class proximity(GeoAlgorithm):
INPUT = "INPUT"
VALUES = "VALUES"
UNITS = "UNITS"
MAX_DIST = "MAX_DIST"
NODATA = "NODATA"
BUF_VAL = "BUF_VAL"
OUTPUT = "OUTPUT"
DISTUNITS = ["GEO", "PIXEL"]
def getIcon(self):
filepath = os.path.dirname(__file__) + "/icons/proximity.png"
return QtGui.QIcon(filepath)
def defineCharacteristics(self):
self.name = "Proximity"
self.group = "[GDAL] Analysis"
self.addParameter(ParameterRaster(self.INPUT, "Input layer", False))
self.addParameter(ParameterString(self.VALUES, "Values", ""))
self.addParameter(ParameterSelection(self.UNITS, "Dist units", self.DISTUNITS, 0))
self.addParameter(ParameterNumber(self.MAX_DIST, "Max dist (negative value to ignore)", -1, 9999, -1))
self.addParameter(ParameterNumber(self.NODATA, "No data (negative value to ignore)", -1, 9999, -1))
self.addParameter(ParameterNumber(self.BUF_VAL, "Fixed buf val (negative value to ignore)", -1, 9999, -1))
self.addOutput(OutputRaster(self.OUTPUT, "Output layer"))
def processAlgorithm(self, progress):
output = self.getOutputValue(self.OUTPUT)
arguments = []
arguments.append(self.getParameterValue(self.INPUT))
arguments.append(output)
arguments.append("-of")
arguments.append(GdalUtils.getFormatShortNameFromFilename(output))
arguments.append("-distunits")
arguments.append(self.DISTUNITS[self.getParameterValue(self.UNITS)])
values = self.getParameterValue(self.VALUES)
if len(values) > 0:
arguments.append("-values")
arguments.append(values)
values = str(self.getParameterValue(self.MAX_DIST))
if values < 0:
arguments.append("-maxdist")
arguments.append(values)
values = str(self.getParameterValue(self.NODATA))
if values < 0:
arguments.append("-nodata")
arguments.append(values)
values = str(self.getParameterValue(self.BUF_VAL))
if values < 0:
arguments.append("-fixed-buf-val")
arguments.append(values)
commands = []
if isWindows():
commands = ["cmd.exe", "/C ", "gdal_proximity.bat", GdalUtils.escapeAndJoin(arguments)]
else:
commands = ["gdal_proximity.py", GdalUtils.escapeAndJoin(arguments)]
GdalUtils.runGdal(commands, progress)

View File

@ -1,102 +0,0 @@
# -*- coding: utf-8 -*-
"""
***************************************************************************
proximity.py
---------------------
Date : August 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. *
* *
***************************************************************************
"""
__author__ = 'Victor Olaya'
__date__ = 'August 2012'
__copyright__ = '(C) 2012, Victor Olaya'
# This will get replaced with a git SHA1 when you do a git archive
__revision__ = '$Format:%H$'
#******************************************************************************
# Adapted from gdal_proximity.py, Copyright (c) 2008, Frank Warmerdam
#******************************************************************************
##[GDAL] Analysis=group
##src_filename=raster
##dst_filename=output raster
##values=string
##maxdist=number 0
##nodata=number 0
##distunits=selection GEO;PIXEL
##fixed_buf_val=number 0
from processing.gdal.GdalUtils import GdalUtils
try:
from osgeo import gdal
except ImportError:
import gdal
creation_options = []
options = []
src_band_n = 1
dst_band_n = 1
creation_type = 'Float32'
gdal.AllRegister()
options.append( 'MAXDIST=' + str(maxdist))
if len(values) > 0:
options.append( 'VALUES=' + values )
if distunits == 0:
options.append( 'DISTUNITS=GEO')
else:
options.append( 'DISTUNITS=PIXEL')
options.append( 'NODATA=' + str(nodata))
options.append( 'FIXED_BUF_VAL=' +str(fixed_buf_val))
src_ds = gdal.Open( src_filename )
srcband = src_ds.GetRasterBand(src_band_n)
# =============================================================================
# Try opening the destination file as an existing file.
# =============================================================================
try:
driver = gdal.IdentifyDriver( dst_filename )
if driver is not None:
dst_ds = gdal.Open( dst_filename, gdal.GA_Update )
dstband = dst_ds.GetRasterBand(dst_band_n)
else:
dst_ds = None
except:
dst_ds = None
# =============================================================================
# Create output file.
# =============================================================================
if dst_ds is None:
drv = gdal.GetDriverByName(GdalUtils.getFormatShortNameFromFilename(dst_filename))
dst_ds = drv.Create( dst_filename,
src_ds.RasterXSize, src_ds.RasterYSize, 1,
gdal.GetDataTypeByName(creation_type) )
dst_ds.SetGeoTransform( src_ds.GetGeoTransform() )
dst_ds.SetProjection( src_ds.GetProjectionRef() )
dstband = dst_ds.GetRasterBand(1)
# =============================================================================
# Invoke algorithm.
# =============================================================================
prog_func = gdal.TermProgress
gdal.ComputeProximity( srcband, dstband, options,
callback = prog_func )
srcband = None
dstband = None
src_ds = None
dst_ds = None