50 changes: 31 additions & 19 deletions python/plugins/processing/algs/ftools/Clip.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,15 @@
from PyQt4.QtCore import *
from qgis.core import *
from processing.core.GeoAlgorithm import GeoAlgorithm
from processing.tools import dataobjects, vector
from processing.core.ProcessingLog import ProcessingLog
from processing.parameters.ParameterVector import ParameterVector
from processing.outputs.OutputVector import OutputVector
from processing.tools import dataobjects, vector
from processing.tools import vector as utils

class Clip(GeoAlgorithm):


INPUT = "INPUT"
OVERLAY = "OVERLAY"
OUTPUT = "OUTPUT"
Expand Down Expand Up @@ -66,33 +67,44 @@ def processAlgorithm(self, progress):
for inFeatA in selectionA:
geom = QgsGeometry(inFeatA.geometry())
attrs = inFeatA.attributes()
intersections = index.intersects(geom.boundingBox())
intersects = index.intersects(geom.boundingBox())
first = True
found = False
if len(intersections) > 0:
for i in intersections:
request = QgsFeatureRequest().setFilterFid(i)
inFeatB = layerB.getFeatures(request).next()
if len(intersects) > 0:
for i in intersects:
layerB.getFeatures(QgsFeatureRequest().setFilterFid(i)).nextFeature(inFeatB)
tmpGeom = QgsGeometry(inFeatB.geometry())
if tmpGeom.intersects(geom):
found = True
if first:
outFeat.setGeometry(QgsGeometry(tmpGeom))
first = False
else:
cur_geom = QgsGeometry(outFeat.geometry())
new_geom = QgsGeometry(cur_geom.combine(tmpGeom))
outFeat.setGeometry(QgsGeometry(new_geom))
if found:
cur_geom = QgsGeometry(outFeat.geometry())
new_geom = QgsGeometry(geom.intersection(cur_geom))
if new_geom.wkbType() == QGis.WKBNoGeometry :
int_com = QgsGeometry(geom.combine(cur_geom))
int_sym = QgsGeometry(geom.symDifference(cur_geom))
new_geom = QgsGeometry(int_com.difference(int_sym))
outFeat.setGeometry(new_geom)
outFeat.setAttributes(attrs)
writer.addFeature(outFeat)
try:
cur_geom = QgsGeometry(outFeat.geometry())
new_geom = QgsGeometry(cur_geom.combine(tmpGeom))
outFeat.setGeometry(QgsGeometry(new_geom))
except:
ProcessingLog.addToLog(ProcessingLog.LOG_ERROR, "GEOS geoprocessing error: One or more input features have invalid geometry.")
break
if found:
try:
cur_geom = QgsGeometry(outFeat.geometry())
new_geom = QgsGeometry(geom.intersection(cur_geom))
if new_geom.wkbType() == 0:
int_com = QgsGeometry(geom.combine(cur_geom))
int_sym = QgsGeometry(geom.symDifference(cur_geom))
new_geom = QgsGeometry(int_com.difference(int_sym))
try:
outFeat.setGeometry(new_geom)
outFeat.setAttributes(attrs)
writer.addFeature(outFeat)
except:
ProcessingLog.addToLog(ProcessingLog.LOG_ERROR, "Feature geometry error: One or more output features ignored due to invalid geometry.")
continue
except:
ProcessingLog.addToLog(ProcessingLog.LOG_ERROR, "GEOS geoprocessing error: One or more input features have invalid geometry.")
continue

current += 1
progress.setPercentage(int(current * total))
Expand Down
3 changes: 2 additions & 1 deletion python/plugins/processing/gdal/GdalOgrAlgorithmProvider.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
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
Expand Down Expand Up @@ -96,7 +97,7 @@ def createAlgsList(self):
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
Expand Down
5 changes: 3 additions & 2 deletions python/plugins/processing/gdal/polygonize.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,13 @@
from PyQt4 import QtGui, QtCore

from processing.core.GeoAlgorithm import GeoAlgorithm
from processing.tools.system import *

from processing.parameters.ParameterRaster import ParameterRaster
from processing.parameters.ParameterString import ParameterString
from processing.outputs.OutputVector import OutputVector

from processing.tools.system import *

from processing.gdal.GdalUtils import GdalUtils

class polygonize(GeoAlgorithm):
Expand All @@ -56,7 +57,7 @@ def processAlgorithm(self, progress):
arguments = []
arguments.append(self.getParameterValue(polygonize.INPUT))
arguments.append('-f')
arguments.append('"ESRI Shapefile"')
arguments.append('ESRI Shapefile')
output = self.getOutputValue(polygonize.OUTPUT)
arguments.append(output)
arguments.append(QtCore.QFileInfo(output).baseName())
Expand Down
108 changes: 108 additions & 0 deletions python/plugins/processing/gdal/proximity.py
Original file line number Diff line number Diff line change
@@ -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)
102 changes: 0 additions & 102 deletions python/plugins/processing/gdal/scripts/proximity.py

This file was deleted.