Skip to content

Commit 7612e12

Browse files
committed
Store relation between layer and coordinate transform in maprenderer class
1 parent 39fd5b8 commit 7612e12

File tree

2 files changed

+105
-3
lines changed

2 files changed

+105
-3
lines changed

src/core/qgsmaprenderer.cpp

+91-2
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ void QgsMapRenderer::render( QPainter* painter, double* forceWidthScale )
412412
{
413413
r1 = mExtent;
414414
split = splitLayersExtent( ml, r1, r2 );
415-
ct = QgsCoordinateTransformCache::instance()->transform( ml->crs().authid(), mDestCRS->authid() );
415+
ct = tr( ml );
416416
mRenderContext.setExtent( r1 );
417417
QgsDebugMsg( " extent 1: " + r1.toString() );
418418
QgsDebugMsg( " extent 2: " + r2.toString() );
@@ -742,6 +742,8 @@ void QgsMapRenderer::setDestinationCrs( const QgsCoordinateReferenceSystem& crs
742742
QgsDebugMsg( "* DestCRS.srsid() = " + QString::number( crs.srsid() ) );
743743
if ( *mDestCRS != crs )
744744
{
745+
mLayerCoordinateTransformInfo.clear();
746+
745747
QgsRectangle rect;
746748
if ( !mExtent.isEmpty() )
747749
{
@@ -1026,6 +1028,27 @@ void QgsMapRenderer::setLayerSet( const QStringList& layers )
10261028
{
10271029
QgsDebugMsg( QString( "Entering: %1" ).arg( layers.join( ", " ) ) );
10281030
mLayerSet = layers;
1031+
1032+
//remove all entries in mLayerCoordinateTransformInfo which are not part of the layer set
1033+
if ( mLayerCoordinateTransformInfo.size() > 0 )
1034+
{
1035+
QSet<QString> layerSet = layers.toSet();
1036+
QStringList removeEntries;
1037+
QHash< QString, QgsLayerCoordinateTransform >::const_iterator lctIt = mLayerCoordinateTransformInfo.constBegin();
1038+
for ( ; lctIt != mLayerCoordinateTransformInfo.constEnd(); ++lctIt )
1039+
{
1040+
if ( !layerSet.contains( lctIt.key() ) )
1041+
{
1042+
removeEntries.push_back( lctIt.key() );
1043+
}
1044+
}
1045+
1046+
QStringList::const_iterator rIt = removeEntries.constBegin();
1047+
for ( ; rIt != removeEntries.constEnd(); ++rIt )
1048+
{
1049+
mLayerCoordinateTransformInfo.remove( *rIt );
1050+
}
1051+
}
10291052
updateFullExtent();
10301053
}
10311054

@@ -1101,6 +1124,31 @@ bool QgsMapRenderer::readXML( QDomNode & theNode )
11011124
aoi.setYMaximum( ymax );
11021125

11031126
setExtent( aoi );
1127+
1128+
mLayerCoordinateTransformInfo.clear();
1129+
QDomElement layerCoordTransformInfoElem = theNode.firstChildElement( "layer_coordinate_transform_info" );
1130+
if ( !layerCoordTransformInfoElem.isNull() )
1131+
{
1132+
QDomNodeList layerCoordinateTransformList = layerCoordTransformInfoElem.elementsByTagName( "layer_coordinate_transform" );
1133+
QDomElement layerCoordTransformElem;
1134+
for ( int i = 0; i < layerCoordinateTransformList.size(); ++i )
1135+
{
1136+
layerCoordTransformElem = layerCoordinateTransformList.at( i ).toElement();
1137+
QString layerId = layerCoordTransformElem.attribute( "layerid" );
1138+
if ( layerId.isEmpty() )
1139+
{
1140+
continue;
1141+
}
1142+
1143+
QgsLayerCoordinateTransform lct;
1144+
lct.srcAuthId = layerCoordTransformElem.attribute( "srcAuthId" );
1145+
lct.destAuthId = layerCoordTransformElem.attribute( "destAuthId" );
1146+
lct.srcDatumTransform = layerCoordTransformElem.attribute( "srcDatumTransform", "-1" ).toInt();
1147+
lct.destDatumTransform = layerCoordTransformElem.attribute( "destDatumTransform", "-1" ).toInt();
1148+
mLayerCoordinateTransformInfo.insert( layerId, lct );
1149+
}
1150+
}
1151+
11041152
return true;
11051153
}
11061154

@@ -1170,6 +1218,20 @@ bool QgsMapRenderer::writeXML( QDomNode & theNode, QDomDocument & theDoc )
11701218
theNode.appendChild( srsNode );
11711219
destinationCrs().writeXML( srsNode, theDoc );
11721220

1221+
// layer coordinate transform infos
1222+
QDomElement layerCoordTransformInfo = theDoc.createElement( "layer_coordinate_transform_info" );
1223+
QHash< QString, QgsLayerCoordinateTransform >::const_iterator coordIt = mLayerCoordinateTransformInfo.constBegin();
1224+
for ( ; coordIt != mLayerCoordinateTransformInfo.constEnd(); ++coordIt )
1225+
{
1226+
QDomElement layerCoordTransformElem = theDoc.createElement( "layer_coordinate_transform" );
1227+
layerCoordTransformElem.setAttribute( "layerid", coordIt.key() );
1228+
layerCoordTransformElem.setAttribute( "srcAuthId", coordIt->srcAuthId );
1229+
layerCoordTransformElem.setAttribute( "destAuthId", coordIt->destAuthId );
1230+
layerCoordTransformElem.setAttribute( "srcDatumTransform", QString::number( coordIt->srcDatumTransform ) );
1231+
layerCoordTransformElem.setAttribute( "destDatumTransform", QString::number( coordIt->destDatumTransform ) );
1232+
layerCoordTransformInfo.appendChild( layerCoordTransformElem );
1233+
}
1234+
theNode.appendChild( layerCoordTransformInfo );
11731235
return true;
11741236
}
11751237

@@ -1187,7 +1249,24 @@ const QgsCoordinateTransform* QgsMapRenderer::tr( QgsMapLayer *layer )
11871249
{
11881250
return 0;
11891251
}
1190-
return QgsCoordinateTransformCache::instance()->transform( layer->crs().authid(), mDestCRS->authid() );
1252+
1253+
QHash< QString, QgsLayerCoordinateTransform >::const_iterator ctIt = mLayerCoordinateTransformInfo.find( layer->id() );
1254+
if ( ctIt != mLayerCoordinateTransformInfo.constEnd() )
1255+
{
1256+
return QgsCoordinateTransformCache::instance()->transform( ctIt->srcAuthId, ctIt->destAuthId, ctIt->srcDatumTransform, ctIt->destDatumTransform );
1257+
}
1258+
else
1259+
{
1260+
emit datumTransformInfoRequested( layer, layer->crs().authid(), mDestCRS->authid() );
1261+
}
1262+
1263+
//still not present? get coordinate transformation with -1/-1 datum transform as default
1264+
ctIt = mLayerCoordinateTransformInfo.find( layer->id() );
1265+
if ( ctIt == mLayerCoordinateTransformInfo.constEnd() )
1266+
{
1267+
return QgsCoordinateTransformCache::instance()->transform( layer->crs().authid(), mDestCRS->authid(), -1, -1 );
1268+
}
1269+
return QgsCoordinateTransformCache::instance()->transform( ctIt->srcAuthId, ctIt->destAuthId, ctIt->srcDatumTransform, ctIt->destDatumTransform );
11911270
}
11921271

11931272
/** Returns a QPainter::CompositionMode corresponding to a QgsMapRenderer::BlendMode
@@ -1264,4 +1343,14 @@ QgsMapRenderer::BlendMode QgsMapRenderer::getBlendModeEnum( const QPainter::Comp
12641343
}
12651344
}
12661345

1346+
void QgsMapRenderer::addLayerCoordinateTransform( const QString& layerId, const QString& srcAuthId, const QString& destAuthId, int srcDatumTransform, int destDatumTransform )
1347+
{
1348+
QgsLayerCoordinateTransform lt;
1349+
lt.srcAuthId = srcAuthId;
1350+
lt.destAuthId = destAuthId;
1351+
lt.srcDatumTransform = srcDatumTransform;
1352+
lt.destDatumTransform = destDatumTransform;
1353+
mLayerCoordinateTransformInfo.insert( layerId, lt );
1354+
}
1355+
12671356
bool QgsMapRenderer::mDrawing = false;

src/core/qgsmaprenderer.h

+14-1
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,13 @@ class CORE_EXPORT QgsLabelingEngineInterface
110110
virtual QgsLabelingEngineInterface* clone() = 0;
111111
};
112112

113-
113+
struct CORE_EXPORT QgsLayerCoordinateTransform
114+
{
115+
QString srcAuthId;
116+
QString destAuthId;
117+
int srcDatumTransform; //-1 if unknown or not specified
118+
int destDatumTransform;
119+
};
114120

115121
/** \ingroup core
116122
* A non GUI class for rendering a map layer set onto a QPainter.
@@ -289,6 +295,8 @@ class CORE_EXPORT QgsMapRenderer : public QObject
289295
//! Added in 1.9
290296
static QgsMapRenderer::BlendMode getBlendModeEnum( const QPainter::CompositionMode blendMode );
291297

298+
void addLayerCoordinateTransform( const QString& layerId, const QString& srcAuthId, const QString& destAuthId, int srcDatumTransform = -1, int destDatumTransform = -1 );
299+
292300
signals:
293301

294302
void drawingProgress( int current, int total );
@@ -304,6 +312,9 @@ class CORE_EXPORT QgsMapRenderer : public QObject
304312
//! emitted when layer's draw() returned false
305313
void drawError( QgsMapLayer* );
306314

315+
//! Notifies higher level components to show the datum transform dialog and add a QgsLayerCoordinateTransformInfo for that layer
316+
void datumTransformInfoRequested( QgsMapLayer* ml, const QString& srcAuthId, const QString& destAuthId );
317+
307318
public slots:
308319

309320
//! called by signal from layer current being drawn
@@ -376,6 +387,8 @@ class CORE_EXPORT QgsMapRenderer : public QObject
376387
//! Locks rendering loop for concurrent draws
377388
QMutex mRenderMutex;
378389

390+
QHash< QString, QgsLayerCoordinateTransform > mLayerCoordinateTransformInfo;
391+
379392
private:
380393
const QgsCoordinateTransform* tr( QgsMapLayer *layer );
381394
};

0 commit comments

Comments
 (0)