Skip to content

Commit ef9d272

Browse files
NEDJIMAbelgacemnyalldawson
authored andcommittedJan 4, 2021
make single click identify work
1 parent d40a9b7 commit ef9d272

File tree

4 files changed

+36
-9
lines changed

4 files changed

+36
-9
lines changed
 

‎python/core/auto_generated/pointcloud/qgspointclouddataprovider.sip.in

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,6 @@ Ctor
5656

5757
~QgsPointCloudDataProvider();
5858

59-
QVector<QMap<QString, QVariant>> identify( QgsPointCloudLayer *layer, float maximumError, float rootErrorPixels, QgsGeometry extentGeometry, const QgsDoubleRange extentZRange );
60-
%Docstring
61-
Returns the list of points of the point cloud layer ``layer`` according to a zoom level
62-
defined by ``maximumError`` and ``rootErrorPixels``, and an extent defined by a geometry
63-
in the 2D plane ``geometry`` and a range for z values ``extentZRange``
64-
%End
6559

6660
virtual QgsPointCloudDataProvider::Capabilities capabilities() const;
6761
%Docstring

‎src/core/pointcloud/qgspointclouddataprovider.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class CORE_EXPORT QgsPointCloudDataProvider: public QgsDataProvider
8282
* defined by \a maximumError and \a rootErrorPixels, and an extent defined by a geometry
8383
* in the 2D plane \a geometry and a range for z values \a extentZRange
8484
*/
85-
QVector<QMap<QString, QVariant>> identify( QgsPointCloudLayer *layer, float maximumError, float rootErrorPixels, QgsGeometry extentGeometry, const QgsDoubleRange extentZRange );
85+
QVector<QMap<QString, QVariant>> identify( QgsPointCloudLayer *layer, float maximumError, float rootErrorPixels, QgsGeometry extentGeometry, const QgsDoubleRange extentZRange ) SIP_SKIP;
8686

8787
/**
8888
* Returns flags containing the supported capabilities for the data provider.

‎src/core/pointcloud/qgspointcloudrenderer.cpp

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "qgspointcloudindex.h"
2424
#include "qgspointcloudlayerelevationproperties.h"
2525
#include "qgslogger.h"
26+
#include "qgscircle.h"
2627

2728
QgsPointCloudRenderContext::QgsPointCloudRenderContext( QgsRenderContext &context, const QgsVector3D &scale, const QgsVector3D &offset, double zValueScale, double zValueFixedOffset )
2829
: mRenderContext( context )
@@ -228,7 +229,38 @@ QVector<QMap<QString, QVariant>> QgsPointCloudRenderer::identify( QgsPointCloudL
228229

229230
float rootErrorPixels = rootErrorInMapCoordinates / mapUnitsPerPixel; // in pixels
230231

231-
QVector<QMap<QString, QVariant>> points = layer->dataProvider()->identify( layer, maximumError, rootErrorPixels, geometry, QgsDoubleRange() );
232+
QgsGeometry selectionGeometry = geometry;
233+
if ( geometry.type() == QgsWkbTypes::PointGeometry )
234+
{
235+
double x = geometry.asPoint().x();
236+
double y = geometry.asPoint().y();
237+
if ( pointSymbol() == QgsPointCloudRenderer::PointSymbol::Square )
238+
{
239+
QgsPointXY deviceCoords = context.renderContext().mapToPixel().transform( QgsPointXY( x, y ) );
240+
QgsPointXY point1( deviceCoords.x() - 2 * pointSize(), deviceCoords.y() - 2 * pointSize() );
241+
QgsPointXY point2( deviceCoords.x() + 2 * pointSize(), deviceCoords.y() + 2 * pointSize() );
242+
QgsPointXY point1MapCoords = context.renderContext().mapToPixel().toMapCoordinates( point1.x(), point1.y() );
243+
QgsPointXY point2MapCoords = context.renderContext().mapToPixel().toMapCoordinates( point2.x(), point2.y() );
244+
QgsRectangle pointRect( point1MapCoords, point2MapCoords );
245+
selectionGeometry = QgsGeometry::fromRect( pointRect );
246+
}
247+
else if ( pointSymbol() == QgsPointCloudRenderer::PointSymbol::Circle )
248+
{
249+
QgsPoint centerMapCoords( x, y );
250+
QgsPointXY deviceCoords = context.renderContext().mapToPixel().transform( centerMapCoords );
251+
QgsPoint point1( deviceCoords.x(), deviceCoords.y() - 2 * pointSize() );
252+
QgsPoint point2( deviceCoords.x(), deviceCoords.y() + 2 * pointSize() );
253+
QgsPointXY point1MapCoords = context.renderContext().mapToPixel().toMapCoordinates( point1.x(), point1.y() );
254+
QgsPointXY point2MapCoords = context.renderContext().mapToPixel().toMapCoordinates( point2.x(), point2.y() );
255+
QgsCircle circle = QgsCircle::from2Points( QgsPoint( point1MapCoords ), QgsPoint( point2MapCoords ) );
256+
// TODO: make this faster?
257+
QgsPolygon *polygon = circle.toPolygon( 5 );
258+
QgsGeometry circleGeometry( polygon );
259+
selectionGeometry = circleGeometry;
260+
}
261+
}
262+
263+
QVector<QMap<QString, QVariant>> points = layer->dataProvider()->identify( layer, maximumError, rootErrorPixels, selectionGeometry, QgsDoubleRange() );
232264

233265
for ( QMap<QString, QVariant> point : points )
234266
{

‎src/gui/qgsmaptoolidentify.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -509,13 +509,14 @@ bool QgsMapToolIdentify::identifyPointCloudLayer( QList<QgsMapToolIdentify::Iden
509509
{
510510
Q_UNUSED( identifyContext );
511511
QgsCoordinateTransform ct( mCanvas->mapSettings().destinationCrs(), layer->crs(), mCanvas->mapSettings().transformContext() );
512+
QgsPointCloudRenderer *renderer = layer->renderer();
512513

513514
QgsGeometry transformedGeometry = geometry;
515+
514516
if ( ct.isValid() )
515517
transformedGeometry.transform( ct );
516518

517519
QgsRenderContext context = QgsRenderContext::fromMapSettings( mCanvas->mapSettings() );
518-
QgsPointCloudRenderer *renderer = layer->renderer();
519520
QVector<QMap<QString, QVariant>> points = renderer->identify( layer, context, transformedGeometry );
520521
int id = 0;
521522
for ( QMap<QString, QVariant> pt : points )

0 commit comments

Comments
 (0)
Please sign in to comment.