From 1c47011fbbf1011fb59c51fbf56968f6ed9f0256 Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Thu, 7 Nov 2013 15:51:03 +0100 Subject: [PATCH] Use defined datum transform also in server and fix datum transform related bugs --- src/core/qgsmaprenderer.cpp | 14 ++++++++++++-- src/core/qgsmaprenderer.h | 1 + src/mapserver/qgsconfigparser.cpp | 5 +++++ src/mapserver/qgsconfigparser.h | 2 ++ src/mapserver/qgsprojectparser.cpp | 29 ++++++++++++++++++++++++++++- src/mapserver/qgsprojectparser.h | 2 ++ src/mapserver/qgswmsserver.cpp | 13 +++++++++++++ 7 files changed, 63 insertions(+), 3 deletions(-) diff --git a/src/core/qgsmaprenderer.cpp b/src/core/qgsmaprenderer.cpp index e8e35f0d9ce..12e86ad9926 100644 --- a/src/core/qgsmaprenderer.cpp +++ b/src/core/qgsmaprenderer.cpp @@ -1251,7 +1251,9 @@ const QgsCoordinateTransform* QgsMapRenderer::tr( const QgsMapLayer *layer ) con } QHash< QString, QgsLayerCoordinateTransform >::const_iterator ctIt = mLayerCoordinateTransformInfo.find( layer->id() ); - if ( ctIt != mLayerCoordinateTransformInfo.constEnd() ) + if ( ctIt != mLayerCoordinateTransformInfo.constEnd() + && ctIt->srcAuthId == layer->crs().authid() + && ctIt->destAuthId == mDestCRS->authid() ) { return QgsCoordinateTransformCache::instance()->transform( ctIt->srcAuthId, ctIt->destAuthId, ctIt->srcDatumTransform, ctIt->destDatumTransform ); } @@ -1262,7 +1264,10 @@ const QgsCoordinateTransform* QgsMapRenderer::tr( const QgsMapLayer *layer ) con //still not present? get coordinate transformation with -1/-1 datum transform as default ctIt = mLayerCoordinateTransformInfo.find( layer->id() ); - if ( ctIt == mLayerCoordinateTransformInfo.constEnd() ) + if ( ctIt == mLayerCoordinateTransformInfo.constEnd() + || ctIt->srcAuthId == layer->crs().authid() + || ctIt->destAuthId == mDestCRS->authid() + ) { return QgsCoordinateTransformCache::instance()->transform( layer->crs().authid(), mDestCRS->authid(), -1, -1 ); } @@ -1353,4 +1358,9 @@ void QgsMapRenderer::addLayerCoordinateTransform( const QString& layerId, const mLayerCoordinateTransformInfo.insert( layerId, lt ); } +void QgsMapRenderer::clearLayerCoordinateTransforms() +{ + mLayerCoordinateTransformInfo.clear(); +} + bool QgsMapRenderer::mDrawing = false; diff --git a/src/core/qgsmaprenderer.h b/src/core/qgsmaprenderer.h index 31b9e870a3f..3a9cd33dece 100644 --- a/src/core/qgsmaprenderer.h +++ b/src/core/qgsmaprenderer.h @@ -296,6 +296,7 @@ class CORE_EXPORT QgsMapRenderer : public QObject static QgsMapRenderer::BlendMode getBlendModeEnum( const QPainter::CompositionMode blendMode ); void addLayerCoordinateTransform( const QString& layerId, const QString& srcAuthId, const QString& destAuthId, int srcDatumTransform = -1, int destDatumTransform = -1 ); + void clearLayerCoordinateTransforms(); const QgsCoordinateTransform* tr( const QgsMapLayer *layer ) const; diff --git a/src/mapserver/qgsconfigparser.cpp b/src/mapserver/qgsconfigparser.cpp index 2c3ab9cee56..bd0a8a6381c 100644 --- a/src/mapserver/qgsconfigparser.cpp +++ b/src/mapserver/qgsconfigparser.cpp @@ -599,3 +599,8 @@ void QgsConfigParser::serviceCapabilities( QDomElement& parentElement, QDomDocum } } } + +QList< QPair< QString, QgsLayerCoordinateTransform > > QgsConfigParser::layerCoordinateTransforms() const +{ + return QList< QPair< QString, QgsLayerCoordinateTransform > >(); +} diff --git a/src/mapserver/qgsconfigparser.h b/src/mapserver/qgsconfigparser.h index 281a012fcfe..c5eaafe3bc0 100644 --- a/src/mapserver/qgsconfigparser.h +++ b/src/mapserver/qgsconfigparser.h @@ -164,6 +164,8 @@ class QgsConfigParser /**Applies configuration specific label settings*/ virtual void loadLabelSettings( QgsLabelingEngineInterface* lbl ) { Q_UNUSED( lbl ); } + virtual QList< QPair< QString, QgsLayerCoordinateTransform > > layerCoordinateTransforms() const; + protected: /**Parser to forward not resolved requests (e.g. SLD parser based on user request might have a fallback parser with admin configuration)*/ QgsConfigParser* mFallbackParser; diff --git a/src/mapserver/qgsprojectparser.cpp b/src/mapserver/qgsprojectparser.cpp index 87eb98fc7c7..b26737a1e9d 100644 --- a/src/mapserver/qgsprojectparser.cpp +++ b/src/mapserver/qgsprojectparser.cpp @@ -3661,7 +3661,7 @@ void QgsProjectParser::loadLabelSettings( QgsLabelingEngineInterface* lbl ) { pal->setShowingAllLabels( showAllLabelsElem.text().compare( "true", Qt::CaseInsensitive ) == 0 ); } - + //mShowingPartialsLabels QDomElement showPartialsLabelsElem = palElem.firstChildElement( "ShowingPartialsLabels" ); if ( !showPartialsLabelsElem.isNull() ) @@ -3670,3 +3670,30 @@ void QgsProjectParser::loadLabelSettings( QgsLabelingEngineInterface* lbl ) } } } + +QList< QPair< QString, QgsLayerCoordinateTransform > > QgsProjectParser::layerCoordinateTransforms() const +{ + QList< QPair< QString, QgsLayerCoordinateTransform > > layerTransformList; + + QDomElement coordTransformInfoElem = mXMLDoc->documentElement().firstChildElement( "mapcanvas" ).firstChildElement( "layer_coordinate_transform_info" ); + if ( coordTransformInfoElem.isNull() ) + { + return layerTransformList; + } + + QDomNodeList layerTransformNodeList = coordTransformInfoElem.elementsByTagName( "layer_coordinate_transform" ); + for ( int i = 0; i < layerTransformNodeList.size(); ++i ) + { + QPair< QString, QgsLayerCoordinateTransform > layerEntry; + QDomElement layerTransformElem = layerTransformNodeList.at( i ).toElement(); + layerEntry.first = layerTransformElem.attribute( "layerid" ); + QgsLayerCoordinateTransform t; + t.srcAuthId = layerTransformElem.attribute( "srcAuthId" ); + t.destAuthId = layerTransformElem.attribute( "destAuthId" ); + t.srcDatumTransform = layerTransformElem.attribute( "srcDatumTransform", "-1" ).toInt(); + t.destDatumTransform = layerTransformElem.attribute( "destDatumTransform", "-1" ).toInt(); + layerEntry.second = t; + layerTransformList.push_back( layerEntry ); + } + return layerTransformList; +} diff --git a/src/mapserver/qgsprojectparser.h b/src/mapserver/qgsprojectparser.h index 836570da481..13c088e6888 100644 --- a/src/mapserver/qgsprojectparser.h +++ b/src/mapserver/qgsprojectparser.h @@ -140,6 +140,8 @@ class QgsProjectParser: public QgsConfigParser void loadLabelSettings( QgsLabelingEngineInterface* lbl ); + QList< QPair< QString, QgsLayerCoordinateTransform > > layerCoordinateTransforms() const; + private: //forbidden diff --git a/src/mapserver/qgswmsserver.cpp b/src/mapserver/qgswmsserver.cpp index 0ce6f16865a..00f81c8745c 100644 --- a/src/mapserver/qgswmsserver.cpp +++ b/src/mapserver/qgswmsserver.cpp @@ -1136,6 +1136,7 @@ int QgsWMSServer::configureMapRender( const QPaintDevice* paintDevice ) const return 1; //paint device is needed for height, width, dpi } + mMapRenderer->clearLayerCoordinateTransforms(); mMapRenderer->setOutputSize( QSize( paintDevice->width(), paintDevice->height() ), paintDevice->logicalDpiX() ); //map extent @@ -1193,6 +1194,18 @@ int QgsWMSServer::configureMapRender( const QPaintDevice* paintDevice ) const mMapRenderer->setDestinationCrs( outputCRS ); mMapRenderer->setProjectionsEnabled( true ); mapUnits = outputCRS.mapUnits(); + + //read layer coordinate transforms from project file (e.g. ct with special datum shift) + if ( mConfigParser ) + { + QList< QPair< QString, QgsLayerCoordinateTransform > > lt = mConfigParser->layerCoordinateTransforms(); + QList< QPair< QString, QgsLayerCoordinateTransform > >::const_iterator ltIt = lt.constBegin(); + for ( ; ltIt != lt.constEnd(); ++ltIt ) + { + QgsLayerCoordinateTransform t = ltIt->second; + mMapRenderer->addLayerCoordinateTransform( ltIt->first, t.srcAuthId, t.destAuthId, t.srcDatumTransform, t.destDatumTransform ); + } + } } mMapRenderer->setMapUnits( mapUnits );