Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[Bugfix][Server] Correctly round extent coordinates in services capab…
…ilities

QString::number does not correctly round double. It can truncate double so the extent display explains in services capabilities could be clipped.

To fix it, QGIS provides qgsDoubleToString.
  • Loading branch information
rldhont committed Nov 20, 2019
1 parent e8b38c3 commit 747f785
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 24 deletions.
21 changes: 15 additions & 6 deletions src/server/services/wcs/qgswcsutils.cpp
Expand Up @@ -73,7 +73,9 @@ namespace QgsWcs

//lonLatEnvelope
QgsCoordinateReferenceSystem layerCrs = layer->crs();
QgsCoordinateTransform t( layerCrs, QgsCoordinateReferenceSystem( 4326 ), project );
QgsCoordinateReferenceSystem wgs84 = QgsCoordinateReferenceSystem::fromOgcWmsCrs( geoEpsgCrsAuthId() );
int wgs84precision = 6;
QgsCoordinateTransform t( layerCrs, wgs84, project );
//transform
QgsRectangle BBox;
try
Expand All @@ -88,11 +90,11 @@ namespace QgsWcs
QDomElement lonLatElem = doc.createElement( QStringLiteral( "lonLatEnvelope" ) );
lonLatElem.setAttribute( QStringLiteral( "srsName" ), QStringLiteral( "urn:ogc:def:crs:OGC:1.3:CRS84" ) );
QDomElement lowerPosElem = doc.createElement( QStringLiteral( "gml:pos" ) );
QDomText lowerPosText = doc.createTextNode( QString::number( BBox.xMinimum() ) + " " + QString::number( BBox.yMinimum() ) );
QDomText lowerPosText = doc.createTextNode( qgsDoubleToString( BBox.xMinimum(), wgs84precision ) + " " + qgsDoubleToString( BBox.yMinimum(), wgs84precision ) );
lowerPosElem.appendChild( lowerPosText );
lonLatElem.appendChild( lowerPosElem );
QDomElement upperPosElem = doc.createElement( QStringLiteral( "gml:pos" ) );
QDomText upperPosText = doc.createTextNode( QString::number( BBox.xMaximum() ) + " " + QString::number( BBox.yMaximum() ) );
QDomText upperPosText = doc.createTextNode( qgsDoubleToString( BBox.xMaximum(), wgs84precision ) + " " + qgsDoubleToString( BBox.yMaximum(), wgs84precision ) );
upperPosElem.appendChild( upperPosText );
lonLatElem.appendChild( upperPosElem );
layerElem.appendChild( lonLatElem );
Expand All @@ -109,15 +111,22 @@ namespace QgsWcs
QDomElement spatialDomainElem = doc.createElement( QStringLiteral( "spatialDomain" ) );
domainSetElem.appendChild( spatialDomainElem );

// Define precision
int precision = 3;
if ( layer->crs().isGeographic() )
{
precision = 6;
}
//create Envelope
QgsRectangle layerBBox = layer->extent();
QDomElement envelopeElem = doc.createElement( QStringLiteral( "gml:Envelope" ) );
envelopeElem.setAttribute( QStringLiteral( "srsName" ), layerCrs.authid() );
QDomElement lowerCornerElem = doc.createElement( QStringLiteral( "gml:pos" ) );
QDomText lowerCornerText = doc.createTextNode( QString::number( layerBBox.xMinimum() ) + " " + QString::number( layerBBox.yMinimum() ) );
QDomText lowerCornerText = doc.createTextNode( qgsDoubleToString( layerBBox.xMinimum(), precision ) + " " + qgsDoubleToString( layerBBox.yMinimum(), precision ) );
lowerCornerElem.appendChild( lowerCornerText );
envelopeElem.appendChild( lowerCornerElem );
QDomElement upperCornerElem = doc.createElement( QStringLiteral( "gml:pos" ) );
QDomText upperCornerText = doc.createTextNode( QString::number( layerBBox.xMaximum() ) + " " + QString::number( layerBBox.yMaximum() ) );
QDomText upperCornerText = doc.createTextNode( qgsDoubleToString( layerBBox.xMaximum(), precision ) + " " + qgsDoubleToString( layerBBox.yMaximum(), precision ) );
upperCornerElem.appendChild( upperCornerText );
envelopeElem.appendChild( upperCornerElem );
spatialDomainElem.appendChild( envelopeElem );
Expand Down Expand Up @@ -150,7 +159,7 @@ namespace QgsWcs

QDomElement originElem = doc.createElement( QStringLiteral( "gml:origin" ) );
QDomElement originPosElem = doc.createElement( QStringLiteral( "gml:pos" ) );
QDomText originPosText = doc.createTextNode( QString::number( layerBBox.xMinimum() ) + " " + QString::number( layerBBox.yMaximum() ) );
QDomText originPosText = doc.createTextNode( qgsDoubleToString( layerBBox.xMinimum(), precision ) + " " + qgsDoubleToString( layerBBox.yMaximum(), precision ) );
originPosElem.appendChild( originPosText );
spatialDomainElem.appendChild( originElem );

