Skip to content

Commit 90aebd1

Browse files
committed
[processing] Add geometry info should add z/m values (fix #14659)
1 parent 49459c8 commit 90aebd1

File tree

7 files changed

+228
-8
lines changed

7 files changed

+228
-8
lines changed

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ def processAlgorithm(self, progress):
7474
geometryType = layer.geometryType()
7575
fields = layer.fields()
7676

77+
export_z = False
78+
export_m = False
7779
if geometryType == QgsWkbTypes.PolygonGeometry:
7880
areaName = vector.createUniqueFieldName('area', fields)
7981
fields.append(QgsField(areaName, QVariant.Double))
@@ -87,6 +89,14 @@ def processAlgorithm(self, progress):
8789
fields.append(QgsField(xName, QVariant.Double))
8890
yName = vector.createUniqueFieldName('ycoord', fields)
8991
fields.append(QgsField(yName, QVariant.Double))
92+
if QgsWkbTypes.hasZ(layer.wkbType()):
93+
export_z = True
94+
zName = vector.createUniqueFieldName('zcoord', fields)
95+
fields.append(QgsField(zName, QVariant.Double))
96+
if QgsWkbTypes.hasM(layer.wkbType()):
97+
export_m = True
98+
zName = vector.createUniqueFieldName('mvalue', fields)
99+
fields.append(QgsField(zName, QVariant.Double))
90100

91101
writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(
92102
fields.toList(), layer.wkbType(), layer.crs())
@@ -130,6 +140,13 @@ def processAlgorithm(self, progress):
130140
attrs.append(attr1)
131141
if attr2 is not None:
132142
attrs.append(attr2)
143+
144+
# add point z/m
145+
if export_z:
146+
attrs.append(inGeom.geometry().z())
147+
if export_m:
148+
attrs.append(inGeom.geometry().m())
149+
133150
outFeat.setAttributes(attrs)
134151
writer.addFeature(outFeat)
135152

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<GMLFeatureClassList>
2+
<GMLFeatureClass>
3+
<Name>add_geometry_pointz</Name>
4+
<ElementPath>add_geometry_pointz</ElementPath>
5+
<GeometryType>-2147483647</GeometryType>
6+
<SRSName>EPSG:4326</SRSName>
7+
<DatasetSpecificInfo>
8+
<FeatureCount>9</FeatureCount>
9+
<ExtentXMin>0.00000</ExtentXMin>
10+
<ExtentXMax>8.00000</ExtentXMax>
11+
<ExtentYMin>-5.00000</ExtentYMin>
12+
<ExtentYMax>3.00000</ExtentYMax>
13+
</DatasetSpecificInfo>
14+
<PropertyDefn>
15+
<Name>xcoord</Name>
16+
<ElementPath>xcoord</ElementPath>
17+
<Type>Integer</Type>
18+
</PropertyDefn>
19+
<PropertyDefn>
20+
<Name>ycoord</Name>
21+
<ElementPath>ycoord</ElementPath>
22+
<Type>Integer</Type>
23+
</PropertyDefn>
24+
<PropertyDefn>
25+
<Name>zcoord</Name>
26+
<ElementPath>zcoord</ElementPath>
27+
<Type>Integer</Type>
28+
</PropertyDefn>
29+
</GMLFeatureClass>
30+
</GMLFeatureClassList>
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
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>0</gml:X><gml:Y>-5</gml:Y><gml:Z>0</gml:Z></gml:coord>
10+
<gml:coord><gml:X>8</gml:X><gml:Y>3</gml:Y><gml:Z>7</gml:Z></gml:coord>
11+
</gml:Box>
12+
</gml:boundedBy>
13+
14+
<gml:featureMember>
15+
<ogr:add_geometry_pointz fid="points.0">
16+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>1,1,3</gml:coordinates></gml:Point></ogr:geometryProperty>
17+
<ogr:xcoord>1</ogr:xcoord>
18+
<ogr:ycoord>1</ogr:ycoord>
19+
<ogr:zcoord>3</ogr:zcoord>
20+
</ogr:add_geometry_pointz>
21+
</gml:featureMember>
22+
<gml:featureMember>
23+
<ogr:add_geometry_pointz fid="points.1">
24+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>3,3,0</gml:coordinates></gml:Point></ogr:geometryProperty>
25+
<ogr:xcoord>3</ogr:xcoord>
26+
<ogr:ycoord>3</ogr:ycoord>
27+
<ogr:zcoord>0</ogr:zcoord>
28+
</ogr:add_geometry_pointz>
29+
</gml:featureMember>
30+
<gml:featureMember>
31+
<ogr:add_geometry_pointz fid="points.2">
32+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>2,2,2</gml:coordinates></gml:Point></ogr:geometryProperty>
33+
<ogr:xcoord>2</ogr:xcoord>
34+
<ogr:ycoord>2</ogr:ycoord>
35+
<ogr:zcoord>2</ogr:zcoord>
36+
</ogr:add_geometry_pointz>
37+
</gml:featureMember>
38+
<gml:featureMember>
39+
<ogr:add_geometry_pointz fid="points.3">
40+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>5,2,0</gml:coordinates></gml:Point></ogr:geometryProperty>
41+
<ogr:xcoord>5</ogr:xcoord>
42+
<ogr:ycoord>2</ogr:ycoord>
43+
<ogr:zcoord>0</ogr:zcoord>
44+
</ogr:add_geometry_pointz>
45+
</gml:featureMember>
46+
<gml:featureMember>
47+
<ogr:add_geometry_pointz fid="points.4">
48+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>4,1,0</gml:coordinates></gml:Point></ogr:geometryProperty>
49+
<ogr:xcoord>4</ogr:xcoord>
50+
<ogr:ycoord>1</ogr:ycoord>
51+
<ogr:zcoord>0</ogr:zcoord>
52+
</ogr:add_geometry_pointz>
53+
</gml:featureMember>
54+
<gml:featureMember>
55+
<ogr:add_geometry_pointz fid="points.5">
56+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>0,-5,5</gml:coordinates></gml:Point></ogr:geometryProperty>
57+
<ogr:xcoord>0</ogr:xcoord>
58+
<ogr:ycoord>-5</ogr:ycoord>
59+
<ogr:zcoord>5</ogr:zcoord>
60+
</ogr:add_geometry_pointz>
61+
</gml:featureMember>
62+
<gml:featureMember>
63+
<ogr:add_geometry_pointz fid="points.6">
64+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>8,-1,7</gml:coordinates></gml:Point></ogr:geometryProperty>
65+
<ogr:xcoord>8</ogr:xcoord>
66+
<ogr:ycoord>-1</ogr:ycoord>
67+
<ogr:zcoord>7</ogr:zcoord>
68+
</ogr:add_geometry_pointz>
69+
</gml:featureMember>
70+
<gml:featureMember>
71+
<ogr:add_geometry_pointz fid="points.7">
72+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>7,-1,6</gml:coordinates></gml:Point></ogr:geometryProperty>
73+
<ogr:xcoord>7</ogr:xcoord>
74+
<ogr:ycoord>-1</ogr:ycoord>
75+
<ogr:zcoord>6</ogr:zcoord>
76+
</ogr:add_geometry_pointz>
77+
</gml:featureMember>
78+
<gml:featureMember>
79+
<ogr:add_geometry_pointz fid="points.8">
80+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>0,-1,4</gml:coordinates></gml:Point></ogr:geometryProperty>
81+
<ogr:xcoord>0</ogr:xcoord>
82+
<ogr:ycoord>-1</ogr:ycoord>
83+
<ogr:zcoord>4</ogr:zcoord>
84+
</ogr:add_geometry_pointz>
85+
</gml:featureMember>
86+
</ogr:FeatureCollection>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<GMLFeatureClassList>
2+
<GMLFeatureClass>
3+
<Name>pointsz</Name>
4+
<ElementPath>pointsz</ElementPath>
5+
<GeometryType>-2147483647</GeometryType>
6+
<SRSName>EPSG:4326</SRSName>
7+
<DatasetSpecificInfo>
8+
<FeatureCount>9</FeatureCount>
9+
<ExtentXMin>0.00000</ExtentXMin>
10+
<ExtentXMax>8.00000</ExtentXMax>
11+
<ExtentYMin>-5.00000</ExtentYMin>
12+
<ExtentYMax>3.00000</ExtentYMax>
13+
</DatasetSpecificInfo>
14+
</GMLFeatureClass>
15+
</GMLFeatureClassList>
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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>0</gml:X><gml:Y>-5</gml:Y><gml:Z>0</gml:Z></gml:coord>
10+
<gml:coord><gml:X>8</gml:X><gml:Y>3</gml:Y><gml:Z>7</gml:Z></gml:coord>
11+
</gml:Box>
12+
</gml:boundedBy>
13+
14+
<gml:featureMember>
15+
<ogr:pointsz fid="points.0">
16+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>1,1,3</gml:coordinates></gml:Point></ogr:geometryProperty>
17+
</ogr:pointsz>
18+
</gml:featureMember>
19+
<gml:featureMember>
20+
<ogr:pointsz fid="points.1">
21+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>3,3,0</gml:coordinates></gml:Point></ogr:geometryProperty>
22+
</ogr:pointsz>
23+
</gml:featureMember>
24+
<gml:featureMember>
25+
<ogr:pointsz fid="points.2">
26+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>2,2,2</gml:coordinates></gml:Point></ogr:geometryProperty>
27+
</ogr:pointsz>
28+
</gml:featureMember>
29+
<gml:featureMember>
30+
<ogr:pointsz fid="points.3">
31+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>5,2,0</gml:coordinates></gml:Point></ogr:geometryProperty>
32+
</ogr:pointsz>
33+
</gml:featureMember>
34+
<gml:featureMember>
35+
<ogr:pointsz fid="points.4">
36+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>4,1,0</gml:coordinates></gml:Point></ogr:geometryProperty>
37+
</ogr:pointsz>
38+
</gml:featureMember>
39+
<gml:featureMember>
40+
<ogr:pointsz fid="points.5">
41+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>0,-5,5</gml:coordinates></gml:Point></ogr:geometryProperty>
42+
</ogr:pointsz>
43+
</gml:featureMember>
44+
<gml:featureMember>
45+
<ogr:pointsz fid="points.6">
46+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>8,-1,7</gml:coordinates></gml:Point></ogr:geometryProperty>
47+
</ogr:pointsz>
48+
</gml:featureMember>
49+
<gml:featureMember>
50+
<ogr:pointsz fid="points.7">
51+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>7,-1,6</gml:coordinates></gml:Point></ogr:geometryProperty>
52+
</ogr:pointsz>
53+
</gml:featureMember>
54+
<gml:featureMember>
55+
<ogr:pointsz fid="points.8">
56+
<ogr:geometryProperty><gml:Point srsName="EPSG:4326"><gml:coordinates>0,-1,4</gml:coordinates></gml:Point></ogr:geometryProperty>
57+
</ogr:pointsz>
58+
</gml:featureMember>
59+
</ogr:FeatureCollection>

python/plugins/processing/tests/testdata/qgis_algorithm_tests.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -993,3 +993,15 @@ tests:
993993
OUTPUT_LAYER:
994994
name: expected/smoothed_lines_max_angle.gml
995995
type: vector
996+
997+
- algorithm: qgis:exportaddgeometrycolumns
998+
name: Add Geometry PointZ
999+
params:
1000+
CALC_METHOD: '0'
1001+
INPUT:
1002+
name: pointsz.gml
1003+
type: vector
1004+
results:
1005+
OUTPUT:
1006+
name: expected/add_geometry_pointz.gml
1007+
type: vector

python/plugins/processing/tools/vector.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -269,14 +269,15 @@ def simpleMeasure(geom, method=0, ellips=None, crs=None):
269269
# 1 - project CRS
270270
# 2 - ellipsoidal
271271

272-
if geom.wkbType() in [QgsWkbTypes.Point, QgsWkbTypes.Point25D]:
273-
pt = geom.asPoint()
274-
attr1 = pt.x()
275-
attr2 = pt.y()
276-
elif geom.wkbType() in [QgsWkbTypes.MultiPoint, QgsWkbTypes.MultiPoint25D]:
277-
pt = geom.asMultiPoint()
278-
attr1 = pt[0].x()
279-
attr2 = pt[0].y()
272+
if geom.type() == QgsWkbTypes.PointGeometry:
273+
if not geom.isMultipart():
274+
pt = geom.geometry()
275+
attr1 = pt.x()
276+
attr2 = pt.y()
277+
else:
278+
pt = geom.asMultiPoint()
279+
attr1 = pt[0].x()
280+
attr2 = pt[0].y()
280281
else:
281282
measure = QgsDistanceArea()
282283

0 commit comments

Comments
 (0)