Skip to content

Commit 018a047

Browse files
committedMay 6, 2012
[FEATURE] WMTS
1 parent db1c3d9 commit 018a047

19 files changed

+1897
-1001
lines changed
 

‎scripts/prepare-commit.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ fi
3434
# save original changes
3535
if [ -d .svn ]; then
3636
REV=r$(svn info | sed -ne "s/Revision: //p")
37-
svn diff >$REV.diff
37+
svn diff >rev-$REV.diff
3838
elif [ -d .git ]; then
3939
REV=$(git log -n1 --pretty=%H)
40-
git diff >$REV.diff
40+
git diff >sha-$REV.diff
4141
fi
4242

4343
ASTYLEDIFF=astyle.$REV.diff

‎src/app/CMakeLists.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ SET(QGIS_APP_SRCS
9595
qgssinglesymboldialog.cpp
9696
qgssnappingdialog.cpp
9797
qgsundowidget.cpp
98-
qgstilescalewidget.cpp
9998
qgstipgui.cpp
10099
qgstipfactory.cpp
101100
qgsuniquevaluedialog.cpp
@@ -232,7 +231,6 @@ SET (QGIS_APP_MOC_HDRS
232231
qgssnappingdialog.h
233232
qgssponsors.h
234233
qgstextannotationdialog.h
235-
qgstilescalewidget.h
236234
qgstipgui.h
237235
qgstipfactory.h
238236
qgsundowidget.h

‎src/app/qgisapp.cpp

Lines changed: 2 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,6 @@
164164
#include "qgssnappingdialog.h"
165165
#include "qgssponsors.h"
166166
#include "qgstextannotationitem.h"
167-
#include "qgstilescalewidget.h"
168167
#include "qgstipgui.h"
169168
#include "qgsundowidget.h"
170169
#include "qgsvectordataprovider.h"
@@ -403,7 +402,6 @@ QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, QWidget * parent,
403402
, mSplash( splash )
404403
, mShowProjectionTab( false )
405404
, mPythonUtils( NULL )
406-
, mpTileScaleWidget( NULL )
407405
#ifdef Q_OS_WIN
408406
, mSkipNextContextMenuEvent( 0 )
409407
#endif
@@ -651,6 +649,8 @@ QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, QWidget * parent,
651649
// request notification of FileOpen events (double clicking a file icon in Mac OS X Finder)
652650
QgsApplication::setFileOpenEventReceiver( this );
653651

652+
QgsProviderRegistry::instance()->registerGuis( this );
653+
654654
// update windows
655655
qApp->processEvents();
656656

@@ -788,12 +788,6 @@ void QgisApp::readSettings()
788788

789789
// Add the recently accessed project file paths to the File menu
790790
mRecentProjectPaths = settings.value( "/UI/recentProjectsList" ).toStringList();
791-
792-
// Restore state of tile scale widget
793-
if ( settings.value( "/UI/tileScaleEnabled", false ).toBool() )
794-
{
795-
showTileScale();
796-
}
797791
}
798792

799793

@@ -899,7 +893,6 @@ void QgisApp::createActions()
899893
connect( mActionRemoveLayer, SIGNAL( triggered() ), this, SLOT( removeLayer() ) );
900894
connect( mActionSetLayerCRS, SIGNAL( triggered() ), this, SLOT( setLayerCRS() ) );
901895
connect( mActionSetProjectCRSFromLayer, SIGNAL( triggered() ), this, SLOT( setProjectCRSFromLayer() ) );
902-
connect( mActionTileScale, SIGNAL( triggered() ), this, SLOT( showTileScale() ) );
903896
connect( mActionLayerProperties, SIGNAL( triggered() ), this, SLOT( layerProperties() ) );
904897
connect( mActionLayerSubsetString, SIGNAL( triggered() ), this, SLOT( layerSubsetString() ) );
905898
connect( mActionAddToOverview, SIGNAL( triggered() ), this, SLOT( isInOverview() ) );
@@ -2072,17 +2065,6 @@ void QgisApp::saveWindowState()
20722065
// store window geometry
20732066
settings.setValue( "/UI/geometry", saveGeometry() );
20742067

2075-
// Persist state of tile scale slider
2076-
if ( mpTileScaleWidget )
2077-
{
2078-
settings.setValue( "/UI/tileScaleEnabled", true );
2079-
delete mpTileScaleWidget;
2080-
}
2081-
else
2082-
{
2083-
settings.setValue( "/UI/tileScaleEnabled", false );
2084-
}
2085-
20862068
QgsPluginRegistry::instance()->unloadAll();
20872069
}
20882070

@@ -4854,32 +4836,6 @@ void QgisApp::setProjectCRSFromLayer()
48544836
mMapCanvas->refresh();
48554837
}
48564838