Expand Down
5 changes: 3 additions & 2 deletions src/server/services/wfs/qgswfsgetcapabilities.cpp
Expand Up @@ -592,6 +592,7 @@ namespace QgsWfs
QgsRectangle layerExtent = layer->extent();
//transform the layers native CRS into WGS84
QgsCoordinateReferenceSystem wgs84 = QgsCoordinateReferenceSystem::fromOgcWmsCrs( geoEpsgCrsAuthId() );
int wgs84precision = 6;
QgsRectangle wgs84BoundingRect;
if ( !layerExtent.isNull() )
{
Expand All @@ -610,11 +611,11 @@ namespace QgsWfs
QDomElement bBoxElement = doc.createElement( QStringLiteral( "ows:WGS84BoundingBox" ) );
bBoxElement.setAttribute( QStringLiteral( "dimensions" ), QStringLiteral( "2" ) );
QDomElement lCornerElement = doc.createElement( QStringLiteral( "ows:LowerCorner" ) );
QDomText lCornerText = doc.createTextNode( QString::number( wgs84BoundingRect.xMinimum() ) + " " + QString::number( wgs84BoundingRect.yMinimum() ) );
QDomText lCornerText = doc.createTextNode( qgsDoubleToString( wgs84BoundingRect.xMinimum(), wgs84precision ) + " " + qgsDoubleToString( wgs84BoundingRect.yMinimum(), wgs84precision ) );
lCornerElement.appendChild( lCornerText );
bBoxElement.appendChild( lCornerElement );
QDomElement uCornerElement = doc.createElement( QStringLiteral( "ows:UpperCorner" ) );
QDomText uCornerText = doc.createTextNode( QString::number( wgs84BoundingRect.xMaximum() ) + " " + QString::number( wgs84BoundingRect.yMaximum() ) );
QDomText uCornerText = doc.createTextNode( qgsDoubleToString( wgs84BoundingRect.xMaximum(), wgs84precision ) + " " + qgsDoubleToString( wgs84BoundingRect.yMaximum(), wgs84precision ) );
uCornerElement.appendChild( uCornerText );
bBoxElement.appendChild( uCornerElement );
layerElem.appendChild( bBoxElement );
Expand Down
15 changes: 11 additions & 4 deletions src/server/services/wfs/qgswfsgetcapabilities_1_0_0.cpp
Expand Up @@ -353,13 +353,20 @@ namespace QgsWfs
srsElem.appendChild( srsText );
layerElem.appendChild( srsElem );

// Define precision
int precision = 3;
if ( layer->crs().isGeographic() )
{
precision = 6;
}

//create LatLongBoundingBox
QgsRectangle layerExtent = layer->extent();
QDomElement bBoxElement = doc.createElement( QStringLiteral( "LatLongBoundingBox" ) );
bBoxElement.setAttribute( QStringLiteral( "minx" ), QString::number( layerExtent.xMinimum() ) );
bBoxElement.setAttribute( QStringLiteral( "miny" ), QString::number( layerExtent.yMinimum() ) );
bBoxElement.setAttribute( QStringLiteral( "maxx" ), QString::number( layerExtent.xMaximum() ) );
bBoxElement.setAttribute( QStringLiteral( "maxy" ), QString::number( layerExtent.yMaximum() ) );
bBoxElement.setAttribute( QStringLiteral( "minx" ), qgsDoubleToString( layerExtent.xMinimum(), precision ) );
bBoxElement.setAttribute( QStringLiteral( "miny" ), qgsDoubleToString( layerExtent.yMinimum(), precision ) );
bBoxElement.setAttribute( QStringLiteral( "maxx" ), qgsDoubleToString( layerExtent.xMaximum(), precision ) );
bBoxElement.setAttribute( QStringLiteral( "maxy" ), qgsDoubleToString( layerExtent.yMaximum(), precision ) );
layerElem.appendChild( bBoxElement );

// layer metadata URL
Expand Down
31 changes: 19 additions & 12 deletions src/server/services/wms/qgswmsgetcapabilities.cpp
Expand Up @@ -1430,6 +1430,7 @@ namespace QgsWms
}

QgsCoordinateReferenceSystem wgs84 = QgsCoordinateReferenceSystem::fromOgcWmsCrs( geoEpsgCrsAuthId() );
int wgs84precision = 6;

QString version = doc.documentElement().attribute( QStringLiteral( "version" ) );

