Skip to content

Commit be46b75

Browse files
committed
Port hypsometic curves to new API
1 parent c4011ad commit be46b75

File tree

2 files changed

+50
-38
lines changed

2 files changed

+50
-38
lines changed

python/plugins/processing/algs/qgis/HypsometricCurves.py

Lines changed: 48 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -27,24 +27,24 @@
2727
__revision__ = '$Format:%H$'
2828

2929
import os
30-
3130
import numpy
31+
import csv
32+
3233
from osgeo import gdal, ogr, osr
3334

3435
from qgis.core import (QgsRectangle,
35-
QgsFeatureSink,
3636
QgsGeometry,
37-
QgsApplication,
38-
QgsProcessingUtils)
37+
QgsFeatureRequest,
38+
QgsProcessing,
39+
QgsProcessingParameterBoolean,
40+
QgsProcessingParameterNumber,
41+
QgsProcessingParameterRasterLayer,
42+
QgsProcessingParameterFeatureSource,
43+
QgsProcessingParameterFolderDestination)
3944

4045
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
41-
from processing.core.parameters import ParameterRaster
42-
from processing.core.parameters import ParameterVector
43-
from processing.core.parameters import ParameterNumber
44-
from processing.core.parameters import ParameterBoolean
45-
from processing.core.outputs import OutputDirectory
46-
47-
from processing.tools import raster, vector, dataobjects
46+
from processing.tools import raster
47+
from processing.tools.dataobjects import exportRasterLayer
4848

4949

5050
class HypsometricCurves(QgisAlgorithm):
@@ -62,17 +62,17 @@ def __init__(self):
6262
super().__init__()
6363

6464
def initAlgorithm(self, config=None):
65-
self.addParameter(ParameterRaster(self.INPUT_DEM,
66-
self.tr('DEM to analyze')))
67-
self.addParameter(ParameterVector(self.BOUNDARY_LAYER,
68-
self.tr('Boundary layer'), dataobjects.TYPE_VECTOR_POLYGON))
69-
self.addParameter(ParameterNumber(self.STEP,
70-
self.tr('Step'), 0.0, 999999999.999999, 100.0))
71-
self.addParameter(ParameterBoolean(self.USE_PERCENTAGE,
72-
self.tr('Use % of area instead of absolute value'), False))
73-
74-
self.addOutput(OutputDirectory(self.OUTPUT_DIRECTORY,
75-
self.tr('Hypsometric curves')))
65+
self.addParameter(QgsProcessingParameterRasterLayer(self.INPUT_DEM,
66+
self.tr('DEM to analyze')))
67+
self.addParameter(QgsProcessingParameterFeatureSource(self.BOUNDARY_LAYER,
68+
self.tr('Boundary layer'), [QgsProcessing.TypeVectorPolygon]))
69+
self.addParameter(QgsProcessingParameterNumber(self.STEP,
70+
self.tr('Step'), minValue=0.0, maxValue=999999999.999999, defaultValue=100.0))
71+
self.addParameter(QgsProcessingParameterBoolean(self.USE_PERCENTAGE,
72+
self.tr('Use % of area instead of absolute value'), defaultValue=False))
73+
74+
self.addParameter(QgsProcessingParameterFolderDestination(self.OUTPUT_DIRECTORY,
75+
self.tr('Hypsometric curves')))
7676

7777
def name(self):
7878
return 'hypsometriccurves'
@@ -81,12 +81,15 @@ def displayName(self):
8181
return self.tr('Hypsometric curves')
8282

8383
def processAlgorithm(self, parameters, context, feedback):
84-
rasterPath = self.getParameterValue(self.INPUT_DEM)
85-
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.BOUNDARY_LAYER), context)
86-
step = self.getParameterValue(self.STEP)
87-
percentage = self.getParameterValue(self.USE_PERCENTAGE)
84+
raster_layer = self.parameterAsRasterLayer(parameters, self.INPUT_DEM, context)
85+
target_crs = raster_layer.crs()
86+
rasterPath = exportRasterLayer(raster_layer)
8887

89-
outputPath = self.getOutputValue(self.OUTPUT_DIRECTORY)
88+
source = self.parameterAsSource(parameters, self.BOUNDARY_LAYER, context)
89+
step = self.parameterAsDouble(parameters, self.STEP, context)
90+
percentage = self.parameterAsBool(parameters, self.USE_PERCENTAGE, context)
91+
92+
outputPath = self.parameterAsString(parameters, self.OUTPUT_DIRECTORY, context)
9093

