Skip to content

Commit 47fe2a1

Browse files
committed
Port Points From Lines to new API
1 parent c6b3855 commit 47fe2a1

12 files changed

+403
-25
lines changed

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

+26-22
Original file line numberDiff line numberDiff line change
@@ -29,28 +29,29 @@
2929

3030
from osgeo import gdal
3131
from qgis.PyQt.QtCore import QVariant
32-
from qgis.core import (QgsApplication,
33-
QgsFeature,
32+
from qgis.core import (QgsFeature,
3433
QgsFeatureSink,
3534
QgsFields,
3635
QgsField,
3736
QgsGeometry,
3837
QgsPointXY,
3938
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
4245
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
4647

4748

4849
class PointsFromLines(QgisAlgorithm):
4950

5051
INPUT_RASTER = 'INPUT_RASTER'
5152
RASTER_BAND = 'RASTER_BAND'
5253
INPUT_VECTOR = 'INPUT_VECTOR'
53-
OUTPUT_LAYER = 'OUTPUT_LAYER'
54+
OUTPUT = 'OUTPUT'
5455

5556
def group(self):
5657
return self.tr('Vector analysis tools')
@@ -59,11 +60,11 @@ def __init__(self):
5960
super().__init__()
6061

6162
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))
6768

6869
def name(self):
6970
return 'generatepointspixelcentroidsalongline'
@@ -72,9 +73,10 @@ def displayName(self):
7273
return self.tr('Generate points (pixel centroids) along line')
7374

7475
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)
7677

77-
rasterPath = str(self.getParameterValue(self.INPUT_RASTER))
78+
raster_layer = self.parameterAsRasterLayer(parameters, self.INPUT_RASTER, context)
79+
rasterPath = exportRasterLayer(raster_layer)
7880

7981
rasterDS = gdal.Open(rasterPath, gdal.GA_ReadOnly)
8082
geoTransform = rasterDS.GetGeoTransform()
@@ -85,8 +87,8 @@ def processAlgorithm(self, parameters, context, feedback):
8587
fields.append(QgsField('line_id', QVariant.Int, '', 10, 0))
8688
fields.append(QgsField('point_id', QVariant.Int, '', 10, 0))
8789

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())
9092

9193
outFeature = QgsFeature()
9294
outFeature.setFields(fields)
@@ -95,9 +97,11 @@ def processAlgorithm(self, parameters, context, feedback):
9597
self.lineId = 0
9698
self.pointId = 0
9799

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
100102
for current, f in enumerate(features):
103+
if feedback.isCanceled():
104+
break
101105
geom = f.geometry()
102106
if geom.isMultipart():
103107
lines = geom.asMultiPolyline()
@@ -112,7 +116,7 @@ def processAlgorithm(self, parameters, context, feedback):
112116
geoTransform)
113117

114118
self.buildLine(x1, y1, x2, y2, geoTransform,
115-
writer, outFeature)
119+
sink, outFeature)
116120
else:
117121
points = geom.asPolyline()
118122
for i in range(len(points) - 1):
@@ -122,15 +126,15 @@ def processAlgorithm(self, parameters, context, feedback):
122126
(x1, y1) = raster.mapToPixel(p1.x(), p1.y(), geoTransform)
123127
(x2, y2) = raster.mapToPixel(p2.x(), p2.y(), geoTransform)
124128

125-
self.buildLine(x1, y1, x2, y2, geoTransform, writer,
129+
self.buildLine(x1, y1, x2, y2, geoTransform, sink,
126130
outFeature)
127131

128132
self.pointId = 0
129133
self.lineId += 1
130134

131135
feedback.setProgress(int(current * total))
132136

133-
del writer
137+
return {self.OUTPUT: dest_id}
134138

135139
def buildLine(self, startX, startY, endX, endY, geoTransform, writer, feature):
136140
if startX == endX:

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def processAlgorithm(self, parameters, context, feedback):
8787
fields.append(QgsField('point_id', QVariant.Int, '', 10, 0))
8888

8989
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
90-
fields, QgsWkbTypes.PointZ, raster_layer.crs())
90+
fields, QgsWkbTypes.Point, raster_layer.crs())
9191

