Skip to content

Commit

Permalink
Reintroduce datum transforms (were disabled during transition to MTR)
Browse files Browse the repository at this point in the history
  • Loading branch information
wonder-sk committed Jun 5, 2014
1 parent 9019805 commit a04ebf9
Show file tree
Hide file tree
Showing 15 changed files with 344 additions and 38 deletions.
1 change: 1 addition & 0 deletions python/core/core.sip
Expand Up @@ -25,6 +25,7 @@
%Include qgsdataitem.sip
%Include qgsdataprovider.sip
%Include qgsdatasourceuri.sip
%Include qgsdatumtransformstore.sip
%Include qgsdbfilterproxymodel.sip
%Include qgsdistancearea.sip
%Include qgseditorwidgetconfig.sip
Expand Down
34 changes: 34 additions & 0 deletions python/core/qgsdatumtransformstore.sip
@@ -0,0 +1,34 @@
/**
* @brief The QgsDatumTransformStore class keeps track of datum transformations
* as chosen by the user.
*
* @note added in 2.4
*/
class QgsDatumTransformStore
{
%TypeHeaderCode
#include <qgsdatumtransformstore.h>
%End

public:
explicit QgsDatumTransformStore( const QgsCoordinateReferenceSystem& destCrs );

void clear();

void setDestinationCrs( const QgsCoordinateReferenceSystem& destCrs );

void addEntry( const QString& layerId, const QString& srcAuthId, const QString& destAuthId, int srcDatumTransform, int destDatumTransform );

bool hasEntryForLayer( QgsMapLayer* layer ) const;

/** will return transform from layer's CRS to current destination CRS.
* Will emit datumTransformInfoRequested signal if the layer has no entry.
* Returns an instance from QgsCoordinateTransformCache
*/
const QgsCoordinateTransform* transformation( QgsMapLayer* layer ) const;

void readXML( const QDomNode& parentNode );

void writeXML( QDomNode& parentNode, QDomDocument& theDoc ) const;

};
9 changes: 9 additions & 0 deletions python/core/qgsmapsettings.sip
Expand Up @@ -80,6 +80,9 @@ class QgsMapSettings

// -- utility functions --

//const QgsDatumTransformStore& datumTransformStore() const;
QgsDatumTransformStore& datumTransformStore();

const QgsMapToPixel& mapToPixel() const;

/**
Expand Down Expand Up @@ -122,6 +125,12 @@ class QgsMapSettings
*/
QgsRectangle mapToLayerCoordinates( QgsMapLayer* theLayer, QgsRectangle rect ) const;

/**
* @brief Return coordinate transform from layer's CRS to destination CRS
* @param layer
* @return transform - may be null if the transform is not needed
*/
const QgsCoordinateTransform* layerTransfrom( QgsMapLayer *layer ) const;

