Skip to content

Commit b5d0a4f

Browse files
nyalldawsonwonder-sk
authored andcommittedOct 1, 2023
Consider z scale and offset when calculating z range for tiled
scene layers
1 parent 43591ef commit b5d0a4f

File tree

2 files changed

+61
-1
lines changed

2 files changed

+61
-1
lines changed
 

‎src/core/tiledscene/qgstiledscenelayerelevationproperties.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,11 @@ QgsDoubleRange QgsTiledSceneLayerElevationProperties::calculateZRange( QgsMapLay
6767
{
6868
if ( QgsTiledSceneDataProvider *dp = tiledSceneLayer->dataProvider() )
6969
{
70-
return dp->zRange();
70+
const QgsDoubleRange providerRange = dp->zRange();
71+
if ( providerRange.isInfinite() || providerRange.isEmpty() )
72+
return QgsDoubleRange();
73+
74+
return QgsDoubleRange( dp->zRange().lower() * mZScale + mZOffset, dp->zRange().upper() * mZScale + mZOffset );
7175
}
7276
}
7377

‎tests/src/python/test_qgstiledsceneelevationproperties.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
__copyright__ = 'Copyright 2023, The QGIS Project'
1111

1212
import qgis # NOQA
13+
import tempfile
14+
import os
15+
1316
from qgis.PyQt.QtGui import QColor
1417
from qgis.PyQt.QtTest import QSignalSpy
1518
from qgis.PyQt.QtXml import QDomDocument
@@ -55,6 +58,59 @@ def testBasic(self):
5558
self.assertEqual(props2.zScale(), 2)
5659
self.assertEqual(props2.zOffset(), 0.5)
5760

61+
def testCalculateZRange(self):
62+
with tempfile.TemporaryDirectory() as temp_dir:
63+
tmp_file = os.path.join(temp_dir, "tileset.json")
64+
with open(tmp_file, "wt", encoding="utf-8") as f:
65+
f.write(
66+
"""
67+
{
68+
"asset": {
69+
"version": "1.1",
70+
"tilesetVersion": "e575c6f1"
71+
},
72+
"geometricError": 100,
73+
"root": {
74+
"boundingVolume": {
75+
"region": [
76+
-1.3197209591796106,
77+
0.6988424218,
78+
-1.3196390408203893,
79+
0.6989055782,
80+
1.2,
81+
67.00999999999999
82+
]
83+
},
84+
"geometricError": 100,
85+
"refine": "ADD",
86+
"children": []
87+
}
88+
}"""
89+
)
90+
91+
layer = QgsTiledSceneLayer(tmp_file, "my layer", "cesiumtiles")
92+
self.assertTrue(layer.dataProvider().isValid())
93+
self.assertEqual(layer.dataProvider().zRange().lower(), 1.2)
94+
self.assertEqual(layer.dataProvider().zRange().upper(), 67.00999999999999)
95+
96+
props = QgsTiledSceneLayerElevationProperties(layer)
97+
self.assertEqual(props.zScale(), 1.0)
98+
self.assertEqual(props.zOffset(), 0.0)
99+
100+
z_range = props.calculateZRange(layer)
101+
self.assertEqual(z_range.lower(), 1.2)
102+
self.assertEqual(z_range.upper(), 67.00999999999999)
103+
104+
props.setZOffset(10)
105+
z_range = props.calculateZRange(layer)
106+
self.assertEqual(z_range.lower(), 11.2)
107+
self.assertEqual(z_range.upper(), 77.00999999999999)
108+
109+
props.setZScale(2)
110+
z_range = props.calculateZRange(layer)
111+
self.assertEqual(z_range.lower(), 12.4)
112+
self.assertEqual(z_range.upper(), 144.01999999999998)
113+
58114

59115
if __name__ == '__main__':
60116
unittest.main()

0 commit comments

Comments
 (0)
Please sign in to comment.