9292
outFeature = QgsFeature()
9393
outFeature.setFields(fields)

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@
9595
from .PointOnSurface import PointOnSurface
9696
from .PointsAlongGeometry import PointsAlongGeometry
9797
from .PointsDisplacement import PointsDisplacement
98+
from .PointsFromLines import PointsFromLines
9899
from .PointsFromPolygons import PointsFromPolygons
99100
from .PointsInPolygon import PointsInPolygon
100101
from .PointsLayerFromTable import PointsLayerFromTable
@@ -155,7 +156,6 @@
155156
# from .GeometryConvert import GeometryConvert
156157
# from .FieldsCalculator import FieldsCalculator
157158
# from .FieldPyculator import FieldsPyculator
158-
# from .PointsFromLines import PointsFromLines
159159
# from .SetVectorStyle import SetVectorStyle
160160
# from .SetRasterStyle import SetRasterStyle
161161
# from .SelectByAttributeSum import SelectByAttributeSum
@@ -191,7 +191,6 @@ def getAlgs(self):
191191
# SpatialJoin(),
192192
# GeometryConvert(), FieldsCalculator(),
193193
# FieldsPyculator(),
194-
# PointsFromLines(),
195194
# SetVectorStyle(), SetRasterStyle(),
196195
# HypsometricCurves(),
197196
# FieldsMapper(), SelectByAttributeSum(), Datasources2Vrt(),
@@ -259,6 +258,7 @@ def getAlgs(self):
259258
PointOnSurface(),
260259
PointsAlongGeometry(),
261260
PointsDisplacement(),
261+
PointsFromLines(),
262262
PointsFromPolygons(),
263263
PointsInPolygon(),
264264
PointsLayerFromTable(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<GMLFeatureClassList>
2+
<GMLFeatureClass>
3+
<Name>pixel_lines</Name>
4+
<ElementPath>pixel_lines</ElementPath>
5+
<!--LINESTRING-->
6+
<GeometryType>2</GeometryType>
7+
<SRSName>EPSG:4326</SRSName>
8+
<DatasetSpecificInfo>
9+
<FeatureCount>3</FeatureCount>
10+
<ExtentXMin>18.69765</ExtentXMin>
11+
<ExtentXMax>18.69836</ExtentXMax>
12+
<ExtentYMin>45.79745</ExtentYMin>
13+
<ExtentYMax>45.79816</ExtentYMax>
14+
</DatasetSpecificInfo>
15+
</GMLFeatureClass>
16+
</GMLFeatureClassList>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<ogr:FeatureCollection
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://ogr.maptools.org/ pixel_lines.xsd"
5+
xmlns:ogr="http://ogr.maptools.org/"
6+
xmlns:gml="http://www.opengis.net/gml">
7+
<gml:boundedBy>
8+
<gml:Box>
9+
<gml:coord><gml:X>18.69764779785013</gml:X><gml:Y>45.79744720550632</gml:Y></gml:coord>
10+
<gml:coord><gml:X>18.69836033831157</gml:X><gml:Y>45.79815749820605</gml:Y></gml:coord>
11+
</gml:Box>
12+
</gml:boundedBy>
13+
14+
<gml:featureMember>
15+
<ogr:pixel_lines fid="pixel_lines.0">
16+
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>18.6976477978501,45.798157498206 18.697964732251,45.7981507549209</gml:coordinates></gml:LineString></ogr:geometryProperty>
17+
</ogr:pixel_lines>
18+
</gml:featureMember>
19+
<gml:featureMember>
20+
<ogr:pixel_lines fid="pixel_lines.1">
21+
<ogr:geometryProperty><gml:LineString srsName="EPSG:4326"><gml:coordinates>18.6983603383116,45.7974472055063 18.6983603383116,45.7977618921454</gml:coordinates></gml:LineString></ogr:geometryProperty>
22+
</ogr:pixel_lines>
23+
</gml:featureMember>
24+
<gml:featureMember>
25+
<ogr:pixel_lines fid="pixel_lines.2">
26+
</ogr:pixel_lines>
27+
</gml:featureMember>
28+
</ogr:FeatureCollection>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<GMLFeatureClassList>
2+
<GMLFeatureClass>
3+
<Name>pixel_polygons</Name>
4+
<ElementPath>pixel_polygons</ElementPath>
5+
<SRSName>EPSG:4326</SRSName>
6+
<DatasetSpecificInfo>
7+
<FeatureCount>3</FeatureCount>
8+
<ExtentXMin>18.69514</ExtentXMin>
9+
<ExtentXMax>18.69889</ExtentXMax>
10+
<ExtentYMin>45.79821</ExtentYMin>
11+
<ExtentYMax>45.80722</ExtentYMax>
12+
</DatasetSpecificInfo>
13+
<PropertyDefn>
14+
<Name>name</Name>
15+
<ElementPath>name</ElementPath>
16+
<Type>String</Type>
17+
<Width>5</Width>
18+
</PropertyDefn>
19+
<PropertyDefn>
20+
<Name>intval</Name>
21+
<ElementPath>intval</ElementPath>
22+
<Type>Integer</Type>
23+
</PropertyDefn>
24+
<PropertyDefn>
25+
<Name>floatval</Name>
26+
<ElementPath>floatval</ElementPath>
27+
<Type>Real</Type>
28+
</PropertyDefn>
29+
</GMLFeatureClass>
30+
</GMLFeatureClassList>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<ogr:FeatureCollection
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://ogr.maptools.org/ pixel_polygons.xsd"
5+
xmlns:ogr="http://ogr.maptools.org/"
6+
xmlns:gml="http://www.opengis.net/gml">
7+
<gml:boundedBy>
8+
<gml:Box>
9+
<gml:coord><gml:X>18.69513929578401</gml:X><gml:Y>45.79820863478491</gml:Y></gml:coord>
10+
<gml:coord><gml:X>18.69889193395552</gml:X><gml:Y>45.80721878759138</gml:Y></gml:coord>
11+
</gml:Box>
12+
</gml:boundedBy>
13+
14+
<gml:featureMember>
15+
<ogr:pixel_polygons fid="polys.1">
16+
<ogr:geometryProperty><gml:Polygon srsName="EPSG:4326"><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>18.6987166085423,45.7984862333558 18.6987132368997,45.7982086347849 18.6988919339555,45.7982086347849 18.6988874384321,45.798485109475 18.6987166085423,45.7984862333558</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></ogr:geometryProperty>
17+
<ogr:name>Aaaaa</ogr:name>
18+
<ogr:intval>-33</ogr:intval>
19+
<ogr:floatval>0</ogr:floatval>
20+
</ogr:pixel_polygons>
21+
</gml:featureMember>
22+
<gml:featureMember>
23+
<ogr:pixel_polygons fid="polys.0">
24+
<ogr:geometryProperty><gml:MultiPolygon srsName="EPSG:4326"><gml:polygonMember><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>18.695139295784,45.8072159778892 18.695139295784,45.8070440241186 18.695359014491,45.8070429002377 18.6953595764314,45.8072187875914 18.695139295784,45.8072159778892</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon></gml:polygonMember></gml:MultiPolygon></ogr:geometryProperty>
25+
<ogr:name>aaaaa</ogr:name>
26+
<ogr:intval>33</ogr:intval>
27+
<ogr:floatval>44.123456</ogr:floatval>
28+
</ogr:pixel_polygons>
29+
</gml:featureMember>
30+
<gml:featureMember>
31+
<ogr:pixel_polygons fid="polys.2">
32+
<ogr:name>bbaaa</ogr:name>
33+
<ogr:floatval>0.123</ogr:floatval>
34+
</ogr:pixel_polygons>
35+
</gml:featureMember>
36+
</ogr:FeatureCollection>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<GMLFeatureClassList>
2+
<GMLFeatureClass>
3+
<Name>pixel_centroids_lines</Name>
4+
<ElementPath>pixel_centroids_lines</ElementPath>
5+
<!--POINT-->
6+
<GeometryType>1</GeometryType>
7+
<SRSName>EPSG:4326</SRSName>
8+
<DatasetSpecificInfo>
9+
<FeatureCount>8</FeatureCount>
10+
<ExtentXMin>18.69765</ExtentXMin>
11+
<ExtentXMax>18.69835</ExtentXMax>
12+
<ExtentYMin>45.79745</ExtentYMin>
13+
<ExtentYMax>45.79815</ExtentYMax>
14+
</DatasetSpecificInfo>
15+
<PropertyDefn>
16+
<Name>id</Name>
17+
<ElementPath>id</ElementPath>
18+
<Type>Integer</Type>
19+
</PropertyDefn>
20+
<PropertyDefn>
21+
<Name>line_id</Name>
22+
<ElementPath>line_id</ElementPath>
23+
<Type>Integer</Type>
24+
</PropertyDefn>
25+
<PropertyDefn>
26+
<Name>point_id</Name>
27+
<ElementPath>point_id</ElementPath>
28+
<Type>Integer</Type>
29+
</PropertyDefn>
30+
</GMLFeatureClass>
31+
</GMLFeatureClassList>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<ogr:FeatureCollection
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation=""
5+
xmlns:ogr="http://ogr.maptools.org/"
6+
xmlns:gml="http://www.opengis.net/gml">
7+
<gml:boundedBy>
8+
<gml:Box>
9+
<gml:coord><gml:X>18.6976479442</gml:X><gml:Y>45.7974514376</gml:Y></gml:coord>
10+
<gml:coord><gml:X>18.6983479442</gml:X><gml:Y>45.7981514376</gml:Y></gml:coord>
11+
</gml:Box>
12+
</gml:boundedBy>
13+
14+
<gml:featureMember>
15+
<ogr:pixel_centroids_lines fid="pixel_centroids_lines.0">
16+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>18.6976479442,45.7981514376</gml:coordinates></gml:Point></ogr:geometryProperty>
17+
<ogr:id>0</ogr:id>
18+
<ogr:line_id>0</ogr:line_id>
19+
<ogr:point_id>0</ogr:point_id>
20+
</ogr:pixel_centroids_lines>
21+
</gml:featureMember>
22+
<gml:featureMember>
23+
<ogr:pixel_centroids_lines fid="pixel_centroids_lines.1">
24+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>18.6977479442,45.7981514376</gml:coordinates></gml:Point></ogr:geometryProperty>
25+
<ogr:id>1</ogr:id>
26+
<ogr:line_id>0</ogr:line_id>
27+
<ogr:point_id>1</ogr:point_id>
28+
</ogr:pixel_centroids_lines>
29+
</gml:featureMember>
30+
<gml:featureMember>
31+
<ogr:pixel_centroids_lines fid="pixel_centroids_lines.2">
32+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>18.6978479442,45.7981514376</gml:coordinates></gml:Point></ogr:geometryProperty>
33+
<ogr:id>2</ogr:id>
34+
<ogr:line_id>0</ogr:line_id>
35+
<ogr:point_id>2</ogr:point_id>
36+
</ogr:pixel_centroids_lines>
37+
</gml:featureMember>
38+
<gml:featureMember>
39+
<ogr:pixel_centroids_lines fid="pixel_centroids_lines.3">
40+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>18.6979479442,45.7981514376</gml:coordinates></gml:Point></ogr:geometryProperty>
41+
<ogr:id>3</ogr:id>
42+
<ogr:line_id>0</ogr:line_id>
43+
<ogr:point_id>3</ogr:point_id>
44+
</ogr:pixel_centroids_lines>
45+
</gml:featureMember>
46+
<gml:featureMember>
47+
<ogr:pixel_centroids_lines fid="pixel_centroids_lines.4">
48+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>18.6983479442,45.7977514376</gml:coordinates></gml:Point></ogr:geometryProperty>
49+
<ogr:id>4</ogr:id>
50+
<ogr:line_id>1</ogr:line_id>
51+
<ogr:point_id>0</ogr:point_id>
52+
</ogr:pixel_centroids_lines>
53+
</gml:featureMember>
54+
<gml:featureMember>
55+
<ogr:pixel_centroids_lines fid="pixel_centroids_lines.5">
56+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>18.6983479442,45.7976514376</gml:coordinates></gml:Point></ogr:geometryProperty>
57+
<ogr:id>5</ogr:id>
58+
<ogr:line_id>1</ogr:line_id>
59+
<ogr:point_id>1</ogr:point_id>
60+
</ogr:pixel_centroids_lines>
61+
</gml:featureMember>
62+
<gml:featureMember>
63+
<ogr:pixel_centroids_lines fid="pixel_centroids_lines.6">
64+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>18.6983479442,45.7975514376</gml:coordinates></gml:Point></ogr:geometryProperty>
65+
<ogr:id>6</ogr:id>
66+
<ogr:line_id>1</ogr:line_id>
67+
<ogr:point_id>2</ogr:point_id>
68+
</ogr:pixel_centroids_lines>
69+
</gml:featureMember>
70+
<gml:featureMember>
71+
<ogr:pixel_centroids_lines fid="pixel_centroids_lines.7">
72+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>18.6983479442,45.7974514376</gml:coordinates></gml:Point></ogr:geometryProperty>
73+
<ogr:id>7</ogr:id>
74+
<ogr:line_id>1</ogr:line_id>
75+
<ogr:point_id>3</ogr:point_id>
76+
</ogr:pixel_centroids_lines>
77+
</gml:featureMember>
78+
</ogr:FeatureCollection>

0 commit comments

Comments
 (0)