//! returns current extent of layer set
QgsRectangle fullExtent() const;
Expand Down
2 changes: 2 additions & 0 deletions src/core/CMakeLists.txt
Expand Up @@ -74,6 +74,7 @@ SET(QGIS_CORE_SRCS
qgsdatadefined.cpp
qgsdatasourceuri.cpp
qgsdataitem.cpp
qgsdatumtransformstore.cpp
qgsdbfilterproxymodel.cpp
qgsdiagramrendererv2.cpp
qgsdistancearea.cpp
Expand Down Expand Up @@ -431,6 +432,7 @@ SET(QGIS_CORE_HDRS
qgsdatadefined.h
qgsdatasourceuri.h
qgsdataitem.h
qgsdatumtransformstore.h
qgsdistancearea.h
qgscsexception.h
qgseditorwidgetconfig.h
Expand Down
119 changes: 119 additions & 0 deletions src/core/qgsdatumtransformstore.cpp
@@ -0,0 +1,119 @@
/***************************************************************************
qgsdatumtransformstore.cpp
---------------------
begin : June 2014
copyright : (C) 2014 by Martin Dobias
email : wonder dot sk at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#include "qgsdatumtransformstore.h"

#include "qgscrscache.h"
#include "qgslogger.h"
#include "qgsmaplayer.h"

QgsDatumTransformStore::QgsDatumTransformStore( const QgsCoordinateReferenceSystem& destCrs )
: mDestCRS( destCrs )
{

}

void QgsDatumTransformStore::clear()
{
mEntries.clear();
}

void QgsDatumTransformStore::setDestinationCrs( const QgsCoordinateReferenceSystem& destCrs )
{
mDestCRS = destCrs;
clear();
}

void QgsDatumTransformStore::addEntry( const QString& layerId, const QString& srcAuthId, const QString& destAuthId, int srcDatumTransform, int destDatumTransform )
{
Entry lt;
lt.srcAuthId = srcAuthId;
lt.destAuthId = destAuthId;
lt.srcDatumTransform = srcDatumTransform;
lt.destDatumTransform = destDatumTransform;
mEntries.insert( layerId, lt );
}

bool QgsDatumTransformStore::hasEntryForLayer( QgsMapLayer* layer ) const
{
return mEntries.contains( layer->id() );
}

const QgsCoordinateTransform* QgsDatumTransformStore::transformation( QgsMapLayer* layer ) const
{
QString srcAuthId = layer->crs().authid();
QString dstAuthId = mDestCRS.authid();

if ( !layer || srcAuthId == dstAuthId )
{
return 0;
}

QHash< QString, Entry >::const_iterator ctIt = mEntries.find( layer->id() );
if ( ctIt != mEntries.constEnd() && ctIt->srcAuthId == srcAuthId && ctIt->destAuthId == dstAuthId )
{
return QgsCoordinateTransformCache::instance()->transform( ctIt->srcAuthId, ctIt->destAuthId, ctIt->srcDatumTransform, ctIt->destDatumTransform );
}
else
{
return QgsCoordinateTransformCache::instance()->transform( srcAuthId, dstAuthId, -1, -1 );
}
}

void QgsDatumTransformStore::readXML( const QDomNode& parentNode )
{
clear();

QDomElement layerCoordTransformInfoElem = parentNode.firstChildElement( "layer_coordinate_transform_info" );
if ( !layerCoordTransformInfoElem.isNull() )
{
QDomNodeList layerCoordinateTransformList = layerCoordTransformInfoElem.elementsByTagName( "layer_coordinate_transform" );
QDomElement layerCoordTransformElem;
for ( int i = 0; i < layerCoordinateTransformList.size(); ++i )
{
layerCoordTransformElem = layerCoordinateTransformList.at( i ).toElement();
QString layerId = layerCoordTransformElem.attribute( "layerid" );
if ( layerId.isEmpty() )
{
continue;
}

Entry lct;
lct.srcAuthId = layerCoordTransformElem.attribute( "srcAuthId" );
lct.destAuthId = layerCoordTransformElem.attribute( "destAuthId" );
lct.srcDatumTransform = layerCoordTransformElem.attribute( "srcDatumTransform", "-1" ).toInt();
lct.destDatumTransform = layerCoordTransformElem.attribute( "destDatumTransform", "-1" ).toInt();
mEntries.insert( layerId, lct );
}
}
}

void QgsDatumTransformStore::writeXML( QDomNode& parentNode, QDomDocument& theDoc ) const
{
// layer coordinate transform infos
QDomElement layerCoordTransformInfo = theDoc.createElement( "layer_coordinate_transform_info" );

for ( QHash< QString, Entry >::const_iterator coordIt = mEntries.constBegin(); coordIt != mEntries.constEnd(); ++coordIt )
{
QDomElement layerCoordTransformElem = theDoc.createElement( "layer_coordinate_transform" );
layerCoordTransformElem.setAttribute( "layerid", coordIt.key() );
layerCoordTransformElem.setAttribute( "srcAuthId", coordIt->srcAuthId );
layerCoordTransformElem.setAttribute( "destAuthId", coordIt->destAuthId );
layerCoordTransformElem.setAttribute( "srcDatumTransform", QString::number( coordIt->srcDatumTransform ) );
layerCoordTransformElem.setAttribute( "destDatumTransform", QString::number( coordIt->destDatumTransform ) );
layerCoordTransformInfo.appendChild( layerCoordTransformElem );
}
parentNode.appendChild( layerCoordTransformInfo );
}
70 changes: 70 additions & 0 deletions src/core/qgsdatumtransformstore.h
@@ -0,0 +1,70 @@
/***************************************************************************
qgsdatumtransformstore.h
---------------------
begin : June 2014
copyright : (C) 2014 by Martin Dobias
email : wonder dot sk at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGSDATUMTRANSFORMSTORE_H
#define QGSDATUMTRANSFORMSTORE_H

#include "qgscoordinatereferencesystem.h"

class QgsCoordinateTransform;
class QgsMapLayer;

class QDomElement;


/**
* @brief The QgsDatumTransformStore class keeps track of datum transformations
* as chosen by the user.
*
* @note added in 2.4
*/
class CORE_EXPORT QgsDatumTransformStore
{
public:
explicit QgsDatumTransformStore( const QgsCoordinateReferenceSystem& destCrs );

void clear();

void setDestinationCrs( const QgsCoordinateReferenceSystem& destCrs );

void addEntry( const QString& layerId, const QString& srcAuthId, const QString& destAuthId, int srcDatumTransform, int destDatumTransform );

bool hasEntryForLayer( QgsMapLayer* layer ) const;

/** will return transform from layer's CRS to current destination CRS.
* Will emit datumTransformInfoRequested signal if the layer has no entry.
* Returns an instance from QgsCoordinateTransformCache
*/
const QgsCoordinateTransform* transformation( QgsMapLayer* layer ) const;

void readXML( const QDomNode& parentNode );

void writeXML( QDomNode& parentNode, QDomDocument& theDoc ) const;

struct Entry
{
QString srcAuthId;
QString destAuthId;
int srcDatumTransform; //-1 if unknown or not specified
int destDatumTransform;
};

protected:
QgsCoordinateReferenceSystem mDestCRS;

//! key = layer ID
QHash< QString, Entry > mEntries;
};

#endif // QGSDATUMTRANSFORMSTORE_H
4 changes: 2 additions & 2 deletions src/core/qgsmaprendererjob.cpp
Expand Up @@ -408,7 +408,7 @@ void QgsMapRendererJob::drawOldLabeling( const QgsMapSettings& settings, QgsRend

if ( settings.hasCrsTransformEnabled() )
{
ct = QgsCoordinateTransformCache::instance()->transform( ml->crs().authid(), settings.destinationCrs().authid() );
ct = settings.layerTransfrom( ml );
reprojectToLayerExtent( ct, ml->crs().geographicFlag(), r1, r2 );
}

Expand Down Expand Up @@ -571,7 +571,7 @@ LayerRenderJobs QgsMapRendererJob::prepareJobs( QPainter* painter, QgsPalLabelin

if ( mSettings.hasCrsTransformEnabled() )
{
ct = QgsCoordinateTransformCache::instance()->transform( ml->crs().authid(), mSettings.destinationCrs().authid() );
ct = mSettings.layerTransfrom( ml );
reprojectToLayerExtent( ct, ml->crs().geographicFlag(), r1, r2 );
QgsDebugMsg( "extent: " + r1.toString() );
if ( !r1.isFinite() || !r2.isFinite() )
Expand Down

0 comments on commit a04ebf9

Please sign in to comment.