Expand All @@ -1454,28 +1455,28 @@ namespace QgsWms
if ( version == QLatin1String( "1.1.1" ) ) // WMS Version 1.1.1
{
ExGeoBBoxElement = doc.createElement( QStringLiteral( "LatLonBoundingBox" ) );
ExGeoBBoxElement.setAttribute( QStringLiteral( "minx" ), QString::number( wgs84BoundingRect.xMinimum() ) );
ExGeoBBoxElement.setAttribute( QStringLiteral( "maxx" ), QString::number( wgs84BoundingRect.xMaximum() ) );
ExGeoBBoxElement.setAttribute( QStringLiteral( "miny" ), QString::number( wgs84BoundingRect.yMinimum() ) );
ExGeoBBoxElement.setAttribute( QStringLiteral( "maxy" ), QString::number( wgs84BoundingRect.yMaximum() ) );
ExGeoBBoxElement.setAttribute( QStringLiteral( "minx" ), qgsDoubleToString( wgs84BoundingRect.xMinimum(), wgs84precision ) );
ExGeoBBoxElement.setAttribute( QStringLiteral( "maxx" ), qgsDoubleToString( wgs84BoundingRect.xMaximum(), wgs84precision ) );
ExGeoBBoxElement.setAttribute( QStringLiteral( "miny" ), qgsDoubleToString( wgs84BoundingRect.yMinimum(), wgs84precision ) );
ExGeoBBoxElement.setAttribute( QStringLiteral( "maxy" ), qgsDoubleToString( wgs84BoundingRect.yMaximum(), wgs84precision ) );
}
else // WMS Version 1.3.0
{
ExGeoBBoxElement = doc.createElement( QStringLiteral( "EX_GeographicBoundingBox" ) );
QDomElement wBoundLongitudeElement = doc.createElement( QStringLiteral( "westBoundLongitude" ) );
QDomText wBoundLongitudeText = doc.createTextNode( QString::number( wgs84BoundingRect.xMinimum() ) );
QDomText wBoundLongitudeText = doc.createTextNode( qgsDoubleToString( wgs84BoundingRect.xMinimum(), wgs84precision ) );
wBoundLongitudeElement.appendChild( wBoundLongitudeText );
ExGeoBBoxElement.appendChild( wBoundLongitudeElement );
QDomElement eBoundLongitudeElement = doc.createElement( QStringLiteral( "eastBoundLongitude" ) );
QDomText eBoundLongitudeText = doc.createTextNode( QString::number( wgs84BoundingRect.xMaximum() ) );
QDomText eBoundLongitudeText = doc.createTextNode( qgsDoubleToString( wgs84BoundingRect.xMaximum(), wgs84precision ) );
eBoundLongitudeElement.appendChild( eBoundLongitudeText );
ExGeoBBoxElement.appendChild( eBoundLongitudeElement );
QDomElement sBoundLatitudeElement = doc.createElement( QStringLiteral( "southBoundLatitude" ) );
QDomText sBoundLatitudeText = doc.createTextNode( QString::number( wgs84BoundingRect.yMinimum() ) );
QDomText sBoundLatitudeText = doc.createTextNode( qgsDoubleToString( wgs84BoundingRect.yMinimum(), wgs84precision ) );
sBoundLatitudeElement.appendChild( sBoundLatitudeText );
ExGeoBBoxElement.appendChild( sBoundLatitudeElement );
QDomElement nBoundLatitudeElement = doc.createElement( QStringLiteral( "northBoundLatitude" ) );
QDomText nBoundLatitudeText = doc.createTextNode( QString::number( wgs84BoundingRect.yMaximum() ) );
QDomText nBoundLatitudeText = doc.createTextNode( qgsDoubleToString( wgs84BoundingRect.yMaximum(), wgs84precision ) );
nBoundLatitudeElement.appendChild( nBoundLatitudeText );
ExGeoBBoxElement.appendChild( nBoundLatitudeElement );
}
Expand Down Expand Up @@ -1550,6 +1551,12 @@ namespace QgsWms
return;
}

int precision = 3;
if ( crs.isGeographic() )
{
precision = 6;
}

//BoundingBox element
QDomElement bBoxElement = doc.createElement( QStringLiteral( "BoundingBox" ) );
if ( crs.isValid() )
Expand All @@ -1562,10 +1569,10 @@ namespace QgsWms
crsExtent.invert();
}

bBoxElement.setAttribute( QStringLiteral( "minx" ), QString::number( crsExtent.xMinimum() ) );
bBoxElement.setAttribute( QStringLiteral( "miny" ), QString::number( crsExtent.yMinimum() ) );
bBoxElement.setAttribute( QStringLiteral( "maxx" ), QString::number( crsExtent.xMaximum() ) );
bBoxElement.setAttribute( QStringLiteral( "maxy" ), QString::number( crsExtent.yMaximum() ) );
bBoxElement.setAttribute( QStringLiteral( "minx" ), qgsDoubleToString( crsExtent.xMinimum(), precision ) );
bBoxElement.setAttribute( QStringLiteral( "miny" ), qgsDoubleToString( crsExtent.yMinimum(), precision ) );
bBoxElement.setAttribute( QStringLiteral( "maxx" ), qgsDoubleToString( crsExtent.xMaximum(), precision ) );
bBoxElement.setAttribute( QStringLiteral( "maxy" ), qgsDoubleToString( crsExtent.yMaximum(), precision ) );

QDomElement lastBBoxElem = layerElem.lastChildElement( QStringLiteral( "BoundingBox" ) );
if ( !lastBBoxElem.isNull() )
Expand Down

0 comments on commit 747f785

Please sign in to comment.