29
29
30
30
from osgeo import gdal
31
31
from qgis .PyQt .QtCore import QVariant
32
- from qgis .core import (QgsApplication ,
33
- QgsFeature ,
32
+ from qgis .core import (QgsFeature ,
34
33
QgsFeatureSink ,
35
34
QgsFields ,
36
35
QgsField ,
37
36
QgsGeometry ,
38
37
QgsPointXY ,
39
38
QgsWkbTypes ,
40
- QgsProcessingUtils )
41
- from processing .tools import raster , dataobjects
39
+ QgsProcessing ,
40
+ QgsFeatureRequest ,
41
+ QgsProcessingParameterRasterLayer ,
42
+ QgsProcessingParameterFeatureSource ,
43
+ QgsProcessingParameterFeatureSink )
44
+ from processing .tools import raster
42
45
from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
43
- from processing .core .parameters import ParameterRaster
44
- from processing .core .parameters import ParameterVector
45
- from processing .core .outputs import OutputVector
46
+ from processing .tools .dataobjects import exportRasterLayer
46
47
47
48
48
49
class PointsFromLines (QgisAlgorithm ):
49
50
50
51
INPUT_RASTER = 'INPUT_RASTER'
51
52
RASTER_BAND = 'RASTER_BAND'
52
53
INPUT_VECTOR = 'INPUT_VECTOR'
53
- OUTPUT_LAYER = 'OUTPUT_LAYER '
54
+ OUTPUT = 'OUTPUT '
54
55
55
56
def group (self ):
56
57
return self .tr ('Vector analysis tools' )
@@ -59,11 +60,11 @@ def __init__(self):
59
60
super ().__init__ ()
60
61
61
62
def initAlgorithm (self , config = None ):
62
- self .addParameter (ParameterRaster (self .INPUT_RASTER ,
63
- self .tr ('Raster layer' )))
64
- self .addParameter (ParameterVector (self .INPUT_VECTOR ,
65
- self .tr ('Vector layer' ), [dataobjects . TYPE_VECTOR_LINE ]))
66
- self .addOutput ( OutputVector (self .OUTPUT_LAYER , self .tr ('Points along line ' ), datatype = [ dataobjects . TYPE_VECTOR_POINT ] ))
63
+ self .addParameter (QgsProcessingParameterRasterLayer (self .INPUT_RASTER ,
64
+ self .tr ('Raster layer' )))
65
+ self .addParameter (QgsProcessingParameterFeatureSource (self .INPUT_VECTOR ,
66
+ self .tr ('Vector layer' ), [QgsProcessing . TypeVectorLine ]))
67
+ self .addParameter ( QgsProcessingParameterFeatureSink (self .OUTPUT , self .tr ('Points from polygons ' ), QgsProcessing . TypeVectorPoint ))
67
68
68
69
def name (self ):
69
70
return 'generatepointspixelcentroidsalongline'
@@ -72,9 +73,10 @@ def displayName(self):
72
73
return self .tr ('Generate points (pixel centroids) along line' )
73
74
74
75
def processAlgorithm (self , parameters , context , feedback ):
75
- layer = QgsProcessingUtils . mapLayerFromString ( self .getParameterValue ( self .INPUT_VECTOR ) , context )
76
+ source = self .parameterAsSource ( parameters , self .INPUT_VECTOR , context )
76
77
77
- rasterPath = str (self .getParameterValue (self .INPUT_RASTER ))
78
+ raster_layer = self .parameterAsRasterLayer (parameters , self .INPUT_RASTER , context )
79
+ rasterPath = exportRasterLayer (raster_layer )
78
80
79
81
rasterDS = gdal .Open (rasterPath , gdal .GA_ReadOnly )
80
82
geoTransform = rasterDS .GetGeoTransform ()
@@ -85,8 +87,8 @@ def processAlgorithm(self, parameters, context, feedback):
85
87
fields .append (QgsField ('line_id' , QVariant .Int , '' , 10 , 0 ))
86
88
fields .append (QgsField ('point_id' , QVariant .Int , '' , 10 , 0 ))
87
89
88
- writer = self .getOutputFromName ( self .OUTPUT_LAYER ). getVectorWriter ( fields , QgsWkbTypes . Point ,
89
- layer .crs (), context )
90
+ ( sink , dest_id ) = self .parameterAsSink ( parameters , self .OUTPUT , context ,
91
+ fields , QgsWkbTypes . Point , raster_layer .crs ())
90
92
91
93
outFeature = QgsFeature ()
92
94
outFeature .setFields (fields )
@@ -95,9 +97,11 @@ def processAlgorithm(self, parameters, context, feedback):
95
97
self .lineId = 0
96
98
self .pointId = 0
97
99
98
- features = QgsProcessingUtils .getFeatures (layer , context )
99
- total = 100.0 / layer .featureCount () if layer .featureCount () else 0
100
+ features = source .getFeatures (QgsFeatureRequest (). setDestinationCrs ( raster_layer . crs ()) )
101
+ total = 100.0 / source .featureCount () if source .featureCount () else 0
100
102
for current , f in enumerate (features ):
103
+ if feedback .isCanceled ():
104
+ break
101
105
geom = f .geometry ()
102
106
if geom .isMultipart ():
103
107
lines = geom .asMultiPolyline ()
@@ -112,7 +116,7 @@ def processAlgorithm(self, parameters, context, feedback):
112
116
geoTransform )
113
117
114
118
self .buildLine (x1 , y1 , x2 , y2 , geoTransform ,
115
- writer , outFeature )
119
+ sink , outFeature )
116
120
else :
117
121
points = geom .asPolyline ()
118
122
for i in range (len (points ) - 1 ):
@@ -122,15 +126,15 @@ def processAlgorithm(self, parameters, context, feedback):
122
126
(x1 , y1 ) = raster .mapToPixel (p1 .x (), p1 .y (), geoTransform )
123
127
(x2 , y2 ) = raster .mapToPixel (p2 .x (), p2 .y (), geoTransform )
124
128
125
- self .buildLine (x1 , y1 , x2 , y2 , geoTransform , writer ,
129
+ self .buildLine (x1 , y1 , x2 , y2 , geoTransform , sink ,
126
130
outFeature )
127
131
128
132
self .pointId = 0
129
133
self .lineId += 1
130
134
131
135
feedback .setProgress (int (current * total ))
132
136
133
- del writer
137
+ return { self . OUTPUT : dest_id }
134
138
135
139
def buildLine (self , startX , startY , endX , endY , geoTransform , writer , feature ):
136
140
if startX == endX :
0 commit comments