Skip to content

Commit

Permalink
Remove context-unaware QgsCoordinateTransform constructors from Pytho…
Browse files Browse the repository at this point in the history
…n bindings

This forces Python code and plugins to become datum transform
aware, and given that upgrading python code is easy (just
add QgsProject.instance() as a new argument to the constructor)
it's relatively painless to force this on PyQGIS users.

Also fix upgrade the easy QgsCoordinateTransform c++ constructors
where the project is available, or where using QgsProject::instance()
is safe to do.

For others, just avoid the deprecated warnings until we can
get access to the correct project instance where the transform
is being constructed.
  • Loading branch information
nyalldawson committed Dec 15, 2017
1 parent 91e0afb commit 86d9492
Show file tree
Hide file tree
Showing 80 changed files with 208 additions and 88 deletions.
5 changes: 3 additions & 2 deletions doc/api_break.dox
Expand Up @@ -914,11 +914,12 @@ called if changes are made to the CRS database.
QgsCoordinateTransform {#qgis_api_break_3_0_QgsCoordinateTransform}
----------------------

- QgsCoordinateTransform is no longer a QObject. readXml, writeXml and initialize are all normal public members now,
- QgsCoordinateTransform is no longer a QObject. Initialize is a normal public members now,
not slots. The invalidTransformInput() signal has been removed.
- The extra QgsCoordinateTransform constructors (those not taking QgsCoordinateReferenceSystem arguments) have been
removed. Now, QgsCoordinateTransform must be created using an already existing source and destination
QgsCoordinateReferenceSystem object.
QgsCoordinateReferenceSystem object, and either a QgsCoordinateTransformContext object or a reference to the
current project instance.
- QgsCoordinateTransform::clone() has been removed. Just use direct copies instead.
- sourceCrs() and destCrs() now return a copy instead of a reference to the CRS. This has no effect on PyQGIS code, but c++
plugins calling these methods will need to be updated.
Expand Down
7 changes: 0 additions & 7 deletions python/core/qgscoordinatetransform.sip
Expand Up @@ -45,13 +45,6 @@ class QgsCoordinateTransform
Default constructor, creates an invalid QgsCoordinateTransform.
%End

explicit QgsCoordinateTransform( const QgsCoordinateReferenceSystem &source,
const QgsCoordinateReferenceSystem &destination );
%Docstring
Constructs a QgsCoordinateTransform using QgsCoordinateReferenceSystem objects.
\param source source CRS, typically of the layer's coordinate system
\param destination CRS, typically of the map canvas coordinate system
%End

explicit QgsCoordinateTransform( const QgsCoordinateReferenceSystem &source,
const QgsCoordinateReferenceSystem &destination,
Expand Down
6 changes: 3 additions & 3 deletions python/plugins/MetaSearch/dialogs/maindialog.py
Expand Up @@ -39,7 +39,7 @@

from qgis.core import (QgsApplication, QgsCoordinateReferenceSystem,
QgsCoordinateTransform, QgsGeometry, QgsPointXY,
QgsProviderRegistry, QgsSettings)
QgsProviderRegistry, QgsSettings, QgsProject)
from qgis.gui import QgsRubberBand
from qgis.utils import OverrideCursor

Expand Down Expand Up @@ -400,7 +400,7 @@ def set_bbox_from_map(self):
if crsid != 4326: # reproject to EPSG:4326
src = QgsCoordinateReferenceSystem(crsid)
dest = QgsCoordinateReferenceSystem(4326)
xform = QgsCoordinateTransform(src, dest)
xform = QgsCoordinateTransform(src, dest, QgsProject.instance())
minxy = xform.transform(QgsPointXY(extent.xMinimum(),
extent.yMinimum()))
maxxy = xform.transform(QgsPointXY(extent.xMaximum(),
Expand Down Expand Up @@ -570,7 +570,7 @@ def record_clicked(self):
dst = self.map.mapSettings().destinationCrs()
geom = QgsGeometry.fromWkt(points)
if src.postgisSrid() != dst.postgisSrid():
ctr = QgsCoordinateTransform(src, dst)
ctr = QgsCoordinateTransform(src, dst, QgsProject.instance())
try:
geom.transform(ctr)
except Exception as err:
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/algs/qgis/ExportGeometryInfo.py
Expand Up @@ -126,7 +126,7 @@ def processAlgorithm(self, parameters, context, feedback):
self.distance_area.setSourceCrs(source.sourceCrs())
self.distance_area.setEllipsoid(context.project().ellipsoid())
elif method == 1:
coordTransform = QgsCoordinateTransform(source.sourceCrs(), context.project().crs())
coordTransform = QgsCoordinateTransform(source.sourceCrs(), context.project().crs(), context.project())

features = source.getFeatures()
total = 100.0 / source.featureCount() if source.featureCount() else 0
Expand Down
4 changes: 3 additions & 1 deletion python/plugins/processing/algs/qgis/FindProjection.py
Expand Up @@ -34,6 +34,7 @@
QgsFields,
QgsCoordinateReferenceSystem,
QgsCoordinateTransform,
QgsCoordinateTransformContext,
QgsWkbTypes,
QgsProcessingParameterFeatureSource,
QgsProcessingParameterExtent,
Expand Down Expand Up @@ -108,6 +109,7 @@ def processAlgorithm(self, parameters, context, feedback):

found_results = 0

transform_context = QgsCoordinateTransformContext()
for current, srs_id in enumerate(crses_to_check):
if feedback.isCanceled():
break
Expand All @@ -116,7 +118,7 @@ def processAlgorithm(self, parameters, context, feedback):
if not candidate_crs.isValid():
continue

transform_candidate = QgsCoordinateTransform(candidate_crs, target_crs)
transform_candidate = QgsCoordinateTransform(candidate_crs, target_crs, transform_context)
transformed_bounds = QgsGeometry(layer_bounds)
try:
if not transformed_bounds.transform(transform_candidate) == 0:
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/algs/qgis/SpatialJoinSummary.py
Expand Up @@ -262,7 +262,7 @@ def addField(original, stat, type):
total = 100.0 / source.featureCount() if source.featureCount() else 0

# bounding box transform
bbox_transform = QgsCoordinateTransform(source.sourceCrs(), join_source.sourceCrs())
bbox_transform = QgsCoordinateTransform(source.sourceCrs(), join_source.sourceCrs(), context.project())

for current, f in enumerate(features):
if feedback.isCanceled():
Expand Down
3 changes: 2 additions & 1 deletion src/analysis/processing/qgsalgorithmtransform.cpp
Expand Up @@ -75,6 +75,7 @@ QgsTransformAlgorithm *QgsTransformAlgorithm::createInstance() const
bool QgsTransformAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
{
mDestCrs = parameterAsCrs( parameters, QStringLiteral( "TARGET_CRS" ), context );
mTransformContext = context.project() ? context.project()->transformContext() : QgsCoordinateTransformContext();
return true;
}

Expand All @@ -84,7 +85,7 @@ QgsFeature QgsTransformAlgorithm::processFeature( const QgsFeature &f, QgsProces
if ( !mCreatedTransform )
{
mCreatedTransform = true;
mTransform = QgsCoordinateTransform( sourceCrs(), mDestCrs );
mTransform = QgsCoordinateTransform( sourceCrs(), mDestCrs, mTransformContext );
}

if ( feature.hasGeometry() )
Expand Down
1 change: 1 addition & 0 deletions src/analysis/processing/qgsalgorithmtransform.h
Expand Up @@ -56,6 +56,7 @@ class QgsTransformAlgorithm : public QgsProcessingFeatureBasedAlgorithm
bool mCreatedTransform = false;
QgsCoordinateReferenceSystem mDestCrs;
QgsCoordinateTransform mTransform;
QgsCoordinateTransformContext mTransformContext;

};

Expand Down
6 changes: 3 additions & 3 deletions src/app/composer/qgscomposermapwidget.cpp
Expand Up @@ -314,7 +314,7 @@ void QgsComposerMapWidget::mapCrsChanged( const QgsCoordinateReferenceSystem &cr
QgsRectangle newExtent;
try
{
QgsCoordinateTransform xForm( oldCrs, crs.isValid() ? crs : QgsProject::instance()->crs() );
QgsCoordinateTransform xForm( oldCrs, crs.isValid() ? crs : QgsProject::instance()->crs(), QgsProject::instance() );
QgsRectangle prevExtent = *mComposerMap->currentMapExtent();
newExtent = xForm.transformBoundingBox( prevExtent );
updateExtent = true;
Expand Down Expand Up @@ -513,7 +513,7 @@ void QgsComposerMapWidget::mSetToMapCanvasExtentButton_clicked()
try
{
QgsCoordinateTransform xForm( QgisApp::instance()->mapCanvas()->mapSettings().destinationCrs(),
mComposerMap->crs() );
mComposerMap->crs(), QgsProject::instance() );
newExtent = xForm.transformBoundingBox( newExtent );
}
catch ( QgsCsException & )
Expand Down Expand Up @@ -546,7 +546,7 @@ void QgsComposerMapWidget::mViewExtentInCanvasButton_clicked()
try
{
QgsCoordinateTransform xForm( mComposerMap->crs(),
QgisApp::instance()->mapCanvas()->mapSettings().destinationCrs() );
QgisApp::instance()->mapCanvas()->mapSettings().destinationCrs(), QgsProject::instance() );
currentMapExtent = xForm.transformBoundingBox( currentMapExtent );
}
catch ( QgsCsException & )
Expand Down
10 changes: 5 additions & 5 deletions src/app/gps/qgsgpsinformationwidget.cpp
Expand Up @@ -684,7 +684,7 @@ void QgsGPSInformationWidget::displayGPSInformation( const QgsGPSInformation &in
if ( radRecenterMap->isChecked() || radRecenterWhenNeeded->isChecked() )
{
QgsCoordinateReferenceSystem mypSRS = mpCanvas->mapSettings().destinationCrs();
QgsCoordinateTransform myTransform( mWgs84CRS, mypSRS ); // use existing WGS84 CRS
QgsCoordinateTransform myTransform( mWgs84CRS, mypSRS, QgsProject::instance() ); // use existing WGS84 CRS

QgsPointXY myPoint = myTransform.transform( myNewCenter );
//keep the extent the same just center the map canvas in the display so our feature is in the middle
Expand Down Expand Up @@ -758,7 +758,7 @@ void QgsGPSInformationWidget::addVertex()
QgsPointXY myPoint;
if ( mpCanvas )
{
QgsCoordinateTransform t( mWgs84CRS, mpCanvas->mapSettings().destinationCrs() );
QgsCoordinateTransform t( mWgs84CRS, mpCanvas->mapSettings().destinationCrs(), QgsProject::instance() );
myPoint = t.transform( mLastGpsPosition );
}
else
Expand Down Expand Up @@ -809,7 +809,7 @@ void QgsGPSInformationWidget::mBtnCloseFeature_clicked()
{
QgsFeature *f = new QgsFeature( 0 );

QgsCoordinateTransform t( mWgs84CRS, vlayer->crs() );
QgsCoordinateTransform t( mWgs84CRS, vlayer->crs(), QgsProject::instance() );
QgsPointXY myPoint = t.transform( mLastGpsPosition );
double x = myPoint.x();
double y = myPoint.y();
Expand Down Expand Up @@ -864,7 +864,7 @@ void QgsGPSInformationWidget::mBtnCloseFeature_clicked()
{
QgsPointXY savePoint = *it;
// transform the gps point into the layer crs
QgsCoordinateTransform t( mWgs84CRS, vlayer->crs() );
QgsCoordinateTransform t( mWgs84CRS, vlayer->crs(), QgsProject::instance() );
QgsPointXY myPoint = t.transform( savePoint );

wkbPtr << myPoint.x() << myPoint.y();
Expand All @@ -887,7 +887,7 @@ void QgsGPSInformationWidget::mBtnCloseFeature_clicked()
{
QgsPointXY savePoint = *it;
// transform the gps point into the layer crs
QgsCoordinateTransform t( mWgs84CRS, vlayer->crs() );
QgsCoordinateTransform t( mWgs84CRS, vlayer->crs(), QgsProject::instance() );
QgsPointXY myPoint = t.transform( savePoint );
wkbPtr << myPoint.x() << myPoint.y();
}
Expand Down
3 changes: 2 additions & 1 deletion src/app/gps/qgsgpsmarker.cpp
Expand Up @@ -19,6 +19,7 @@
#include "qgscoordinatetransform.h"
#include "qgsmapcanvas.h"
#include "qgsexception.h"
#include "qgsproject.h"

QgsGpsMarker::QgsGpsMarker( QgsMapCanvas *mapCanvas )
: QgsMapCanvasItem( mapCanvas )
Expand All @@ -42,7 +43,7 @@ void QgsGpsMarker::setCenter( const QgsPointXY &point )
//transform to map crs
if ( mMapCanvas )
{
QgsCoordinateTransform t( mWgs84CRS, mMapCanvas->mapSettings().destinationCrs() );
QgsCoordinateTransform t( mWgs84CRS, mMapCanvas->mapSettings().destinationCrs(), QgsProject::instance() );
try
{
mCenter = t.transform( point );
Expand Down
3 changes: 2 additions & 1 deletion src/app/nodetool/qgsnodeeditor.cpp
Expand Up @@ -22,6 +22,7 @@
#include "qgsvertexentry.h"
#include "qgsvectorlayer.h"
#include "qgsgeometryutils.h"
#include "qgsproject.h"

#include <QTableWidget>
#include <QHeaderView>
Expand Down Expand Up @@ -366,7 +367,7 @@ void QgsNodeEditor::zoomToNode( int idx )
double y = mSelectedFeature->vertexMap().at( idx )->point().y();
QgsPointXY newCenter( x, y );

QgsCoordinateTransform t( mLayer->crs(), mCanvas->mapSettings().destinationCrs() );
QgsCoordinateTransform t( mLayer->crs(), mCanvas->mapSettings().destinationCrs(), QgsProject::instance() );
QgsPointXY tCenter = t.transform( newCenter );

QPolygonF ext = mCanvas->mapSettings().visiblePolygon();
Expand Down
6 changes: 3 additions & 3 deletions src/app/qgisapp.cpp
Expand Up @@ -5759,7 +5759,7 @@ void QgisApp::dxfExport()
//extent
if ( d.exportMapExtent() )
{
QgsCoordinateTransform t( mapCanvas()->mapSettings().destinationCrs(), d.crs() );
QgsCoordinateTransform t( mapCanvas()->mapSettings().destinationCrs(), d.crs(), QgsProject::instance() );
dxfExport.setExtent( t.transformBoundingBox( mapCanvas()->extent() ) );
}
}
Expand Down Expand Up @@ -7019,7 +7019,7 @@ void QgisApp::saveAsVectorFileGeneral( QgsVectorLayer *vlayer, bool symbologyOpt

if ( destCRS.isValid() && destCRS != vlayer->crs() )
{
ct = QgsCoordinateTransform( vlayer->crs(), destCRS );
ct = QgsCoordinateTransform( vlayer->crs(), destCRS, QgsProject::instance() );

//ask user about datum transformation
QgsSettings settings;
Expand Down Expand Up @@ -9493,7 +9493,7 @@ void QgisApp::legendLayerZoomNative()
QSize s = mMapCanvas->mapSettings().outputSize();
QgsPointXY p1( e.center().x(), e.center().y() );
QgsPointXY p2( e.center().x() + e.width() / s.width(), e.center().y() + e.height() / s.height() );
QgsCoordinateTransform ct( mMapCanvas->mapSettings().destinationCrs(), layer->crs() );
QgsCoordinateTransform ct( mMapCanvas->mapSettings().destinationCrs(), layer->crs(), QgsProject::instance() );
p1 = ct.transform( p1 );
p2 = ct.transform( p2 );
double width = std::sqrt( p1.sqrDist( p2 ) ); // width (actually the diagonal) of reprojected pixel
Expand Down
2 changes: 1 addition & 1 deletion src/app/qgsbookmarks.cpp
Expand Up @@ -253,7 +253,7 @@ void QgsBookmarks::zoomToBookmark()
authid != QgisApp::instance()->mapCanvas()->mapSettings().destinationCrs().authid() )
{
QgsCoordinateTransform ct( QgsCoordinateReferenceSystem::fromOgcWmsCrs( authid ),
QgisApp::instance()->mapCanvas()->mapSettings().destinationCrs() );
QgisApp::instance()->mapCanvas()->mapSettings().destinationCrs(), QgsProject::instance() );
rect = ct.transform( rect );
if ( rect.isEmpty() )
{
Expand Down
3 changes: 2 additions & 1 deletion src/app/qgsclipboard.cpp
Expand Up @@ -38,6 +38,7 @@
#include "qgssettings.h"
#include "qgisapp.h"
#include "qgsmapcanvas.h"
#include "qgsproject.h"

QgsClipboard::QgsClipboard()
{
Expand Down Expand Up @@ -277,7 +278,7 @@ QgsFeatureList QgsClipboard::transformedCopyOf( const QgsCoordinateReferenceSyst
}
else
{
ct = QgsCoordinateTransform( crs(), destCRS );
ct = QgsCoordinateTransform( crs(), destCRS, QgsProject::instance() );
}

QgsDebugMsg( "transforming clipboard." );
Expand Down
2 changes: 1 addition & 1 deletion src/app/qgsdecorationlayoutextent.cpp
Expand Up @@ -139,7 +139,7 @@ void QgsDecorationLayoutExtent::render( const QgsMapSettings &mapSettings, QgsRe
{
// reproject extent
QgsCoordinateTransform ct( map->crs(),
mapSettings.destinationCrs() );
mapSettings.destinationCrs(), QgsProject::instance() );
g = g.densifyByCount( 20 );
try
{
Expand Down
6 changes: 3 additions & 3 deletions src/app/qgsmapcanvasdockwidget.cpp
Expand Up @@ -322,7 +322,7 @@ void QgsMapCanvasDockWidget::syncViewCenter( QgsMapCanvas *sourceCanvas )

// reproject extent
QgsCoordinateTransform ct( sourceCanvas->mapSettings().destinationCrs(),
destCanvas->mapSettings().destinationCrs() );
destCanvas->mapSettings().destinationCrs(), QgsProject::instance() );
try
{
destCanvas->setCenter( ct.transform( sourceCanvas->center() ) );
Expand Down Expand Up @@ -412,7 +412,7 @@ void QgsMapCanvasDockWidget::syncMarker( const QgsPointXY &p )

// reproject point
QgsCoordinateTransform ct( mMainCanvas->mapSettings().destinationCrs(),
mMapCanvas->mapSettings().destinationCrs() );
mMapCanvas->mapSettings().destinationCrs(), QgsProject::instance() );
QgsPointXY t = p;
try
{
Expand Down Expand Up @@ -450,7 +450,7 @@ void QgsMapCanvasDockWidget::updateExtentRect()
{
// reproject extent
QgsCoordinateTransform ct( mMainCanvas->mapSettings().destinationCrs(),
mMapCanvas->mapSettings().destinationCrs() );
mMapCanvas->mapSettings().destinationCrs(), QgsProject::instance() );
g = g.densifyByCount( 5 );
try
{
Expand Down
2 changes: 1 addition & 1 deletion src/app/qgsmaptoolannotation.cpp
Expand Up @@ -359,7 +359,7 @@ QgsPointXY QgsMapToolAnnotation::transformCanvasToAnnotation( QgsPointXY p, QgsA
{
if ( annotation->mapPositionCrs() != mCanvas->mapSettings().destinationCrs() )
{
QgsCoordinateTransform transform( mCanvas->mapSettings().destinationCrs(), annotation->mapPositionCrs() );
QgsCoordinateTransform transform( mCanvas->mapSettings().destinationCrs(), annotation->mapPositionCrs(), QgsProject::instance() );
try
{
p = transform.transform( p );
Expand Down
3 changes: 2 additions & 1 deletion src/app/qgsmaptoolselectutils.cpp
Expand Up @@ -28,6 +28,7 @@ email : jpalmer at linz dot govt dot nz
#include "qgsexception.h"
#include "qgslogger.h"
#include "qgis.h"
#include "qgsproject.h"

#include <QMouseEvent>
#include <QApplication>
Expand Down Expand Up @@ -176,7 +177,7 @@ QgsFeatureIds QgsMapToolSelectUtils::getMatchingFeatures( QgsMapCanvas *canvas,

try
{
QgsCoordinateTransform ct( canvas->mapSettings().destinationCrs(), vlayer->crs() );
QgsCoordinateTransform ct( canvas->mapSettings().destinationCrs(), vlayer->crs(), QgsProject::instance() );

if ( !ct.isShortCircuited() && selectGeomTrans.type() == QgsWkbTypes::PolygonGeometry )
{
Expand Down
2 changes: 1 addition & 1 deletion src/app/qgsmaptoolshowhidelabels.cpp
Expand Up @@ -199,7 +199,7 @@ bool QgsMapToolShowHideLabels::selectedFeatures( QgsVectorLayer *vlayer,

try
{
QgsCoordinateTransform ct( mCanvas->mapSettings().destinationCrs(), vlayer->crs() );
QgsCoordinateTransform ct( mCanvas->mapSettings().destinationCrs(), vlayer->crs(), QgsProject::instance() );
selectGeomTrans.transform( ct );
}
catch ( QgsCsException &cse )
Expand Down
3 changes: 2 additions & 1 deletion src/app/qgsmeasuretool.cpp
Expand Up @@ -26,6 +26,7 @@
#include "qgsmeasuretool.h"
#include "qgsmessagelog.h"
#include "qgssettings.h"
#include "qgsproject.h"

#include <QMessageBox>
#include <QMouseEvent>
Expand Down Expand Up @@ -133,7 +134,7 @@ void QgsMeasureTool::updateSettings()

mDialog->restart();
mDone = lastDone;
QgsCoordinateTransform ct( mDestinationCrs, mCanvas->mapSettings().destinationCrs() );
QgsCoordinateTransform ct( mDestinationCrs, mCanvas->mapSettings().destinationCrs(), QgsProject::instance() );

Q_FOREACH ( const QgsPointXY &previousPoint, points )
{
Expand Down
2 changes: 1 addition & 1 deletion src/app/qgsprojectproperties.cpp
Expand Up @@ -163,7 +163,7 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas *mapCanvas, QWidget *pa
{
// reproject extent
QgsCoordinateTransform ct( QgsProject::instance()->crs(),
QgsCoordinateReferenceSystem::fromEpsgId( 4326 ) );
QgsCoordinateReferenceSystem::fromEpsgId( 4326 ), QgsProject::instance() );

g = g.densifyByCount( 5 );
try
Expand Down
2 changes: 1 addition & 1 deletion src/core/composer/qgscomposerattributetablev2.cpp
Expand Up @@ -413,7 +413,7 @@ bool QgsComposerAttributeTableV2::getTableContents( QgsComposerTableContents &co
if ( layer )
{
//transform back to layer CRS
QgsCoordinateTransform coordTransform( layer->crs(), mComposerMap->crs() );
QgsCoordinateTransform coordTransform( layer->crs(), mComposerMap->crs(), mComposition->project() );
try
{
selectionRect = coordTransform.transformBoundingBox( selectionRect, QgsCoordinateTransform::ReverseTransform );
Expand Down
2 changes: 1 addition & 1 deletion src/core/composer/qgscomposermap.cpp
Expand Up @@ -1890,7 +1890,7 @@ QPointF QgsComposerMap::composerMapPosForItem( const QgsAnnotation *annotation )
if ( annotationCrs != crs() )
{
//need to reproject
QgsCoordinateTransform t( annotationCrs, crs() );
QgsCoordinateTransform t( annotationCrs, crs(), mComposition->project() );
double z = 0.0;
t.transformInPlace( mapX, mapY, z );
}
Expand Down

0 comments on commit 86d9492

Please sign in to comment.