Skip to content

Commit ba24653

Browse files
committed
[Server][Feature][needs-docs] Enhancing TileMatrixSetLimits
1 parent 355a387 commit ba24653

File tree

4 files changed

+499
-887
lines changed

4 files changed

+499
-887
lines changed

src/server/services/wmts/qgswmtsgetcapabilities.cpp

Lines changed: 10 additions & 198 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@ namespace QgsWmts
3232
{
3333
namespace
3434
{
35-
QList< layerDef > getWmtsLayerList( QgsServerInterface *serverIface, const QgsProject *project );
36-
3735
void appendLayerElements( QDomDocument &doc, QDomElement &contentsElement,
3836
QList< layerDef > wmtsLayers, QList< tileMatrixSetDef > tmsList,
3937
const QgsProject *project );
@@ -322,182 +320,6 @@ namespace QgsWmts
322320
}
323321
namespace
324322
{
325-
QList< layerDef > getWmtsLayerList( QgsServerInterface *serverIface, const QgsProject *project )
326-
{
327-
QList< layerDef > wmtsLayers;
328-
#ifdef HAVE_SERVER_PYTHON_PLUGINS
329-
QgsAccessControl *accessControl = serverIface->accessControls();
330-
#endif
331-
QgsCoordinateReferenceSystem wgs84 = QgsCoordinateReferenceSystem::fromOgcWmsCrs( GEO_EPSG_CRS_AUTHID );
332-
333-
QStringList nonIdentifiableLayers = project->nonIdentifiableLayers();
334-
335-
// WMTS Project configuration
336-
bool wmtsProject = project->readBoolEntry( QStringLiteral( "WMTSLayers" ), QStringLiteral( "Project" ) );
337-
338-
// Root Layer name
339-
QString rootLayerName = QgsServerProjectUtils::wmsRootName( *project );
340-
if ( rootLayerName.isEmpty() && !project->title().isEmpty() )
341-
{
342-
rootLayerName = project->title();
343-
}
344-
345-
if ( wmtsProject && !rootLayerName.isEmpty() )
346-
{
347-
layerDef pLayer;
348-
pLayer.id = rootLayerName;
349-
350-
if ( !project->title().isEmpty() )
351-
{
352-
pLayer.title = project->title();
353-
pLayer.abstract = project->title();
354-
}
355-
356-
//transform the project native CRS into WGS84
357-
QgsRectangle projRect = QgsServerProjectUtils::wmsExtent( *project );
358-
QgsCoordinateReferenceSystem projCrs = project->crs();
359-
QgsCoordinateTransform exGeoTransform( projCrs, wgs84, project );
360-
try
361-
{
362-
pLayer.wgs84BoundingRect = exGeoTransform.transformBoundingBox( projRect );
363-
}
364-
catch ( const QgsCsException & )
365-
{
366-
pLayer.wgs84BoundingRect = QgsRectangle( -180, -90, 180, 90 );
367-
}
368-
369-
// Formats
370-
bool wmtsPngProject = project->readBoolEntry( QStringLiteral( "WMTSPngLayers" ), QStringLiteral( "Project" ) );
371-
if ( wmtsPngProject )
372-
pLayer.formats << QStringLiteral( "image/png" );
373-
bool wmtsJpegProject = project->readBoolEntry( QStringLiteral( "WMTSJpegLayers" ), QStringLiteral( "Project" ) );
374-
if ( wmtsJpegProject )
375-
pLayer.formats << QStringLiteral( "image/jpeg" );
376-
377-
// Project is not queryable in WMS
378-
//pLayer.queryable = ( nonIdentifiableLayers.count() != project->count() );
379-
pLayer.queryable = false;
380-
381-
wmtsLayers.append( pLayer );
382-
}
383-
384-
QStringList wmtsGroupNameList = project->readListEntry( QStringLiteral( "WMTSLayers" ), QStringLiteral( "Group" ) );
385-
if ( !wmtsGroupNameList.isEmpty() )
386-
{
387-
QgsLayerTreeGroup *treeRoot = project->layerTreeRoot();
388-
389-
QStringList wmtsPngGroupNameList = project->readListEntry( QStringLiteral( "WMTSPngLayers" ), QStringLiteral( "Group" ) );
390-
QStringList wmtsJpegGroupNameList = project->readListEntry( QStringLiteral( "WMTSJpegLayers" ), QStringLiteral( "Group" ) );
391-
392-
for ( const QString gName : wmtsGroupNameList )
393-
{
394-
QgsLayerTreeGroup *treeGroup = treeRoot->findGroup( gName );
395-
if ( !treeGroup )
396-
{
397-
continue;
398-
}
399-
400-
layerDef pLayer;
401-
pLayer.id = treeGroup->customProperty( QStringLiteral( "wmsShortName" ) ).toString();
402-
if ( pLayer.id.isEmpty() )
403-
pLayer.id = gName;
404-
405-
pLayer.title = treeGroup->customProperty( QStringLiteral( "wmsTitle" ) ).toString();
406-
if ( pLayer.title.isEmpty() )
407-
pLayer.title = gName;
408-
409-
pLayer.abstract = treeGroup->customProperty( QStringLiteral( "wmsAbstract" ) ).toString();
410-
411-
QgsRectangle wgs84BoundingRect;
412-
bool queryable = false;
413-
for ( QgsLayerTreeLayer *layer : treeGroup->findLayers() )
414-
{
415-
QgsMapLayer *l = layer->layer();
416-
if ( !l )
417-
{
418-
continue;
419-
}
420-
//transform the layer native CRS into WGS84
421-
QgsCoordinateReferenceSystem layerCrs = l->crs();
422-
QgsCoordinateTransform exGeoTransform( layerCrs, wgs84, project );
423-
try
424-
{
425-
wgs84BoundingRect.combineExtentWith( exGeoTransform.transformBoundingBox( l->extent() ) );
426-
}
427-
catch ( const QgsCsException & )
428-
{
429-
wgs84BoundingRect.combineExtentWith( QgsRectangle( -180, -90, 180, 90 ) );
430-
}
431-
if ( !queryable && !nonIdentifiableLayers.contains( l->id() ) )
432-
{
433-
queryable = true;
434-
}
435-
}
436-
pLayer.wgs84BoundingRect = wgs84BoundingRect;
437-
pLayer.queryable = queryable;
438-
439-
// Formats
440-
if ( wmtsPngGroupNameList.contains( gName ) )
441-
pLayer.formats << QStringLiteral( "image/png" );
442-
if ( wmtsJpegGroupNameList.contains( gName ) )
443-
pLayer.formats << QStringLiteral( "image/jpeg" );
444-
445-
wmtsLayers.append( pLayer );
446-
}
447-
}
448-
449-
QStringList wmtsLayerIdList = project->readListEntry( QStringLiteral( "WMTSLayers" ), QStringLiteral( "Layer" ) );
450-
QStringList wmtsPngLayerIdList = project->readListEntry( QStringLiteral( "WMTSPngLayers" ), QStringLiteral( "Layer" ) );
451-
QStringList wmtsJpegLayerIdList = project->readListEntry( QStringLiteral( "WMTSJpegLayers" ), QStringLiteral( "Layer" ) );
452-
453-
for ( const QString lId : wmtsLayerIdList )
454-
{
455-
QgsMapLayer *l = project->mapLayer( lId );
456-
if ( !l )
457-
{
458-
continue;
459-
}
460-
#ifdef HAVE_SERVER_PYTHON_PLUGINS
461-
if ( !accessControl->layerReadPermission( l ) )
462-
{
463-
continue;
464-
}
465-
#endif
466-
467-
layerDef pLayer;
468-
pLayer.id = l->name();
469-
if ( !l->shortName().isEmpty() )
470-
pLayer.id = l->shortName();
471-
pLayer.id = pLayer.id.replace( ' ', '_' );
472-
473-
pLayer.title = l->title();
474-
pLayer.abstract = l->abstract();
475-
476-
//transform the layer native CRS into WGS84
477-
QgsCoordinateReferenceSystem layerCrs = l->crs();
478-
QgsCoordinateTransform exGeoTransform( layerCrs, wgs84, project );
479-
try
480-
{
481-
pLayer.wgs84BoundingRect = exGeoTransform.transformBoundingBox( l->extent() );
482-
}
483-
catch ( const QgsCsException & )
484-
{
485-
pLayer.wgs84BoundingRect = QgsRectangle( -180, -90, 180, 90 );
486-
}
487-
488-
// Formats
489-
if ( wmtsPngLayerIdList.contains( lId ) )
490-
pLayer.formats << QStringLiteral( "image/png" );
491-
if ( wmtsJpegLayerIdList.contains( lId ) )
492-
pLayer.formats << QStringLiteral( "image/jpeg" );
493-
494-
pLayer.queryable = ( !nonIdentifiableLayers.contains( l->id() ) );
495-
496-
wmtsLayers.append( pLayer );
497-
}
498-
return wmtsLayers;
499-
}
500-
501323
void appendLayerElements( QDomDocument &doc, QDomElement &contentsElement,
502324
QList< layerDef > wmtsLayers, QList< tileMatrixSetDef > tmsList,
503325
const QgsProject *project )
@@ -616,19 +438,10 @@ namespace QgsWmts
616438

617439
for ( const tileMatrixSetDef tms : tmsList )
618440
{
619-
if ( tms.ref != QLatin1String( "EPSG:4326" ) )
441+
tileMatrixSetLinkDef tmsl = getLayerTileMatrixSetLink( wmtsLayer, tms, project );
442+
if ( tmsl.ref.isEmpty() || tmsl.ref != tms.ref )
620443
{
621-
QgsRectangle rect;
622-
QgsCoordinateReferenceSystem crs = QgsCoordinateReferenceSystem::fromOgcWmsCrs( tms.ref );
623-
QgsCoordinateTransform exGeoTransform( wgs84, crs, project );
624-
try
625-
{
626-
rect = exGeoTransform.transformBoundingBox( wmtsLayer.wgs84BoundingRect );
627-
}
628-
catch ( const QgsCsException & )
629-
{
630-
continue;
631-
}
444+
continue;
632445
}
633446

634447
//wmts:TileMatrixSetLink
@@ -641,8 +454,7 @@ namespace QgsWmts
641454

642455
//wmts:TileMatrixSetLimits
643456
QDomElement tmsLimitsElement = doc.createElement( QStringLiteral( "TileMatrixSetLimits" )/*wmts:TileMatrixSetLimits*/ );
644-
int tmIdx = 0;
645-
for ( const tileMatrixDef tm : tms.tileMatrixList )
457+
for ( int tmIdx : tmsl.tileMatrixLimits.keys() )
646458
{
647459
QDomElement tmLimitsElement = doc.createElement( QStringLiteral( "TileMatrixLimits" )/*wmts:TileMatrixLimits*/ );
648460

@@ -651,29 +463,29 @@ namespace QgsWmts
651463
tmIdentifierElem.appendChild( tmIdentifierText );
652464
tmLimitsElement.appendChild( tmIdentifierElem );
653465

466+
tileMatrixLimitDef tml = tmsl.tileMatrixLimits[tmIdx];
467+
654468
QDomElement minTileColElem = doc.createElement( QStringLiteral( "MinTileCol" ) );
655-
QDomText minTileColText = doc.createTextNode( QString::number( 0 ) );
469+
QDomText minTileColText = doc.createTextNode( QString::number( tml.minCol ) );
656470
minTileColElem.appendChild( minTileColText );
657471
tmLimitsElement.appendChild( minTileColElem );
658472

659473
QDomElement maxTileColElem = doc.createElement( QStringLiteral( "MaxTileCol" ) );
660-
QDomText maxTileColText = doc.createTextNode( QString::number( tm.col ) );
474+
QDomText maxTileColText = doc.createTextNode( QString::number( tml.maxCol ) );
661475
maxTileColElem.appendChild( maxTileColText );
662476
tmLimitsElement.appendChild( maxTileColElem );
663477

664478
QDomElement minTileRowElem = doc.createElement( QStringLiteral( "MinTileRow" ) );
665-
QDomText minTileRowText = doc.createTextNode( QString::number( 0 ) );
479+
QDomText minTileRowText = doc.createTextNode( QString::number( tml.minRow ) );
666480
minTileRowElem.appendChild( minTileRowText );
667481
tmLimitsElement.appendChild( minTileRowElem );
668482

669483
QDomElement maxTileRowElem = doc.createElement( QStringLiteral( "MaxTileRow" ) );
670-
QDomText maxTileRowText = doc.createTextNode( QString::number( tm.row ) );
484+
QDomText maxTileRowText = doc.createTextNode( QString::number( tml.maxRow ) );
671485
maxTileRowElem.appendChild( maxTileRowText );
672486
tmLimitsElement.appendChild( maxTileRowElem );
673487

674488
tmsLimitsElement.appendChild( tmLimitsElement );
675-
676-
++tmIdx;
677489
}
678490
tmslElement.appendChild( tmsLimitsElement );
679491

0 commit comments

Comments
 (0)