Skip to content

Commit

Permalink
Ensure that rendering point cloud using ramp by x or y value applies …
Browse files Browse the repository at this point in the history
…scale and offset

Sure, it's an extremely niche use case, but we may as well do things right!
  • Loading branch information
nyalldawson committed Dec 2, 2020
1 parent fc3d61a commit 3ae70c5
Show file tree
Hide file tree
Showing 6 changed files with 112 additions and 4 deletions.
6 changes: 6 additions & 0 deletions src/core/pointcloud/qgspointcloudattributebyramprenderer.cpp
Expand Up @@ -70,6 +70,8 @@ void QgsPointCloudAttributeByRampRenderer::renderBlock( const QgsPointCloudBlock
const bool considerZ = !zRange.isInfinite();

const bool applyZOffset = attribute->name() == QLatin1String( "Z" );
const bool applyXOffset = attribute->name() == QLatin1String( "X" );
const bool applyYOffset = attribute->name() == QLatin1String( "Y" );

int rendered = 0;
double x = 0;
Expand Down Expand Up @@ -110,6 +112,10 @@ void QgsPointCloudAttributeByRampRenderer::renderBlock( const QgsPointCloudBlock
double attributeValue = 0;
context.getAttribute( ptr, i * recordSize + attributeOffset, attributeType, attributeValue );

if ( applyXOffset )
attributeValue = context.offset().x() + context.scale().x() * attributeValue;
if ( applyYOffset )
attributeValue = context.offset().y() + context.scale().y() * attributeValue;
if ( applyZOffset )
attributeValue = context.offset().z() + context.scale().z() * attributeValue;

Expand Down
Expand Up @@ -29,10 +29,10 @@
<number>5</number>
</property>
<property name="minimum">
<double>-9999999.000000000000000</double>
<double>-9999999999.000000000000000</double>
</property>
<property name="maximum">
<double>999999.000000000000000</double>
<double>9999999999.000000000000000</double>
</property>
</widget>
</item>
Expand All @@ -49,10 +49,10 @@
<number>5</number>
</property>
<property name="minimum">
<double>-99999999.000000000000000</double>
<double>-9999999999.000000000000000</double>
</property>
<property name="maximum">
<double>999999.000000000000000</double>
<double>9999999999.000000000000000</double>
</property>
</widget>
</item>
Expand Down
102 changes: 102 additions & 0 deletions tests/src/python/test_qgspointcloudattributebyramprenderer.py
Expand Up @@ -154,6 +154,108 @@ def testRender(self):
TestQgsPointCloudAttributeByRampRenderer.report += renderchecker.report()
self.assertTrue(result)

@unittest.skipIf('ept' not in QgsProviderRegistry.instance().providerList(), 'EPT provider not available')
def testRenderX(self):
layer = QgsPointCloudLayer(unitTestDataPath() + '/point_clouds/ept/sunshine-coast/ept.json', 'test', 'ept')
self.assertTrue(layer.isValid())

renderer = QgsPointCloudAttributeByRampRenderer()
renderer.setAttribute('X')
renderer.setMinimum(498062.00000)
renderer.setMaximum(498067.39000)
ramp = QgsStyle.defaultStyle().colorRamp("Viridis")
shader = QgsColorRampShader(498062.00000, 498067.39000, ramp)
shader.classifyColorRamp()
renderer.setColorRampShader(shader)

layer.setRenderer(renderer)

layer.renderer().setPointSize(2)
layer.renderer().setPointSizeUnit(QgsUnitTypes.RenderMillimeters)

mapsettings = QgsMapSettings()
mapsettings.setOutputSize(QSize(400, 400))
mapsettings.setOutputDpi(96)
mapsettings.setDestinationCrs(layer.crs())
mapsettings.setExtent(QgsRectangle(498061, 7050991, 498069, 7050999))
mapsettings.setLayers([layer])

renderchecker = QgsMultiRenderChecker()
renderchecker.setMapSettings(mapsettings)
renderchecker.setControlPathPrefix('pointcloudrenderer')
renderchecker.setControlName('expected_ramp_xrender')
result = renderchecker.runTest('expected_ramp_xrender')
TestQgsPointCloudAttributeByRampRenderer.report += renderchecker.report()
self.assertTrue(result)

@unittest.skipIf('ept' not in QgsProviderRegistry.instance().providerList(), 'EPT provider not available')
def testRenderY(self):
layer = QgsPointCloudLayer(unitTestDataPath() + '/point_clouds/ept/sunshine-coast/ept.json', 'test', 'ept')
self.assertTrue(layer.isValid())

renderer = QgsPointCloudAttributeByRampRenderer()
renderer.setAttribute('Y')
renderer.setMinimum(7050992.84000)
renderer.setMaximum(7050997.04000)
ramp = QgsStyle.defaultStyle().colorRamp("Viridis")
shader = QgsColorRampShader(7050992.84000, 7050997.04000, ramp)
shader.classifyColorRamp()
renderer.setColorRampShader(shader)

layer.setRenderer(renderer)

layer.renderer().setPointSize(2)
layer.renderer().setPointSizeUnit(QgsUnitTypes.RenderMillimeters)

mapsettings = QgsMapSettings()
mapsettings.setOutputSize(QSize(400, 400))
mapsettings.setOutputDpi(96)
mapsettings.setDestinationCrs(layer.crs())
mapsettings.setExtent(QgsRectangle(498061, 7050991, 498069, 7050999))
mapsettings.setLayers([layer])

renderchecker = QgsMultiRenderChecker()
renderchecker.setMapSettings(mapsettings)
renderchecker.setControlPathPrefix('pointcloudrenderer')
renderchecker.setControlName('expected_ramp_yrender')
result = renderchecker.runTest('expected_ramp_yrender')
TestQgsPointCloudAttributeByRampRenderer.report += renderchecker.report()
self.assertTrue(result)

@unittest.skipIf('ept' not in QgsProviderRegistry.instance().providerList(), 'EPT provider not available')
def testRenderZ(self):
layer = QgsPointCloudLayer(unitTestDataPath() + '/point_clouds/ept/sunshine-coast/ept.json', 'test', 'ept')
self.assertTrue(layer.isValid())

renderer = QgsPointCloudAttributeByRampRenderer()
renderer.setAttribute('Z')
renderer.setMinimum(74.34000)
renderer.setMaximum(75)
ramp = QgsStyle.defaultStyle().colorRamp("Viridis")
shader = QgsColorRampShader(74.34000, 75, ramp)
shader.classifyColorRamp()
renderer.setColorRampShader(shader)

layer.setRenderer(renderer)

layer.renderer().setPointSize(2)
layer.renderer().setPointSizeUnit(QgsUnitTypes.RenderMillimeters)

mapsettings = QgsMapSettings()
mapsettings.setOutputSize(QSize(400, 400))
mapsettings.setOutputDpi(96)
mapsettings.setDestinationCrs(layer.crs())
mapsettings.setExtent(QgsRectangle(498061, 7050991, 498069, 7050999))
mapsettings.setLayers([layer])

renderchecker = QgsMultiRenderChecker()
renderchecker.setMapSettings(mapsettings)
renderchecker.setControlPathPrefix('pointcloudrenderer')
renderchecker.setControlName('expected_ramp_zrender')
result = renderchecker.runTest('expected_ramp_zrender')
TestQgsPointCloudAttributeByRampRenderer.report += renderchecker.report()
self.assertTrue(result)

@unittest.skipIf('ept' not in QgsProviderRegistry.instance().providerList(), 'EPT provider not available')
def testRenderCrsTransform(self):
layer = QgsPointCloudLayer(unitTestDataPath() + '/point_clouds/ept/sunshine-coast/ept.json', 'test', 'ept')
Expand Down
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 3ae70c5

Please sign in to comment.