27
27
__revision__ = '$Format:%H$'
28
28
29
29
import os
30
-
31
30
import numpy
31
+ import csv
32
+
32
33
from osgeo import gdal , ogr , osr
33
34
34
35
from qgis .core import (QgsRectangle ,
35
- QgsFeatureSink ,
36
36
QgsGeometry ,
37
- QgsApplication ,
38
- QgsProcessingUtils )
37
+ QgsFeatureRequest ,
38
+ QgsProcessing ,
39
+ QgsProcessingParameterBoolean ,
40
+ QgsProcessingParameterNumber ,
41
+ QgsProcessingParameterRasterLayer ,
42
+ QgsProcessingParameterFeatureSource ,
43
+ QgsProcessingParameterFolderDestination )
39
44
40
45
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
48
48
49
49
50
50
class HypsometricCurves (QgisAlgorithm ):
@@ -62,17 +62,17 @@ def __init__(self):
62
62
super ().__init__ ()
63
63
64
64
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' )))
76
76
77
77
def name (self ):
78
78
return 'hypsometriccurves'
@@ -81,12 +81,15 @@ def displayName(self):
81
81
return self .tr ('Hypsometric curves' )
82
82
83
83
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 )
88
87
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 )
90
93
91
94
rasterDS = gdal .Open (rasterPath , gdal .GA_ReadOnly )
92
95
geoTransform = rasterDS .GetGeoTransform ()
@@ -105,15 +108,21 @@ def processAlgorithm(self, parameters, context, feedback):
105
108
rasterGeom = QgsGeometry .fromRect (rasterBBox )
106
109
107
110
crs = osr .SpatialReference ()
108
- crs .ImportFromProj4 (str (layer . crs () .toProj4 ()))
111
+ crs .ImportFromProj4 (str (target_crs .toProj4 ()))
109
112
110
113
memVectorDriver = ogr .GetDriverByName ('Memory' )
111
114
memRasterDriver = gdal .GetDriverByName ('MEM' )
112
115
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
115
118
116
119
for current , f in enumerate (features ):
120
+ if not f .hasGeometry ():
121
+ continue
122
+
123
+ if feedback .isCanceled ():
124
+ break
125
+
117
126
geom = f .geometry ()
118
127
intersectedGeom = rasterGeom .intersection (geom )
119
128
@@ -124,7 +133,7 @@ def processAlgorithm(self, parameters, context, feedback):
124
133
continue
125
134
126
135
fName = os .path .join (
127
- outputPath , 'hystogram_%s_%s.csv' % (layer . name (), f .id ()))
136
+ outputPath , 'hystogram_%s_%s.csv' % (source . sourceName (), f .id ()))
128
137
129
138
ogrGeom = ogr .CreateGeometryFromWkt (intersectedGeom .exportToWkt ())
130
139
bbox = intersectedGeom .boundingBox ()
@@ -185,6 +194,8 @@ def processAlgorithm(self, parameters, context, feedback):
185
194
186
195
rasterDS = None
187
196
197
+ return {self .OUTPUT_DIRECTORY : outputPath }
198
+
188
199
def calculateHypsometry (self , fid , fName , feedback , data , pX , pY ,
189
200
percentage , step ):
190
201
out = dict ()
@@ -220,7 +231,9 @@ def calculateHypsometry(self, fid, fName, feedback, data, pX, pY,
220
231
out [i [0 ]] = i [1 ] + out [prev ]
221
232
prev = i [0 ]
222
233
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 ]])
0 commit comments