Skip to content

Commit

Permalink
Respect transform contexts when tracing
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Jan 4, 2018
1 parent 13ad760 commit 8f15cdf
Show file tree
Hide file tree
Showing 9 changed files with 51 additions and 32 deletions.
8 changes: 8 additions & 0 deletions doc/api_break.dox
Expand Up @@ -2133,6 +2133,12 @@ loadDefaultStyle argument.
signals now accept a QgsRasterBlockFeedback argument for reporting progress updates.


QgsRasterLayerSaveAsDialog {#qgis_api_break_3_0_QgsRasterLayerSaveAsDialog}
--------------------------

- The currentExtent and currentCrs arguments have been dropped from the constructor. Use setMapCanvas() instead.


QgsRasterProjector {#qgis_api_break_3_0_QgsRasterProjector}
------------------

Expand Down Expand Up @@ -2524,6 +2530,8 @@ QgsTracer {#qgis_api_break_3_0_QgsTracer}
---------

- hasCrsTransformEnabled() and setCrsTransformEnabled() were removed. CRS transformation is now always enabled when required.
- setDestinationCrs() now requires a QgsCoordinateTransformContext argument.


QgsTransaction {#qgis_api_break_3_0_QgsTransaction}
--------------
Expand Down
11 changes: 8 additions & 3 deletions python/core/qgstracer.sip
Expand Up @@ -43,11 +43,16 @@ Set layers used for tracing

QgsCoordinateReferenceSystem destinationCrs() const;
%Docstring
Get CRS used for tracing
Returns the CRS used for tracing.

.. seealso:: :py:func:`setDestinationCrs()`
%End
void setDestinationCrs( const QgsCoordinateReferenceSystem &crs );

void setDestinationCrs( const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context );
%Docstring
Set CRS used for tracing
Sets the ``crs`` and transform ``context`` used for tracing.

.. seealso:: :py:func:`destinationCrs()`
%End

QgsRectangle extent() const;
Expand Down
7 changes: 7 additions & 0 deletions python/gui/qgsmapcanvas.sip
Expand Up @@ -898,6 +898,13 @@ Emitted when zoom next status changed
Emitted when map CRS has changed

.. versionadded:: 2.4
%End

void transformContextChanged();
%Docstring
Emitted when the canvas transform context is changed.

.. versionadded:: 3.0
%End

void currentLayerChanged( QgsMapLayer *layer );
Expand Down
29 changes: 5 additions & 24 deletions src/core/qgstracer.cpp
Expand Up @@ -473,37 +473,20 @@ bool QgsTracer::initGraph()

t1.start();
int featuresCounted = 0;
Q_FOREACH ( QgsVectorLayer *vl, mLayers )
for ( QgsVectorLayer *vl : qgis::as_const( mLayers ) )
{
Q_NOWARN_DEPRECATED_PUSH
QgsCoordinateTransform ct( vl->crs(), mCRS );
Q_NOWARN_DEPRECATED_POP

QgsFeatureRequest request;
request.setSubsetOfAttributes( QgsAttributeList() );
request.setDestinationCrs( mCRS, mTransformContext );
if ( !mExtent.isEmpty() )
request.setFilterRect( ct.transformBoundingBox( mExtent, QgsCoordinateTransform::ReverseTransform ) );
request.setFilterRect( mExtent );

QgsFeatureIterator fi = vl->getFeatures( request );
while ( fi.nextFeature( f ) )
{
if ( !f.hasGeometry() )
continue;

if ( !ct.isShortCircuited() )
{
try
{
QgsGeometry transformedGeom = f.geometry();
transformedGeom.transform( ct );
f.setGeometry( transformedGeom );
}
catch ( QgsCsException & )
{
continue; // ignore if the transform failed
}
}

extractLinework( f.geometry(), mpl );

++featuresCounted;
Expand Down Expand Up @@ -596,12 +579,10 @@ void QgsTracer::setLayers( const QList<QgsVectorLayer *> &layers )
invalidateGraph();
}

void QgsTracer::setDestinationCrs( const QgsCoordinateReferenceSystem &crs )
void QgsTracer::setDestinationCrs( const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context )
{
if ( mCRS == crs )
return;

mCRS = crs;
mTransformContext = context;
invalidateGraph();
}

Expand Down
15 changes: 12 additions & 3 deletions src/core/qgstracer.h
Expand Up @@ -53,10 +53,17 @@ class CORE_EXPORT QgsTracer : public QObject
//! Set layers used for tracing
void setLayers( const QList<QgsVectorLayer *> &layers );

//! Get CRS used for tracing
/**
* Returns the CRS used for tracing.
* \see setDestinationCrs()
*/
QgsCoordinateReferenceSystem destinationCrs() const { return mCRS; }
//! Set CRS used for tracing
void setDestinationCrs( const QgsCoordinateReferenceSystem &crs );

/**
* Sets the \a crs and transform \a context used for tracing.
* \see destinationCrs()
*/
void setDestinationCrs( const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context );

//! Get extent to which graph's features will be limited (empty extent means no limit)
QgsRectangle extent() const { return mExtent; }
Expand Down Expand Up @@ -161,6 +168,8 @@ class CORE_EXPORT QgsTracer : public QObject
QList<QgsVectorLayer *> mLayers;
//! Destination CRS in which graph is built and tracing done
QgsCoordinateReferenceSystem mCRS;
//! Coordinate transform context
QgsCoordinateTransformContext mTransformContext;
//! Extent for graph building (empty extent means no limit)
QgsRectangle mExtent;

Expand Down
1 change: 1 addition & 0 deletions src/gui/qgsmapcanvas.cpp
Expand Up @@ -144,6 +144,7 @@ QgsMapCanvas::QgsMapCanvas( QWidget *parent )
this, [ = ]
{
mSettings.setTransformContext( QgsProject::instance()->transformContext() );
emit transformContextChanged();
refresh();
} );

Expand Down
6 changes: 6 additions & 0 deletions src/gui/qgsmapcanvas.h
Expand Up @@ -801,6 +801,12 @@ class GUI_EXPORT QgsMapCanvas : public QGraphicsView
*/
void destinationCrsChanged();

/**
* Emitted when the canvas transform context is changed.
* \since QGIS 3.0
*/
void transformContextChanged();

/**
* Emitted when the current layer is changed
* \since QGIS 2.8
Expand Down
3 changes: 2 additions & 1 deletion src/gui/qgsmapcanvastracer.cpp
Expand Up @@ -39,6 +39,7 @@ QgsMapCanvasTracer::QgsMapCanvasTracer( QgsMapCanvas *canvas, QgsMessageBar *mes

// when things change we just invalidate the graph - and set up new parameters again only when necessary
connect( canvas, &QgsMapCanvas::destinationCrsChanged, this, &QgsMapCanvasTracer::invalidateGraph );
connect( canvas, &QgsMapCanvas::transformContextChanged, this, &QgsMapCanvasTracer::invalidateGraph );
connect( canvas, &QgsMapCanvas::layersChanged, this, &QgsMapCanvasTracer::invalidateGraph );
connect( canvas, &QgsMapCanvas::extentsChanged, this, &QgsMapCanvasTracer::invalidateGraph );
connect( canvas, &QgsMapCanvas::currentLayerChanged, this, &QgsMapCanvasTracer::onCurrentLayerChanged );
Expand Down Expand Up @@ -96,7 +97,7 @@ void QgsMapCanvasTracer::reportError( QgsTracer::PathError err, bool addingVerte

void QgsMapCanvasTracer::configure()
{
setDestinationCrs( mCanvas->mapSettings().destinationCrs() );
setDestinationCrs( mCanvas->mapSettings().destinationCrs(), mCanvas->mapSettings().transformContext() );
setExtent( mCanvas->extent() );

QList<QgsVectorLayer *> layers;
Expand Down
3 changes: 2 additions & 1 deletion tests/src/core/testqgstracer.cpp
Expand Up @@ -313,7 +313,8 @@ void TestQgsTracer::testReprojection()

QgsTracer tracer;
tracer.setLayers( QList<QgsVectorLayer *>() << vl );
tracer.setDestinationCrs( dstCrs );
QgsCoordinateTransformContext context;
tracer.setDestinationCrs( dstCrs, context );
tracer.init();

QgsPolylineXY points1 = tracer.findShortestPath( p1, p2 );
Expand Down

0 comments on commit 8f15cdf

Please sign in to comment.