18
18
from qgis .core import (QgsVectorLayer ,
19
19
QgsFeature ,
20
20
QgsGeometry ,
21
- QgsPointXY )
21
+ QgsPointXY ,
22
+ QgsFeatureRequest ,
23
+ QgsWkbTypes ,
24
+ QgsCoordinateReferenceSystem )
22
25
from qgis .PyQt .QtCore import QVariant
23
26
from qgis .testing import start_app , unittest
24
27
start_app ()
25
28
26
29
27
30
def createLayerWithFivePoints ():
28
- layer = QgsVectorLayer ("Point?field=fldtxt:string&field=fldint:integer" ,
31
+ layer = QgsVectorLayer ("Point?field=id:integer&field= fldtxt:string&field=fldint:integer" ,
29
32
"addfeat" , "memory" )
30
33
pr = layer .dataProvider ()
31
34
f = QgsFeature ()
32
- f .setAttributes (["test" , 1 ])
33
- f .setGeometry (QgsGeometry .fromPoint (QgsPointXY (100 , 200 )))
35
+ f .setAttributes ([1 , "test" , 1 ])
36
+ f .setGeometry (QgsGeometry .fromPoint (QgsPointXY (1 , 2 )))
34
37
f2 = QgsFeature ()
35
- f2 .setAttributes (["test2" , 3 ])
36
- f2 .setGeometry (QgsGeometry .fromPoint (QgsPointXY (200 , 200 )))
38
+ f2 .setAttributes ([2 , "test2" , 3 ])
39
+ f2 .setGeometry (QgsGeometry .fromPoint (QgsPointXY (2 , 2 )))
37
40
f3 = QgsFeature ()
38
- f3 .setAttributes (["test2" , 3 ])
39
- f3 .setGeometry (QgsGeometry .fromPoint (QgsPointXY (300 , 200 )))
41
+ f3 .setAttributes ([3 , "test2" , 3 ])
42
+ f3 .setGeometry (QgsGeometry .fromPoint (QgsPointXY (3 , 2 )))
40
43
f4 = QgsFeature ()
41
- f4 .setAttributes (["test3" , 3 ])
42
- f4 .setGeometry (QgsGeometry .fromPoint (QgsPointXY (400 , 300 )))
44
+ f4 .setAttributes ([4 , "test3" , 3 ])
45
+ f4 .setGeometry (QgsGeometry .fromPoint (QgsPointXY (4 , 3 )))
43
46
f5 = QgsFeature ()
44
- f5 .setAttributes (["test4" , 4 ])
47
+ f5 .setAttributes ([5 , "test4" , 4 ])
45
48
f5 .setGeometry (QgsGeometry .fromPoint (QgsPointXY (0 , 0 )))
46
49
assert pr .addFeatures ([f , f2 , f3 , f4 , f5 ])
47
50
assert layer .featureCount () == 5
@@ -59,8 +62,8 @@ def testUniqueValues(self):
59
62
layer = createLayerWithFivePoints ()
60
63
self .assertFalse (layer .dataProvider ().uniqueValues (- 1 ))
61
64
self .assertFalse (layer .dataProvider ().uniqueValues (100 ))
62
- self .assertEqual (layer .dataProvider ().uniqueValues (0 ), {'test' , 'test2' , 'test3' , 'test4' })
63
- self .assertEqual (layer .dataProvider ().uniqueValues (1 ), {1 , 3 , 3 , 4 })
65
+ self .assertEqual (layer .dataProvider ().uniqueValues (1 ), {'test' , 'test2' , 'test3' , 'test4' })
66
+ self .assertEqual (layer .dataProvider ().uniqueValues (2 ), {1 , 3 , 3 , 4 })
64
67
65
68
def testMinValues (self ):
66
69
"""
@@ -71,8 +74,8 @@ def testMinValues(self):
71
74
layer = createLayerWithFivePoints ()
72
75
self .assertFalse (layer .dataProvider ().minimumValue (- 1 ))
73
76
self .assertFalse (layer .dataProvider ().minimumValue (100 ))
74
- self .assertEqual (layer .dataProvider ().minimumValue (0 ), 'test' )
75
- self .assertEqual (layer .dataProvider ().minimumValue (1 ), 1 )
77
+ self .assertEqual (layer .dataProvider ().minimumValue (1 ), 'test' )
78
+ self .assertEqual (layer .dataProvider ().minimumValue (2 ), 1 )
76
79
77
80
def testMaxValues (self ):
78
81
"""
@@ -83,9 +86,89 @@ def testMaxValues(self):
83
86
layer = createLayerWithFivePoints ()
84
87
self .assertFalse (layer .dataProvider ().maximumValue (- 1 ))
85
88
self .assertFalse (layer .dataProvider ().maximumValue (100 ))
86
- self .assertEqual (layer .dataProvider ().maximumValue (0 ), 'test4' )
87
- self .assertEqual (layer .dataProvider ().maximumValue (1 ), 4 )
89
+ self .assertEqual (layer .dataProvider ().maximumValue (1 ), 'test4' )
90
+ self .assertEqual (layer .dataProvider ().maximumValue (2 ), 4 )
88
91
92
+ def testMaterialize (self ):
93
+ """
94
+ Test materializing layers
95
+ """
96
+
97
+ layer = createLayerWithFivePoints ()
98
+ original_features = {f [0 ]: f for f in layer .getFeatures ()}
99
+
100
+ # materialize all features, unchanged
101
+ request = QgsFeatureRequest ()
102
+ new_layer = layer .materialize (request )
103
+ self .assertEqual (new_layer .fields (), layer .fields ())
104
+ self .assertEqual (new_layer .crs (), layer .crs ())
105
+ self .assertEqual (new_layer .featureCount (), 5 )
106
+ self .assertEqual (new_layer .wkbType (), QgsWkbTypes .Point )
107
+ new_features = {f [0 ]: f for f in new_layer .getFeatures ()}
108
+ for id , f in original_features .items ():
109
+ self .assertEqual (new_features [id ].attributes (), f .attributes ())
110
+ self .assertEqual (new_features [id ].geometry ().exportToWkt (), f .geometry ().exportToWkt ())
111
+
112
+ # materialize with no geometry
113
+ request = QgsFeatureRequest ().setFlags (QgsFeatureRequest .NoGeometry )
114
+ new_layer = layer .materialize (request )
115
+ self .assertEqual (new_layer .fields (), layer .fields ())
116
+ self .assertEqual (new_layer .crs (), layer .crs ())
117
+ self .assertEqual (new_layer .featureCount (), 5 )
118
+ self .assertEqual (new_layer .wkbType (), QgsWkbTypes .NoGeometry )
119
+ new_features = {f [0 ]: f for f in new_layer .getFeatures ()}
120
+ for id , f in original_features .items ():
121
+ self .assertEqual (new_features [id ].attributes (), f .attributes ())
122
+
123
+ # materialize with reprojection
124
+ request = QgsFeatureRequest ().setDestinationCrs (QgsCoordinateReferenceSystem ('EPSG:3785' ))
125
+ new_layer = layer .materialize (request )
126
+ self .assertEqual (new_layer .fields (), layer .fields ())
127
+ self .assertEqual (new_layer .crs ().authid (), 'EPSG:3785' )
128
+ self .assertEqual (new_layer .featureCount (), 5 )
129
+ self .assertEqual (new_layer .wkbType (), QgsWkbTypes .Point )
130
+ new_features = {f [0 ]: f for f in new_layer .getFeatures ()}
131
+
132
+ expected_geometry = {1 : 'Point (111319 222684)' ,
133
+ 2 : 'Point (222639 222684)' ,
134
+ 3 : 'Point (333958 222684)' ,
135
+ 4 : 'Point (445278 334111)' ,
136
+ 5 : 'Point (0 -0)' }
137
+ for id , f in original_features .items ():
138
+ self .assertEqual (new_features [id ].attributes (), f .attributes ())
139
+ self .assertEqual (new_features [id ].geometry ().exportToWkt (0 ), expected_geometry [id ])
140
+
141
+ # materialize with attribute subset
142
+ request = QgsFeatureRequest ().setSubsetOfAttributes ([0 , 2 ])
143
+ new_layer = layer .materialize (request )
144
+ self .assertEqual (new_layer .fields ().count (), 2 )
145
+ self .assertEqual (new_layer .fields ().at (0 ), layer .fields ().at (0 ))
146
+ self .assertEqual (new_layer .fields ().at (1 ), layer .fields ().at (2 ))
147
+ self .assertEqual (new_layer .crs (), layer .crs ())
148
+ self .assertEqual (new_layer .featureCount (), 5 )
149
+ self .assertEqual (new_layer .wkbType (), QgsWkbTypes .Point )
150
+ new_features = {f .attributes ()[0 ]: f for f in new_layer .getFeatures ()}
151
+ for id , f in original_features .items ():
152
+ self .assertEqual (new_features [id ].attributes ()[0 ], f .attributes ()[0 ])
153
+ self .assertEqual (new_features [id ].attributes ()[1 ], f .attributes ()[2 ])
154
+
155
+ request = QgsFeatureRequest ().setSubsetOfAttributes ([0 , 1 ])
156
+ new_layer = layer .materialize (request )
157
+ self .assertEqual (new_layer .fields ().count (), 2 )
158
+ self .assertEqual (new_layer .fields ().at (0 ), layer .fields ().at (0 ))
159
+ self .assertEqual (new_layer .fields ().at (1 ), layer .fields ().at (1 ))
160
+ new_features = {f .attributes ()[0 ]: f for f in new_layer .getFeatures ()}
161
+ for id , f in original_features .items ():
162
+ self .assertEqual (new_features [id ].attributes ()[0 ], f .attributes ()[0 ])
163
+ self .assertEqual (new_features [id ].attributes ()[1 ], f .attributes ()[1 ])
164
+
165
+ request = QgsFeatureRequest ().setSubsetOfAttributes ([0 ])
166
+ new_layer = layer .materialize (request )
167
+ self .assertEqual (new_layer .fields ().count (), 1 )
168
+ self .assertEqual (new_layer .fields ().at (0 ), layer .fields ().at (0 ))
169
+ new_features = {f .attributes ()[0 ]: f for f in new_layer .getFeatures ()}
170
+ for id , f in original_features .items ():
171
+ self .assertEqual (new_features [id ].attributes ()[0 ], f .attributes ()[0 ])
89
172
90
173
if __name__ == '__main__' :
91
174
unittest .main ()
0 commit comments