Skip to content

Commit a04ebf9

Browse files
committedJun 5, 2014
Reintroduce datum transforms (were disabled during transition to MTR)
1 parent 9019805 commit a04ebf9

15 files changed

+344
-38
lines changed
 

‎python/core/core.sip

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
%Include qgsdataitem.sip
2626
%Include qgsdataprovider.sip
2727
%Include qgsdatasourceuri.sip
28+
%Include qgsdatumtransformstore.sip
2829
%Include qgsdbfilterproxymodel.sip
2930
%Include qgsdistancearea.sip
3031
%Include qgseditorwidgetconfig.sip
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/**
2+
* @brief The QgsDatumTransformStore class keeps track of datum transformations
3+
* as chosen by the user.
4+
*
5+
* @note added in 2.4
6+
*/
7+
class QgsDatumTransformStore
8+
{
9+
%TypeHeaderCode
10+
#include <qgsdatumtransformstore.h>
11+
%End
12+
13+
public:
14+
explicit QgsDatumTransformStore( const QgsCoordinateReferenceSystem& destCrs );
15+
16+
void clear();
17+
18+
void setDestinationCrs( const QgsCoordinateReferenceSystem& destCrs );
19+
20+
void addEntry( const QString& layerId, const QString& srcAuthId, const QString& destAuthId, int srcDatumTransform, int destDatumTransform );
21+
22+
bool hasEntryForLayer( QgsMapLayer* layer ) const;
23+
24+
/** will return transform from layer's CRS to current destination CRS.
25+
* Will emit datumTransformInfoRequested signal if the layer has no entry.
26+
* Returns an instance from QgsCoordinateTransformCache
27+
*/
28+
const QgsCoordinateTransform* transformation( QgsMapLayer* layer ) const;
29+
30+
void readXML( const QDomNode& parentNode );
31+
32+
void writeXML( QDomNode& parentNode, QDomDocument& theDoc ) const;
33+
34+
};

‎python/core/qgsmapsettings.sip

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ class QgsMapSettings
8080

8181
// -- utility functions --
8282

83+
//const QgsDatumTransformStore& datumTransformStore() const;
84+
QgsDatumTransformStore& datumTransformStore();
85+
8386
const QgsMapToPixel& mapToPixel() const;
8487

8588
/**
@@ -122,6 +125,12 @@ class QgsMapSettings
122125
*/
123126
QgsRectangle mapToLayerCoordinates( QgsMapLayer* theLayer, QgsRectangle rect ) const;
124127

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

126135
//! returns current extent of layer set
127136
QgsRectangle fullExtent() const;