4857-
void QgisApp::showTileScale()
4858-
{
4859-
if ( !mpTileScaleWidget )
4860-
{
4861-
mpTileScaleWidget = new QgsTileScaleWidget( mMapCanvas );
4862-
//create the dock widget
4863-
mpTileScaleDock = new QDockWidget( tr( "Tile scale" ), this );
4864-
mpTileScaleDock->setObjectName( "TileScale" );
4865-
mpTileScaleDock->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea );
4866-
addDockWidget( Qt::RightDockWidgetArea, mpTileScaleDock );
4867-
// add to the Panel submenu
4868-
mPanelMenu->addAction( mpTileScaleDock->toggleViewAction() );
4869-
// now add our widget to the dock - ownership of the widget is passed to the dock
4870-
mpTileScaleDock->setWidget( mpTileScaleWidget );
4871-
mpTileScaleDock->show();
4872-
4873-
connect( mMapLegend, SIGNAL( currentLayerChanged( QgsMapLayer* ) ),
4874-
mpTileScaleWidget, SLOT( layerChanged( QgsMapLayer* ) ) );
4875-
4876-
}
4877-
else
4878-
{
4879-
mpTileScaleDock->setVisible( mpTileScaleDock->isHidden() );
4880-
}
4881-
}
4882-
48834839
void QgisApp::zoomToLayerExtent()
48844840
{
48854841
mMapLegend->legendLayerZoom();

‎src/app/qgisapp.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ class QgsRasterLayer;
5858
class QgsRectangle;
5959
class QgsUndoWidget;
6060
class QgsVectorLayer;
61-
class QgsTileScaleWidget;
6261

6362
class QDomDocument;
6463
class QNetworkReply;
@@ -289,7 +288,6 @@ class QgisApp : public QMainWindow, private Ui::MainWindow
289288
QAction *actionRemoveLayer() { return mActionRemoveLayer; }
290289
QAction *actionSetLayerCRS() { return mActionSetLayerCRS; }
291290
QAction *actionSetProjectCRSFromLayer() { return mActionSetProjectCRSFromLayer; }
292-
QAction *actionTileScale() { return mActionTileScale; }
293291
QAction *actionLayerProperties() { return mActionLayerProperties; }
294292
QAction *actionLayerSubsetString() { return mActionLayerSubsetString; }
295293
QAction *actionAddToOverview() { return mActionAddToOverview; }
@@ -544,8 +542,6 @@ class QgisApp : public QMainWindow, private Ui::MainWindow
544542
void setLayerCRS();
545543
//! Assign layer CRS to project
546544
void setProjectCRSFromLayer();
547-
//! Show tile scale slider
548-
void showTileScale();
549545
//! zoom to extent of layer
550546
void zoomToLayerExtent();
551547
//! zoom to actual size of raster layer
@@ -1005,7 +1001,6 @@ class QgisApp : public QMainWindow, private Ui::MainWindow
10051001
QDockWidget *mLegendDock;
10061002
QDockWidget *mLayerOrderDock;
10071003
QDockWidget *mOverviewDock;
1008-
QDockWidget *mpTileScaleDock;
10091004
QDockWidget *mpGpsDock;
10101005
QDockWidget *mLogDock;
10111006

@@ -1173,9 +1168,6 @@ class QgisApp : public QMainWindow, private Ui::MainWindow
11731168

11741169
QgsSnappingDialog* mSnappingDialog;
11751170

1176-
//! Persistent tile scale slider
1177-
QgsTileScaleWidget * mpTileScaleWidget;
1178-
11791171
QgsDecorationCopyright* mDecorationCopyright;
11801172
QgsDecorationNorthArrow* mDecorationNorthArrow;
11811173
QgsDecorationScaleBar* mDecorationScaleBar;

‎src/core/qgscoordinatereferencesystem.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,16 +133,25 @@ bool QgsCoordinateReferenceSystem::createFromString( const QString theDefinition
133133

134134
bool QgsCoordinateReferenceSystem::createFromOgcWmsCrs( QString theCrs )
135135
{
136-
QRegExp re( "(user|custom|qgis):(\\d+)", Qt::CaseInsensitive );
137-
if ( re.exactMatch( theCrs ) && createFromSrsId( re.cap( 2 ).toInt() ) )
136+
QRegExp re( "urn:ogc:def:crs:([^:]+).+([^:]+)", Qt::CaseInsensitive );
137+
if ( re.exactMatch( theCrs ) )
138138
{
139-
return true;
139+
theCrs = re.cap( 1 ) + ":" + re.cap( 2 );
140+
}
141+
else
142+
{
143+
re.setPattern( "(user|custom|qgis):(\\d+)" );
144+
if ( re.exactMatch( theCrs ) && createFromSrsId( re.cap( 2 ).toInt() ) )
145+
{
146+
return true;
147+
}
140148
}
141149

142150
if ( loadFromDb( QgsApplication::srsDbFilePath(), "lower(auth_name||':'||auth_id)", theCrs.toLower() ) )
143151
return true;
144152

145-
if ( theCrs.compare( "CRS:84", Qt::CaseInsensitive ) == 0 )
153+
if ( theCrs.compare( "CRS:84", Qt::CaseInsensitive ) == 0 ||
154+
theCrs.compare( "OGC:CRS84", Qt::CaseInsensitive ) == 0 )
146155
{
147156
createFromSrsId( GEOCRS_ID );
148157
return true;

‎src/core/qgsproviderregistry.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -436,20 +436,15 @@ typedef QWidget * selectFactoryFunction_t( QWidget * parent, Qt::WFlags fl );
436436
QWidget* QgsProviderRegistry::selectWidget( const QString & providerKey,
437437
QWidget * parent, Qt::WFlags fl )
438438
{
439-
QLibrary *myLib = providerLibrary( providerKey );
440-
if ( !myLib )
441-
return 0;
442-
443439
selectFactoryFunction_t * selectFactory =
444-
( selectFactoryFunction_t * ) cast_to_fptr( myLib->resolve( "selectWidget" ) );
440+
( selectFactoryFunction_t * ) cast_to_fptr( function( providerKey, "selectWidget" ) );
445441

446442
if ( !selectFactory )
447443
return 0;
448444

449445
return selectFactory( parent, fl );
450446
}
451447

452-
453448
void * QgsProviderRegistry::function( QString const & providerKey,
454449
QString const & functionName )
455450
{
@@ -489,6 +484,21 @@ QLibrary *QgsProviderRegistry::providerLibrary( QString const & providerKey ) co
489484
return 0;
490485
}
491486

487+
void QgsProviderRegistry::registerGuis( QWidget *parent )
488+
{
489+
typedef void registerGui_function( QWidget * parent );
490+
491+
foreach( const QString &provider, providerList() )
492+
{
493+
registerGui_function *registerGui = ( registerGui_function * ) cast_to_fptr( function( provider, "registerGui" ) );
494+
495+
if ( !registerGui )
496+
continue;
497+
498+
registerGui( parent );
499+
}
500+
}
501+
492502
QString QgsProviderRegistry::fileVectorFilters() const
493503
{
494504
return mVectorFileFilters;

‎src/core/qgsproviderregistry.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ class CORE_EXPORT QgsProviderRegistry
140140
/** type for data provider metadata associative container */
141141
typedef std::map<QString, QgsProviderMetadata*> Providers;
142142

143+
void registerGuis( QWidget *widget );
144+
143145
private:
144146

145147
/** ctor private since instance() creates it */

‎src/gui/qgsmapcanvas.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ QgsMapCanvas::QgsMapCanvas( QWidget * parent, const char *name )
8383
, mPainting( false )
8484
, mAntiAliasing( false )
8585
{
86-
Q_UNUSED( name );
86+
setObjectName( name );
8787
//disable the update that leads to the resize crash
8888
if ( viewport() )
8989
{

‎src/providers/wms/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,16 @@ SET (WMS_SRCS
44
qgswmssourceselect.cpp
55
qgswmsconnection.cpp
66
qgswmsdataitems.cpp
7+
qgstilescalewidget.cpp
8+
qgswmtsdimensions.cpp
79
)
810
SET (WMS_MOC_HDRS
911
qgswmsprovider.h
1012
qgswmssourceselect.h
1113
qgswmsconnection.h
1214
qgswmsdataitems.h
15+
qgstilescalewidget.h
16+
qgswmtsdimensions.h
1317
)
1418

1519
QT4_WRAP_CPP (WMS_MOC_SRCS ${WMS_MOC_HDRS})

‎src/app/qgstilescalewidget.cpp renamed to ‎src/providers/wms/qgstilescalewidget.cpp

Lines changed: 94 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,15 @@
1818
#include "qgstilescalewidget.h"
1919
#include "qgsmapcanvas.h"
2020
#include "qgsrasterlayer.h"
21+
#include "qgswmsprovider.h"
22+
#include "qgsmessagelog.h"
2123
#include "qgslogger.h"
2224

25+
#include <QDockWidget>
26+
#include <QMainWindow>
27+
#include <QMenu>
28+
#include <QGraphicsView>
29+
2330
QgsTileScaleWidget::QgsTileScaleWidget( QgsMapCanvas * mapCanvas, QWidget * parent, Qt::WindowFlags f )
2431
: QWidget( parent, f )
2532
, mMapCanvas( mapCanvas )
@@ -31,54 +38,46 @@ QgsTileScaleWidget::QgsTileScaleWidget( QgsMapCanvas * mapCanvas, QWidget * pare
3138
layerChanged( mMapCanvas->currentLayer() );
3239
}
3340

41+
QgsTileScaleWidget::~QgsTileScaleWidget()
42+
{
43+
QSettings settings;
44+
settings.setValue( "/UI/tileScaleEnabled", isVisible() );
45+
}
46+
3447
void QgsTileScaleWidget::layerChanged( QgsMapLayer *layer )
3548
{
3649
QgsRasterLayer *rl = qobject_cast<QgsRasterLayer *>( layer );
50+
if ( !rl )
51+
return;
3752

38-
mResolutions.clear();
39-
mSlider->setDisabled( true );
53+
QgsWmsProvider *wms = qobject_cast<QgsWmsProvider *>( rl->dataProvider() );
54+
if ( !wms )
55+
return;
4056

41-
if ( !rl || rl->providerType() != "wms" )
57+
QgsWmtsTileMatrixSet *tileMatrixSet = wms->tileMatrixSet();
58+
if ( !tileMatrixSet )
4259
return;
4360

44-
QString uri = rl->source();
45-
int tiledpos = uri.indexOf( "tiled=" );
46-
int urlpos = uri.indexOf( "url=" );
61+
mSlider->setDisabled( true );
62+
63+
mResolutions = tileMatrixSet->tileMatrices.keys();
64+
qSort( mResolutions );
4765

48-
if ( tiledpos >= 0 && urlpos >= 0 && urlpos > tiledpos )
66+
for ( int i = 0; i < mResolutions.size(); i++ )
4967
{
50-
uri = uri.mid( tiledpos + 6 );
51-
int pos = uri.indexOf( "," );
52-
if ( pos >= 0 )
53-
uri = uri.left( pos );
54-
QStringList params = uri.split( ";" );
55-
if ( params.size() < 3 )
56-
return;
57-
58-
params.takeFirst();
59-
params.takeFirst();
60-
61-
mResolutions.clear();
62-
foreach( QString r, params )
63-
{
64-
mResolutions << r.toDouble();
65-
}
66-
qSort( mResolutions );
67-
68-
for ( int i = 0; i < mResolutions.size(); i++ )
69-
QgsDebugMsg( QString( "found resolution %1: %2" ).arg( i ).arg( mResolutions[i] ) );
70-
71-
mSlider->setRange( 0, mResolutions.size() - 1 );
72-
mSlider->setTickInterval( 1 );
73-
mSlider->setInvertedAppearance( true );
74-
mSlider->setPageStep( 1 );
75-
mSlider->setTracking( false );
76-
77-
scaleChanged( mMapCanvas->scale() );
78-
79-
mSlider->setEnabled( true );
80-
show();
68+
QgsDebugMsg( QString( "found resolution %1: %2" ).arg( i ).arg( mResolutions[i] ) );
8169
}
70+
71+
mSlider->setRange( 0, mResolutions.size() - 1 );
72+
mSlider->setTickInterval( 1 );
73+
mSlider->setInvertedAppearance( true );
74+
mSlider->setPageStep( 1 );
75+
mSlider->setTracking( false );
76+
77+
scaleChanged( mMapCanvas->scale() );
78+
79+
mSlider->setEnabled( true );
80+
show();
8281
}
8382

8483
void QgsTileScaleWidget::scaleChanged( double scale )
@@ -103,7 +102,9 @@ void QgsTileScaleWidget::scaleChanged( double scale )
103102
}
104103

105104
QgsDebugMsg( QString( "selected resolution %1: %2" ).arg( i ).arg( mResolutions[i] ) );
105+
mSlider->blockSignals( true );
106106
mSlider->setValue( i );
107+
mSlider->blockSignals( false );
107108
}
108109

109110
void QgsTileScaleWidget::on_mSlider_valueChanged( int value )
@@ -112,3 +113,58 @@ void QgsTileScaleWidget::on_mSlider_valueChanged( int value )
112113
QgsDebugMsg( QString( "slider released at %1: %2" ).arg( mSlider->value() ).arg( mResolutions[mSlider->value()] ) );
113114
mMapCanvas->zoomByFactor( mResolutions[mSlider->value()] / mMapCanvas->mapUnitsPerPixel() );
114115
}
116+
117+
void QgsTileScaleWidget::showTileScale( QMainWindow *mainWindow )
118+
{
119+
QDockWidget *dock = mainWindow->findChild<QDockWidget *>( "theTileScaleDock" );
120+
if ( dock )
121+
{
122+
dock->setVisible( dock->isHidden() );
123+
return;
124+
}
125+
126+
QgsMapCanvas *canvas = mainWindow->findChild<QgsMapCanvas *>( "theMapCanvas" );
127+
QgsDebugMsg( QString( "canvas:%1 [%2]" ).arg(( ulong ) canvas, 0, 16 ).arg( canvas ? canvas->objectName() : "" ) );
128+
if ( !canvas )
129+
{
130+
QgsDebugMsg( "map canvas theMapCanvas not found" );
131+
return;
132+
}
133+
134+
QgsTileScaleWidget *tws = new QgsTileScaleWidget( canvas );
135+
tws->setObjectName( "theTileScaleWidget" );
136+
137+
QObject *legend = mainWindow->findChild<QObject*>( "theMapLegend" );
138+
if ( legend )
139+
{
140+
connect( legend, SIGNAL( currentLayerChanged( QgsMapLayer* ) ),
141+
tws, SLOT( layerChanged( QgsMapLayer* ) ) );
142+
}
143+
else
144+
{
145+
QgsDebugMsg( "legend not found" );
146+
}
147+
148+
//create the dock widget
149+
dock = new QDockWidget( tr( "Tile scale" ), mainWindow );
150+
dock->setObjectName( "theTileScaleDock" );
151+
dock->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea );
152+
mainWindow->addDockWidget( Qt::RightDockWidgetArea, dock );
153+
154+
// add to the Panel submenu
155+
QMenu *panelMenu = mainWindow->findChild<QMenu *>( "mPanelMenu" );
156+
if ( panelMenu )
157+
{
158+
// add to the Panel submenu
159+
panelMenu->addAction( dock->toggleViewAction() );
160+
}
161+
else
162+
{
163+
QgsDebugMsg( "panel menu not found" );
164+
}
165+
166+
panelMenu->addAction( dock->toggleViewAction() );
167+
168+
dock->setWidget( tws );
169+
dock->show();
170+
}

‎src/app/qgstilescalewidget.h renamed to ‎src/providers/wms/qgstilescalewidget.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,24 @@
2222

2323
class QgsMapCanvas;
2424
class QgsMapLayer;
25-
class QwtSlider;
25+
class QMainWindow;
2626

2727
class QgsTileScaleWidget : public QWidget, private Ui::QgsTileScaleWidget
2828
{
2929
Q_OBJECT
30+
3031
public:
31-
QgsTileScaleWidget( QgsMapCanvas *mapCanvas, QWidget * parent = 0, Qt::WindowFlags f = 0 );
32+
static void showTileScale( QMainWindow *mainWindow );
3233

3334
public slots:
3435
void layerChanged( QgsMapLayer *layer );
3536
void scaleChanged( double );
3637
void on_mSlider_valueChanged( int );
3738

3839
private:
40+
QgsTileScaleWidget( QgsMapCanvas *mapCanvas, QWidget *parent = 0, Qt::WindowFlags f = 0 );
41+
~QgsTileScaleWidget();
42+
3943
QgsMapCanvas *mMapCanvas;
4044
QList<double> mResolutions;
4145
};

‎src/providers/wms/qgswmsconnection.cpp

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
/***************************************************************************
22
qgswmsconnection.cpp - selector for WMS servers, etc.
33
-------------------
4-
begin : 3 April 2005
5-
copyright :
6-
original : (C) 2005 by Brendan Morley email : morb at ozemail dot com dot au
7-
wms search : (C) 2009 Mathias Walker <mwa at sourcepole.ch>, Sourcepole AG
8-
wms-c support : (C) 2010 Juergen E. Fischer < jef at norbit dot de >, norBIT GmbH
4+
begin : May 2011
5+
original : (C) 2011 by Martin Dobias
96
107
***************************************************************************/
118

@@ -20,28 +17,13 @@
2017

2118
#include "../providers/wms/qgswmsprovider.h"
2219
#include "qgis.h" // GEO_EPSG_CRS_ID
23-
//#include "qgisapp.h" //for getThemeIcon
24-
//#include "qgscontexthelp.h"
25-
//#include "qgscoordinatereferencesystem.h"
26-
//#include "qgsgenericprojectionselector.h"
27-
//#include "qgslogger.h"
28-
//#include "qgsmanageconnectionsdialog.h"
29-
//#include "qgsmessageviewer.h"
3020
#include "qgsnewhttpconnection.h"
31-
//#include "qgsnumericsortlistviewitem.h"
3221
#include "qgsproject.h"
3322
#include "qgsproviderregistry.h"
3423
#include "qgswmsconnection.h"
3524
#include "qgsnetworkaccessmanager.h"
3625

37-
//#include <QButtonGroup>
38-
//#include <QFileDialog>
39-
//#include <QRadioButton>
40-
//#include <QDomDocument>
41-
//#include <QHeaderView>
42-
//#include <QImageReader>
4326
#include <QInputDialog>
44-
//#include <QMap>
4527
#include <QMessageBox>
4628
#include <QPicture>
4729
#include <QSettings>
@@ -110,12 +92,12 @@ QgsWMSConnection::~QgsWMSConnection()
11092

11193
}
11294

113-
QString QgsWMSConnection::connectionInfo( )
95+
QString QgsWMSConnection::connectionInfo()
11496
{
11597
return mConnectionInfo;
11698
}
11799

118-
QgsWmsProvider * QgsWMSConnection::provider( )
100+
QgsWmsProvider *QgsWMSConnection::provider()
119101
{
120102
// TODO: Create and bind to data provider
121103

‎src/providers/wms/qgswmsdataitems.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
#include "qgsnewhttpconnection.h"
99

10+
#include "qgstilescalewidget.h"
11+
1012
// ---------------------------------------------------------------------------
1113
QgsWMSConnectionItem::QgsWMSConnectionItem( QgsDataItem* parent, QString name, QString path )
1214
: QgsDataCollectionItem( parent, name, path )
@@ -23,7 +25,7 @@ QVector<QgsDataItem*> QgsWMSConnectionItem::createChildren()
2325
QgsDebugMsg( "Entered" );
2426
QVector<QgsDataItem*> children;
2527
QgsWMSConnection connection( mName );
26-
QgsWmsProvider *wmsProvider = connection.provider( );
28+
QgsWmsProvider *wmsProvider = connection.provider();
2729
if ( !wmsProvider )
2830
return children;
2931

@@ -248,6 +250,11 @@ void QgsWMSRootItem::newConnection()
248250

249251
// ---------------------------------------------------------------------------
250252

253+
QGISEXTERN void registerGui( QMainWindow *mainWindow )
254+
{
255+
QgsTileScaleWidget::showTileScale( mainWindow );
256+
}
257+
251258
QGISEXTERN QgsWMSSourceSelect * selectWidget( QWidget * parent, Qt::WFlags fl )
252259
{
253260
return new QgsWMSSourceSelect( parent, fl );

‎src/providers/wms/qgswmsprovider.cpp

Lines changed: 1428 additions & 737 deletions
Large diffs are not rendered by default.

‎src/providers/wms/qgswmsprovider.h

Lines changed: 192 additions & 55 deletions
Large diffs are not rendered by default.

‎src/providers/wms/qgswmssourceselect.cpp

Lines changed: 112 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
copyright :
66
original : (C) 2005 by Brendan Morley email : morb at ozemail dot com dot au
77
wms search : (C) 2009 Mathias Walker <mwa at sourcepole.ch>, Sourcepole AG
8-
wms-c support : (C) 2010 Juergen E. Fischer < jef at norbit dot de >, norBIT GmbH
8+
wmts/wms-c support : (C) 2010-2012 Juergen E. Fischer < jef at norbit dot de >, norBIT GmbH
99
1010
***************************************************************************/
1111

@@ -18,7 +18,7 @@
1818
* *
1919
***************************************************************************/
2020

21-
#include "../providers/wms/qgswmsprovider.h"
21+
#include "qgswmsprovider.h"
2222
#include "qgis.h" // GEO_EPSG_CRS_ID
2323
#include "qgscontexthelp.h"
2424
#include "qgscoordinatereferencesystem.h"
@@ -33,6 +33,7 @@
3333
#include "qgswmsconnection.h"
3434
#include "qgswmsprovider.h"
3535
#include "qgswmssourceselect.h"
36+
#include "qgswmtsdimensions.h"
3637
#include "qgsnetworkaccessmanager.h"
3738

3839
#include <QButtonGroup>
@@ -333,57 +334,64 @@ bool QgsWMSSourceSelect::populateLayerList( QgsWmsProvider *wmsProvider )
333334

334335
lstLayers->sortByColumn( 0, Qt::AscendingOrder );
335336

336-
QVector<QgsWmsTileSetProfile> tilesets;
337-
wmsProvider->supportedTileSets( tilesets );
337+
wmsProvider->supportedTileLayers( mTileLayers );
338338

339-
tabServers->setTabEnabled( tabServers->indexOf( tabTilesets ), tilesets.size() > 0 );
339+
tabServers->setTabEnabled( tabServers->indexOf( tabTilesets ), mTileLayers.size() > 0 );
340340
if ( tabServers->isTabEnabled( tabServers->indexOf( tabTilesets ) ) )
341341
tabServers->setCurrentWidget( tabTilesets );
342342

343-
if ( tilesets.size() > 0 )
343+
if ( mTileLayers.size() > 0 )
344344
{
345+
QHash<QString, QgsWmtsTileMatrixSet> tileMatrixSets;
346+
wmsProvider->supportedTileMatrixSets( tileMatrixSets );
347+
348+
int rows = 0;
349+
foreach( const QgsWmtsTileLayer &l, mTileLayers )
350+
{
351+
rows += l.styles.size() * l.setLinks.size();
352+
}
353+
345354
lstTilesets->clearContents();
346-
lstTilesets->setRowCount( tilesets.size() );
355+
lstTilesets->setRowCount( rows );
347356
lstTilesets->setSortingEnabled( true );
348357

349-
for ( int i = 0; i < tilesets.size(); i++ )
358+
int row = 0;
359+
foreach( const QgsWmtsTileLayer &l, mTileLayers )
350360
{
351-
QTableWidgetItem *item = new QTableWidgetItem( tilesets[i].layers.join( ", " ) );
352-
353-
item->setData( Qt::UserRole + 0, tilesets[i].layers.join( "," ) );
354-
item->setData( Qt::UserRole + 1, tilesets[i].styles.join( "," ) );
355-
item->setData( Qt::UserRole + 2, tilesets[i].format );
356-
item->setData( Qt::UserRole + 3, tilesets[i].crs );
357-
item->setData( Qt::UserRole + 4, tilesets[i].tileWidth );
358-
item->setData( Qt::UserRole + 5, tilesets[i].tileHeight );
359-
item->setData( Qt::UserRole + 6, tilesets[i].resolutions );
360-
361-
lstTilesets->setItem( i, 0, item );
362-
lstTilesets->setItem( i, 1, new QTableWidgetItem( tilesets[i].styles.join( ", " ) ) );
363-
lstTilesets->setItem( i, 2, new QTableWidgetItem( QString( "%1x%2" ).arg( tilesets[i].tileWidth ).arg( tilesets[i].tileHeight ) ) );
364-
lstTilesets->setItem( i, 3, new QTableWidgetItem( tilesets[i].format ) );
365-
lstTilesets->setItem( i, 4, new QTableWidgetItem( tilesets[i].crs ) );
366-
367-
for ( int j = 0; j < 5; j++ )
361+
foreach( const QgsWmtsStyle &style, l.styles )
368362
{
369-
QTableWidgetItem *item = lstTilesets->item( i, j );
370-
item->setFlags( item->flags() & ~Qt::ItemIsEditable );
371-
}
372-
373-
if ( !mMimeMap.contains( tilesets[i].format ) )
374-
{
375-
for ( int j = 0; j < 5; j++ )
363+
foreach( const QgsWmtsTileMatrixSetLink &setLink, l.setLinks )
376364
{
377-
QTableWidgetItem *item = lstTilesets->item( i, j );
378-
item->setFlags( item->flags() & ~Qt::ItemIsEnabled );
379-
item->setToolTip( tr( "encoding %1 not supported." ).arg( tilesets[i].format ) );
365+
QTableWidgetItem *item = new QTableWidgetItem( l.identifier );
366+
item->setData( Qt::UserRole + 0, l.identifier );
367+
item->setData( Qt::UserRole + 1, l.format );
368+
item->setData( Qt::UserRole + 2, style.identifier );
369+
item->setData( Qt::UserRole + 3, setLink.tileMatrixSet );
370+
item->setData( Qt::UserRole + 4, tileMatrixSets[ setLink.tileMatrixSet ].crs );
371+
372+
lstTilesets->setItem( row, 0, item );
373+
lstTilesets->setItem( row, 1, new QTableWidgetItem( l.format ) );
374+
lstTilesets->setItem( row, 2, new QTableWidgetItem( style.identifier ) );
375+
QTableWidgetItem *styleItem = new QTableWidgetItem( l.title );
376+
if ( !l.abstract.isEmpty() )
377+
styleItem->setToolTip( "<p>" + l.abstract + "</p>" );
378+
lstTilesets->setItem( row, 3, styleItem );
379+
lstTilesets->setItem( row, 4, new QTableWidgetItem( setLink.tileMatrixSet ) );
380+
lstTilesets->setItem( row, 5, new QTableWidgetItem( tileMatrixSets[ setLink.tileMatrixSet ].crs ) );
381+
382+
if ( !mMimeMap.contains( l.format ) )
383+
{
384+
for ( int i = 0; i < lstTilesets->columnCount(); i++ )
385+
{
386+
QTableWidgetItem *item = lstTilesets->item( row, i );
387+
item->setFlags( item->flags() & ~Qt::ItemIsEnabled );
388+
item->setToolTip( tr( "encoding %1 not supported." ).arg( l.format ) );
389+
}
390+
}
391+
392+
row++;
380393
}
381394
}
382-
383-
QString crsName = descriptionForAuthId( tilesets[i].crs );
384-
if ( crsName.isEmpty() )
385-
crsName = tr( "CRS %1 not supported." ).arg( tilesets[i].crs );
386-
lstTilesets->item( i, 4 )->setToolTip( crsName );
387395
}
388396

389397
lstTilesets->resizeColumnsToContents();
@@ -405,7 +413,7 @@ void QgsWMSSourceSelect::on_btnConnect_clicked()
405413
mConnName = cmbConnections->currentText();
406414

407415
QgsWMSConnection connection( cmbConnections->currentText() );
408-
QgsWmsProvider *wmsProvider = connection.provider( );
416+
QgsWmsProvider *wmsProvider = connection.provider();
409417
mConnectionInfo = connection.connectionInfo();
410418

411419
if ( wmsProvider )
@@ -444,52 +452,90 @@ void QgsWMSSourceSelect::addClicked()
444452
QString crs;
445453
QString connInfo = connectionInfo();
446454

447-
QString connArgs;
455+
QStringList connArgs;
456+
457+
if ( mTileWidth->text().toInt() > 0 && mTileHeight->text().toInt() > 0 )
458+
{
459+
connArgs << QString( "maxSize=%1;%2" ).arg( mTileWidth->text().toInt() ).arg( mTileHeight->text().toInt() );
460+
}
448461

449462
if ( lstTilesets->selectedItems().isEmpty() )
450463
{
451464
collectSelectedLayers( layers, styles );
452465
crs = mCRS;
453466
format = mFormats[ mImageFormatGroup->checkedId()].format;
454-
455-
if ( mTileWidth->text().toInt() > 0 && mTileHeight->text().toInt() > 0 )
456-
{
457-
connArgs = QString( "tiled=%1;%2" ).arg( mTileWidth->text().toInt() ).arg( mTileHeight->text().toInt() );
458-
}
459467
}
460468
else
461469
{
462470
QTableWidgetItem *item = lstTilesets->selectedItems().first();
463-
layers = item->data( Qt::UserRole + 0 ).toStringList();
464-
styles = item->data( Qt::UserRole + 1 ).toStringList();
465-
format = item->data( Qt::UserRole + 2 ).toString();
466-
crs = item->data( Qt::UserRole + 3 ).toString();
467-
468-
connArgs = QString( "tiled=%1;%2;%3" )
469-
.arg( item->data( Qt::UserRole + 4 ).toInt() )
470-
.arg( item->data( Qt::UserRole + 5 ).toInt() )
471-
.arg( item->data( Qt::UserRole + 6 ).toStringList().join( ";" ) );
471+
472+
layers = QStringList( item->data( Qt::UserRole + 0 ).toString() );
473+
format = item->data( Qt::UserRole + 1 ).toString();
474+
styles = QStringList( item->data( Qt::UserRole + 2 ).toString() );
475+
crs = item->data( Qt::UserRole + 4 ).toString();
476+
477+
connArgs << QString( "tileMatrixSet=%1" ).arg( item->data( Qt::UserRole + 3 ).toStringList().join( ";" ) );
478+
479+
const QgsWmtsTileLayer *layer = 0;
480+
481+
foreach( const QgsWmtsTileLayer &l, mTileLayers )
482+
{
483+
if ( l.identifier == layers.join( "," ) )
484+
{
485+
layer = &l;
486+
break;
487+
}
488+
}
489+
490+
Q_ASSERT( layer );
491+
492+
if ( !layer->dimensions.isEmpty() )
493+
{
494+
QgsWmtsDimensions *dlg = new QgsWmtsDimensions( *layer, this );
495+
if ( dlg->exec() != QDialog::Accepted )
496+
{
497+
delete dlg;
498+
return;
499+
}
500+
501+
QHash<QString, QString> dims;
502+
dlg->selectedDimensions( dims );
503+
504+
QString dimString = "tileDimensions=";
505+
QString delim;
506+
507+
for ( QHash<QString, QString>::const_iterator it = dims.constBegin();
508+
it != dims.constEnd();
509+
++it )
510+
{
511+
dimString += delim + it.key() + "=" + it.value();
512+
delim = ";";
513+
}
514+
515+
delete dlg;
516+
517+
connArgs << dimString;
518+
}
472519
}
473520

474521
if ( mFeatureCount->text().toInt() > 0 )
475522
{
476-
if ( !connArgs.isEmpty() )
477-
connArgs += ",";
478-
connArgs += QString( "featureCount=%1" ).arg( mFeatureCount->text().toInt() );
523+
connArgs << QString( "featureCount=%1" ).arg( mFeatureCount->text().toInt() );
479524
}
480525

481526
if ( !connArgs.isEmpty() )
482527
{
483-
if ( connInfo.startsWith( "username=" ) || connInfo.startsWith( "ignoreUrl=" ) )
484-
{
485-
connInfo.prepend( connArgs + "," );
486-
}
487-
else
528+
if ( !connInfo.startsWith( "username=" ) && !connInfo.startsWith( "ignoreUrl=" ) )
488529
{
489-
connInfo.prepend( connArgs + ",url=" );
530+
connInfo.prepend( "url=" );
490531
}
532+
533+
connArgs << connInfo;
534+
535+
connInfo = connArgs.join( "," );
491536
}
492-
QgsDebugMsg( "crs = " + crs );
537+
538+
QgsDebugMsg( QString( "connInfo=%1 crs=%2 " ).arg( connInfo ).arg( crs ) );
493539

494540
emit addRasterLayer( connInfo,
495541
leLayerName->text().isEmpty() ? layers.join( "/" ) : leLayerName->text(),

‎src/providers/wms/qgswmssourceselect.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/***************************************************************************
2-
qgserversourceselect.h - selector for WMS servers, etc.
2+
qgswmssourceselect.h - selector for WMS servers, etc.
33
-------------------
44
begin : 3 April 2005
55
original : (C) 2005 by Brendan Morley email : morb at ozemail dot com dot au
@@ -195,6 +195,9 @@ class QgsWMSSourceSelect : public QDialog, private Ui::QgsWMSSourceSelectBase
195195

196196
QList<QTreeWidgetItem*> mCurrentSelection;
197197
QTableWidgetItem* mCurrentTileset;
198+
199+
QList<QgsWmtsTileLayer> mTileLayers;
200+
198201
signals:
199202
void addRasterLayer( QString const & rasterLayerPath,
200203
QString const & baseName,

‎src/ui/qgisapp.ui

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@
128128
<addaction name="mActionNewBookmark"/>
129129
<addaction name="mActionShowBookmarks"/>
130130
<addaction name="mActionDraw"/>
131-
<addaction name="mActionTileScale"/>
132131
</widget>
133132
<widget class="QMenu" name="mLayerMenu">
134133
<property name="title">
@@ -1251,11 +1250,6 @@
12511250
<string>Set Project CRS from Layer</string>
12521251
</property>
12531252
</action>
1254-
<action name="mActionTileScale">
1255-
<property name="text">
1256-
<string>Tile scale slider</string>
1257-
</property>
1258-
</action>
12591253
<action name="mActionLayerProperties">
12601254
<property name="text">
12611255
<string>Properties...</string>

‎src/ui/qgswmssourceselectbase.ui

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -355,22 +355,27 @@
355355
</attribute>
356356
<column>
357357
<property name="text">
358-
<string>Layers</string>
358+
<string>Layer</string>
359359
</property>
360360
</column>
361361
<column>
362362
<property name="text">
363-
<string>Styles</string>
363+
<string>Format</string>
364364
</property>
365365
</column>
366366
<column>
367367
<property name="text">
368-
<string>Size</string>
368+
<string>Style</string>
369369
</property>
370370
</column>
371371
<column>
372372
<property name="text">
373-
<string>Format</string>
373+
<string>Title</string>
374+
</property>
375+
</column>
376+
<column>
377+
<property name="text">
378+
<string>Tileset</string>
374379
</property>
375380
</column>
376381
<column>

0 commit comments

Comments
 (0)
Please sign in to comment.