9194
rasterDS = gdal.Open(rasterPath, gdal.GA_ReadOnly)
9295
geoTransform = rasterDS.GetGeoTransform()
@@ -105,15 +108,21 @@ def processAlgorithm(self, parameters, context, feedback):
105108
rasterGeom = QgsGeometry.fromRect(rasterBBox)
106109

107110
crs = osr.SpatialReference()
108-
crs.ImportFromProj4(str(layer.crs().toProj4()))
111+
crs.ImportFromProj4(str(target_crs.toProj4()))
109112

110113
memVectorDriver = ogr.GetDriverByName('Memory')
111114
memRasterDriver = gdal.GetDriverByName('MEM')
112115

113-
features = QgsProcessingUtils.getFeatures(layer, context)
114-
total = 100.0 / layer.featureCount() if layer.featureCount() else 0
116+
features = source.getFeatures(QgsFeatureRequest().setDestinationCrs(target_crs))
117+
total = 100.0 / source.featureCount() if source.featureCount() else 0
115118

116119
for current, f in enumerate(features):
120+
if not f.hasGeometry():
121+
continue
122+
123+
if feedback.isCanceled():
124+
break
125+
117126
geom = f.geometry()
118127
intersectedGeom = rasterGeom.intersection(geom)
119128

@@ -124,7 +133,7 @@ def processAlgorithm(self, parameters, context, feedback):
124133
continue
125134

126135
fName = os.path.join(
127-
outputPath, 'hystogram_%s_%s.csv' % (layer.name(), f.id()))
136+
outputPath, 'hystogram_%s_%s.csv' % (source.sourceName(), f.id()))
128137

129138
ogrGeom = ogr.CreateGeometryFromWkt(intersectedGeom.exportToWkt())
130139
bbox = intersectedGeom.boundingBox()
@@ -185,6 +194,8 @@ def processAlgorithm(self, parameters, context, feedback):
185194

186195
rasterDS = None
187196

197+
return {self.OUTPUT_DIRECTORY: outputPath}
198+
188199
def calculateHypsometry(self, fid, fName, feedback, data, pX, pY,
189200
percentage, step):
190201
out = dict()
@@ -220,7 +231,9 @@ def calculateHypsometry(self, fid, fName, feedback, data, pX, pY,
220231
out[i[0]] = i[1] + out[prev]
221232
prev = i[0]
222233

223-
writer = vector.TableWriter(fName, 'utf-8', [self.tr('Area'), self.tr('Elevation')])
224-
for i in sorted(out.items()):
225-
writer.addRecord([i[1], i[0]])
226-
del writer
234+
with open(fName, 'w', newline='', encoding='utf-8') as out_file:
235+
writer = csv.writer(out_file)
236+
writer.writerow([self.tr('Area'), self.tr('Elevation')])
237+
238+
for i in sorted(out.items()):
239+
writer.writerow([i[1], i[0]])

python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
from .HubDistanceLines import HubDistanceLines
8282
from .HubDistancePoints import HubDistancePoints
8383
from .HubLines import HubLines
84+
from .HypsometricCurves import HypsometricCurves
8485
from .ImportIntoPostGIS import ImportIntoPostGIS
8586
from .ImportIntoSpatialite import ImportIntoSpatialite
8687
from .Intersection import Intersection
@@ -162,7 +163,6 @@
162163
# from .SetVectorStyle import SetVectorStyle
163164
# from .SetRasterStyle import SetRasterStyle
164165
# from .SelectByAttributeSum import SelectByAttributeSum
165-
# from .HypsometricCurves import HypsometricCurves
166166
# from .Datasources2Vrt import Datasources2Vrt
167167
# from .DefineProjection import DefineProjection
168168
# from .RectanglesOvalsDiamondsVariable import RectanglesOvalsDiamondsVariable
@@ -193,9 +193,7 @@ def getAlgs(self):
193193
# GeometryConvert(), FieldsCalculator(),
194194
# FieldsPyculator(),
195195
# SetVectorStyle(), SetRasterStyle(),
196-
# HypsometricCurves(),
197196
# FieldsMapper(), SelectByAttributeSum(), Datasources2Vrt(),
198-
#
199197
# DefineProjection(),
200198
# RectanglesOvalsDiamondsVariable(),
201199
# RectanglesOvalsDiamondsFixed(),
@@ -245,6 +243,7 @@ def getAlgs(self):
245243
HubDistanceLines(),
246244
HubDistancePoints(),
247245
HubLines(),
246+
HypsometricCurves(),
248247
ImportIntoPostGIS(),
249248
ImportIntoSpatialite(),
250249
Intersection(),

0 commit comments

Comments
 (0)