‎src/core/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ SET(QGIS_CORE_SRCS
7474
qgsdatadefined.cpp
7575
qgsdatasourceuri.cpp
7676
qgsdataitem.cpp
77+
qgsdatumtransformstore.cpp
7778
qgsdbfilterproxymodel.cpp
7879
qgsdiagramrendererv2.cpp
7980
qgsdistancearea.cpp
@@ -431,6 +432,7 @@ SET(QGIS_CORE_HDRS
431432
qgsdatadefined.h
432433
qgsdatasourceuri.h
433434
qgsdataitem.h
435+
qgsdatumtransformstore.h
434436
qgsdistancearea.h
435437
qgscsexception.h
436438
qgseditorwidgetconfig.h

‎src/core/qgsdatumtransformstore.cpp

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
/***************************************************************************
2+
qgsdatumtransformstore.cpp
3+
---------------------
4+
begin : June 2014
5+
copyright : (C) 2014 by Martin Dobias
6+
email : wonder dot sk at gmail dot com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
16+
#include "qgsdatumtransformstore.h"
17+
18+
#include "qgscrscache.h"
19+
#include "qgslogger.h"
20+
#include "qgsmaplayer.h"
21+
22+
QgsDatumTransformStore::QgsDatumTransformStore( const QgsCoordinateReferenceSystem& destCrs )
23+
: mDestCRS( destCrs )
24+
{
25+
26+
}
27+
28+
void QgsDatumTransformStore::clear()
29+
{
30+
mEntries.clear();
31+
}
32+
33+
void QgsDatumTransformStore::setDestinationCrs( const QgsCoordinateReferenceSystem& destCrs )
34+
{
35+
mDestCRS = destCrs;
36+
clear();
37+
}
38+
39+
void QgsDatumTransformStore::addEntry( const QString& layerId, const QString& srcAuthId, const QString& destAuthId, int srcDatumTransform, int destDatumTransform )
40+
{
41+
Entry lt;
42+
lt.srcAuthId = srcAuthId;
43+
lt.destAuthId = destAuthId;
44+
lt.srcDatumTransform = srcDatumTransform;
45+
lt.destDatumTransform = destDatumTransform;
46+
mEntries.insert( layerId, lt );
47+
}
48+
49+
bool QgsDatumTransformStore::hasEntryForLayer( QgsMapLayer* layer ) const
50+
{
51+
return mEntries.contains( layer->id() );
52+
}
53+
54+
const QgsCoordinateTransform* QgsDatumTransformStore::transformation( QgsMapLayer* layer ) const
55+
{
56+
QString srcAuthId = layer->crs().authid();
57+
QString dstAuthId = mDestCRS.authid();
58+
59+
if ( !layer || srcAuthId == dstAuthId )
60+
{
61+
return 0;
62+
}
63+
64+
QHash< QString, Entry >::const_iterator ctIt = mEntries.find( layer->id() );
65+
if ( ctIt != mEntries.constEnd() && ctIt->srcAuthId == srcAuthId && ctIt->destAuthId == dstAuthId )
66+
{
67+
return QgsCoordinateTransformCache::instance()->transform( ctIt->srcAuthId, ctIt->destAuthId, ctIt->srcDatumTransform, ctIt->destDatumTransform );
68+
}
69+
else
70+
{
71+
return QgsCoordinateTransformCache::instance()->transform( srcAuthId, dstAuthId, -1, -1 );
72+
}
73+
}
74+
75+
void QgsDatumTransformStore::readXML( const QDomNode& parentNode )
76+
{
77+
clear();
78+
79+
QDomElement layerCoordTransformInfoElem = parentNode.firstChildElement( "layer_coordinate_transform_info" );
80+
if ( !layerCoordTransformInfoElem.isNull() )
81+
{
82+
QDomNodeList layerCoordinateTransformList = layerCoordTransformInfoElem.elementsByTagName( "layer_coordinate_transform" );
83+
QDomElement layerCoordTransformElem;
84+
for ( int i = 0; i < layerCoordinateTransformList.size(); ++i )
85+
{
86+
layerCoordTransformElem = layerCoordinateTransformList.at( i ).toElement();
87+
QString layerId = layerCoordTransformElem.attribute( "layerid" );
88+
if ( layerId.isEmpty() )
89+
{
90+
continue;
91+
}
92+
93+
Entry lct;
94+
lct.srcAuthId = layerCoordTransformElem.attribute( "srcAuthId" );
95+
lct.destAuthId = layerCoordTransformElem.attribute( "destAuthId" );
96+
lct.srcDatumTransform = layerCoordTransformElem.attribute( "srcDatumTransform", "-1" ).toInt();
97+
lct.destDatumTransform = layerCoordTransformElem.attribute( "destDatumTransform", "-1" ).toInt();
98+
mEntries.insert( layerId, lct );
99+
}
100+
}
101+
}
102+
103+
void QgsDatumTransformStore::writeXML( QDomNode& parentNode, QDomDocument& theDoc ) const
104+
{
105+
// layer coordinate transform infos
106+
QDomElement layerCoordTransformInfo = theDoc.createElement( "layer_coordinate_transform_info" );
107+
108+
for ( QHash< QString, Entry >::const_iterator coordIt = mEntries.constBegin(); coordIt != mEntries.constEnd(); ++coordIt )
109+
{
110+
QDomElement layerCoordTransformElem = theDoc.createElement( "layer_coordinate_transform" );
111+
layerCoordTransformElem.setAttribute( "layerid", coordIt.key() );
112+
layerCoordTransformElem.setAttribute( "srcAuthId", coordIt->srcAuthId );
113+
layerCoordTransformElem.setAttribute( "destAuthId", coordIt->destAuthId );
114+
layerCoordTransformElem.setAttribute( "srcDatumTransform", QString::number( coordIt->srcDatumTransform ) );
115+
layerCoordTransformElem.setAttribute( "destDatumTransform", QString::number( coordIt->destDatumTransform ) );
116+
layerCoordTransformInfo.appendChild( layerCoordTransformElem );
117+
}
118+
parentNode.appendChild( layerCoordTransformInfo );
119+
}

‎src/core/qgsdatumtransformstore.h

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/***************************************************************************
2+
qgsdatumtransformstore.h
3+
---------------------
4+
begin : June 2014
5+
copyright : (C) 2014 by Martin Dobias
6+
email : wonder dot sk at gmail dot com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
#ifndef QGSDATUMTRANSFORMSTORE_H
16+
#define QGSDATUMTRANSFORMSTORE_H
17+
18+
#include "qgscoordinatereferencesystem.h"
19+
20+
class QgsCoordinateTransform;
21+
class QgsMapLayer;
22+
23+
class QDomElement;
24+
25+
26+
/**
27+
* @brief The QgsDatumTransformStore class keeps track of datum transformations
28+
* as chosen by the user.
29+
*
30+
* @note added in 2.4
31+
*/
32+
class CORE_EXPORT QgsDatumTransformStore
33+
{
34+
public:
35+
explicit QgsDatumTransformStore( const QgsCoordinateReferenceSystem& destCrs );
36+
37+
void clear();
38+
39+
void setDestinationCrs( const QgsCoordinateReferenceSystem& destCrs );
40+
41+
void addEntry( const QString& layerId, const QString& srcAuthId, const QString& destAuthId, int srcDatumTransform, int destDatumTransform );
42+
43+
bool hasEntryForLayer( QgsMapLayer* layer ) const;
44+
45+
/** will return transform from layer's CRS to current destination CRS.
46+
* Will emit datumTransformInfoRequested signal if the layer has no entry.
47+
* Returns an instance from QgsCoordinateTransformCache
48+
*/
49+
const QgsCoordinateTransform* transformation( QgsMapLayer* layer ) const;
50+
51+
void readXML( const QDomNode& parentNode );
52+
53+
void writeXML( QDomNode& parentNode, QDomDocument& theDoc ) const;
54+
55+
struct Entry
56+
{
57+
QString srcAuthId;
58+
QString destAuthId;
59+
int srcDatumTransform; //-1 if unknown or not specified
60+
int destDatumTransform;
61+
};
62+
63+
protected:
64+
QgsCoordinateReferenceSystem mDestCRS;
65+
66+
//! key = layer ID
67+
QHash< QString, Entry > mEntries;
68+
};
69+
70+
#endif // QGSDATUMTRANSFORMSTORE_H

‎src/core/qgsmaprendererjob.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ void QgsMapRendererJob::drawOldLabeling( const QgsMapSettings& settings, QgsRend
408408

409409
if ( settings.hasCrsTransformEnabled() )
410410
{
411-
ct = QgsCoordinateTransformCache::instance()->transform( ml->crs().authid(), settings.destinationCrs().authid() );
411+
ct = settings.layerTransfrom( ml );
412412
reprojectToLayerExtent( ct, ml->crs().geographicFlag(), r1, r2 );
413413
}
414414

@@ -571,7 +571,7 @@ LayerRenderJobs QgsMapRendererJob::prepareJobs( QPainter* painter, QgsPalLabelin
571571

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

0 commit comments

Comments
 (0)
Please sign in to comment.