|
33 | 33 | from test_qgsserver_wms import TestQgsServerWMSTestBase |
34 | 34 | from qgis.core import ( |
35 | 35 | QgsProject, |
| 36 | + QgsSymbol, |
| 37 | + QgsWkbTypes, |
36 | 38 | QgsMarkerSymbol, |
37 | 39 | QgsRuleBasedRenderer, |
38 | 40 | QgsVectorLayer, |
|
42 | 44 | QgsBufferServerRequest, |
43 | 45 | QgsBufferServerResponse, |
44 | 46 | QgsServer, |
45 | | - QgsServerRequest, |
46 | 47 | ) |
47 | 48 |
|
48 | 49 | # Strip path and content length because path may vary |
@@ -1286,6 +1287,61 @@ def testJsonSymbolMaxMinScale(self): |
1286 | 1287 | self.assertEqual(node['scaleMaxDenom'], 1000) |
1287 | 1288 | self.assertEqual(node['scaleMinDenom'], 10000) |
1288 | 1289 |
|
| 1290 | + def test_json_rule_based_max_min_scale_without_symbol(self): |
| 1291 | + """ Test min/max scale in rule based json export when a rule doesn't have a symbol. """ |
| 1292 | + root_rule = QgsRuleBasedRenderer.Rule(None) |
| 1293 | + |
| 1294 | + # Rule with symbol |
| 1295 | + high_scale_rule = QgsRuleBasedRenderer.Rule( |
| 1296 | + QgsSymbol.defaultSymbol(QgsWkbTypes.PointGeometry), |
| 1297 | + minimumScale=25000, maximumScale=1000, label='high-scale') |
| 1298 | + root_rule.appendChild(high_scale_rule) |
| 1299 | + |
| 1300 | + # Rule without symbol |
| 1301 | + low_scale_rule = QgsRuleBasedRenderer.Rule(None, minimumScale=100000, maximumScale=25000, label='low-scale') |
| 1302 | + |
| 1303 | + # Sub-rule with a symbol |
| 1304 | + sub_rule = QgsRuleBasedRenderer.Rule( |
| 1305 | + QgsSymbol.defaultSymbol(QgsWkbTypes.PointGeometry), label='low-scale-sub') |
| 1306 | + |
| 1307 | + low_scale_rule.appendChild(sub_rule) |
| 1308 | + root_rule.appendChild(low_scale_rule) |
| 1309 | + |
| 1310 | + layer = QgsVectorLayer("Point?field=fldtxt:string", "layer1", "memory") |
| 1311 | + layer.setRenderer(QgsRuleBasedRenderer(root_rule)) |
| 1312 | + |
| 1313 | + project = QgsProject() |
| 1314 | + project.addMapLayer(layer) |
| 1315 | + |
| 1316 | + server = QgsServer() |
| 1317 | + request = QgsBufferServerRequest( |
| 1318 | + "/?" |
| 1319 | + "SERVICE=WMS&" |
| 1320 | + "VERSION=1.3.0&" |
| 1321 | + "REQUEST=GetLegendGraphic&" |
| 1322 | + "LAYERS=layer1&" |
| 1323 | + "FORMAT=application/json" |
| 1324 | + ) |
| 1325 | + response = QgsBufferServerResponse() |
| 1326 | + server.handleRequest(request, response, project) |
| 1327 | + result = json.loads(bytes(response.body())) |
| 1328 | + |
| 1329 | + node = result['nodes'][0]['symbols'] |
| 1330 | + |
| 1331 | + # With icon |
| 1332 | + first_rule = node[0] |
| 1333 | + self.assertEqual(first_rule['scaleMaxDenom'], 25000) |
| 1334 | + self.assertEqual(first_rule['scaleMinDenom'], 1000) |
| 1335 | + self.assertEqual(first_rule['title'], 'high-scale') |
| 1336 | + self.assertIn('icon', first_rule) |
| 1337 | + |
| 1338 | + # Without icon |
| 1339 | + second_rule = node[1] |
| 1340 | + self.assertEqual(second_rule['scaleMaxDenom'], 100000) |
| 1341 | + self.assertEqual(second_rule['scaleMinDenom'], 25000) |
| 1342 | + self.assertEqual(second_rule['title'], 'low-scale') |
| 1343 | + self.assertNotIn('icon', second_rule) |
| 1344 | + |
1289 | 1345 | def testLegendPlaceholderIcon(self): |
1290 | 1346 | qs = "?" + "&".join(["%s=%s" % i for i in list({ |
1291 | 1347 | "MAP": self.testdata_path + 'test_project_legend_placeholder_image.qgs', |
|
0 commit comments