Skip to content

Commit 5243423

Browse files
committed
Merge branch 'master' of github.com:qgis/Quantum-GIS
2 parents c5cc634 + fed17aa commit 5243423

File tree

8 files changed

+479
-135
lines changed

8 files changed

+479
-135
lines changed

src/core/qgsgeometry.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4226,10 +4226,10 @@ QString QgsGeometry::exportToGeoJSON()
42264226
{
42274227
mWkt += "{ \"type\": \"Point\", \"coordinates\": [";
42284228
x = ( double * )( mGeometry + 5 );
4229-
mWkt += QString::number( *x, 'f', 6 );
4229+
mWkt += QString::number( *x, 'f' );
42304230
mWkt += ", ";
42314231
y = ( double * )( mGeometry + 5 + sizeof( double ) );
4232-
mWkt += QString::number( *y, 'f', 6 );
4232+
mWkt += QString::number( *y, 'f' );
42334233
mWkt += "] }";
42344234
return mWkt;
42354235
}
@@ -4256,11 +4256,11 @@ QString QgsGeometry::exportToGeoJSON()
42564256
}
42574257
mWkt += "[";
42584258
x = ( double * ) ptr;
4259-
mWkt += QString::number( *x, 'f', 6 );
4259+
mWkt += QString::number( *x, 'f' );
42604260
mWkt += ", ";
42614261
ptr += sizeof( double );
42624262
y = ( double * ) ptr;
4263-
mWkt += QString::number( *y, 'f', 6 );
4263+
mWkt += QString::number( *y, 'f' );
42644264
ptr += sizeof( double );
42654265
if ( hasZValue )
42664266
{
@@ -4313,11 +4313,11 @@ QString QgsGeometry::exportToGeoJSON()
43134313
}
43144314
mWkt += "[";
43154315
x = ( double * ) ptr;
4316-
mWkt += QString::number( *x, 'f', 6 );
4316+
mWkt += QString::number( *x, 'f' );
43174317
mWkt += ", ";
43184318
ptr += sizeof( double );
43194319
y = ( double * ) ptr;
4320-
mWkt += QString::number( *y, 'f', 6 );
4320+
mWkt += QString::number( *y, 'f' );
43214321
ptr += sizeof( double );
43224322
if ( hasZValue )
43234323
{
@@ -4353,11 +4353,11 @@ QString QgsGeometry::exportToGeoJSON()
43534353
}
43544354
mWkt += "[";
43554355
x = ( double * )( ptr );
4356-
mWkt += QString::number( *x, 'f', 6 );
4356+
mWkt += QString::number( *x, 'f' );
43574357
mWkt += ", ";
43584358
ptr += sizeof( double );
43594359
y = ( double * )( ptr );
4360-
mWkt += QString::number( *y, 'f', 6 );
4360+
mWkt += QString::number( *y, 'f' );
43614361
ptr += sizeof( double );
43624362
if ( hasZValue )
43634363
{
@@ -4399,11 +4399,11 @@ QString QgsGeometry::exportToGeoJSON()
43994399
}
44004400
mWkt += "[";
44014401
x = ( double * ) ptr;
4402-
mWkt += QString::number( *x, 'f', 6 );
4402+
mWkt += QString::number( *x, 'f' );
44034403
ptr += sizeof( double );
44044404
mWkt += ", ";
44054405
y = ( double * ) ptr;
4406-
mWkt += QString::number( *y, 'f', 6 );
4406+
mWkt += QString::number( *y, 'f' );
44074407
ptr += sizeof( double );
44084408
if ( hasZValue )
44094409
{
@@ -4457,11 +4457,11 @@ QString QgsGeometry::exportToGeoJSON()
44574457
}
44584458
mWkt += "[";
44594459
x = ( double * ) ptr;
4460-
mWkt += QString::number( *x, 'f', 6 );
4460+
mWkt += QString::number( *x, 'f' );
44614461
ptr += sizeof( double );
44624462
mWkt += ", ";
44634463
y = ( double * ) ptr;
4464-
mWkt += QString::number( *y, 'f', 6 );
4464+
mWkt += QString::number( *y, 'f' );
44654465
ptr += sizeof( double );
44664466
if ( hasZValue )
44674467
{

src/mapserver/qgswfsserver.cpp

Lines changed: 171 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,37 @@ QDomDocument QgsWFSServer::describeFeatureType()
331331
//xsd:element
332332
QDomElement geomElem = doc.createElement( "element"/*xsd:element*/ );
333333
geomElem.setAttribute( "name", "geometry" );
334-
geomElem.setAttribute( "type", "gml:GeometryPropertyType" );
334+
QGis::WkbType wkbType = layer->wkbType();
335+
switch ( wkbType )
336+
{
337+
case QGis::WKBPoint25D:
338+
case QGis::WKBPoint:
339+
geomElem.setAttribute( "type", "gml:PointPropertyType" );
340+
break;
341+
case QGis::WKBLineString25D:
342+
case QGis::WKBLineString:
343+
geomElem.setAttribute( "type", "gml:LineStringPropertyType" );
344+
break;
345+
case QGis::WKBPolygon25D:
346+
case QGis::WKBPolygon:
347+
geomElem.setAttribute( "type", "gml:PolygonPropertyType" );
348+
break;
349+
case QGis::WKBMultiPoint25D:
350+
case QGis::WKBMultiPoint:
351+
geomElem.setAttribute( "type", "gml:MultiPointPropertyType" );
352+
break;
353+
case QGis::WKBMultiLineString25D:
354+
case QGis::WKBMultiLineString:
355+
geomElem.setAttribute( "type", "gml:MultiLineStringPropertyType" );
356+
break;
357+
case QGis::WKBMultiPolygon25D:
358+
case QGis::WKBMultiPolygon:
359+
geomElem.setAttribute( "type", "gml:MultiPolygonPropertyType" );
360+
break;
361+
default:
362+
geomElem.setAttribute( "type", "gml:GeometryPropertyType" );
363+
break;
364+
}
335365
geomElem.setAttribute( "minOccurs", "0" );
336366
geomElem.setAttribute( "maxOccurs", "1" );
337367
sequenceElem.appendChild( geomElem );
@@ -543,9 +573,11 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
543573
}
544574
}
545575

576+
if ( bboxOk )
577+
searchRect.set( minx, miny, maxx, maxy );
546578
QgsCoordinateReferenceSystem layerCrs = layer->crs();
547579

548-
startGetFeature( request, format );
580+
startGetFeature( request, format, layerCrs, &searchRect );
549581

550582
if ( fidOk )
551583
{
@@ -589,8 +621,6 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
589621
}
590622
else
591623
{
592-
if ( bboxOk )
593-
searchRect.set( minx, miny, maxx, maxy );
594624
provider->select( attrIndexes, searchRect, mWithGeom, true );
595625
while ( provider->nextFeature( feature ) && featureCounter < maxFeat )
596626
{
@@ -608,25 +638,102 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
608638
return 0;
609639
}
610640

611-
void QgsWFSServer::startGetFeature( QgsRequestHandler& request, const QString& format )
641+
void QgsWFSServer::startGetFeature( QgsRequestHandler& request, const QString& format, QgsCoordinateReferenceSystem& crs, QgsRectangle* rect )
612642
{
613643
QByteArray result;
614644
QString fcString;
615645
if ( format == "GeoJSON" )
616646
{
617647
fcString = "{\"type\": \"FeatureCollection\",\n";
648+
fcString += " \"bbox\": [ "+ QString::number( rect->xMinimum(), 'f' ) +", "+ QString::number( rect->yMinimum(), 'f' ) +", "+ QString::number( rect->xMaximum(), 'f' ) +", "+ QString::number( rect->yMaximum(), 'f' ) +"],\n";
618649
fcString += " \"features\": [\n";
619650
result = fcString.toUtf8();
620651
request.startGetFeatureResponse( &result, format );
621652
}
622653
else
623654
{
655+
//Prepare url
656+
//Some client requests already have http://<SERVER_NAME> in the REQUEST_URI variable
657+
QString hrefString;
658+
QString requestUrl = getenv( "REQUEST_URI" );
659+
QUrl mapUrl( requestUrl );
660+
mapUrl.setHost( QString( getenv( "SERVER_NAME" ) ) );
661+
662+
//Add non-default ports to url
663+
QString portString = getenv( "SERVER_PORT" );
664+
if ( !portString.isEmpty() )
665+
{
666+
bool portOk;
667+
int portNumber = portString.toInt( &portOk );
668+
if ( portOk )
669+
{
670+
if ( portNumber != 80 )
671+
{
672+
mapUrl.setPort( portNumber );
673+
}
674+
}
675+
}
676+
677+
if ( QString( getenv( "HTTPS" ) ).compare( "on", Qt::CaseInsensitive ) == 0 )
678+
{
679+
mapUrl.setScheme( "https" );
680+
}
681+
else
682+
{
683+
mapUrl.setScheme( "http" );
684+
}
685+
686+
QList<QPair<QString, QString> > queryItems = mapUrl.queryItems();
687+
QList<QPair<QString, QString> >::const_iterator queryIt = queryItems.constBegin();
688+
for ( ; queryIt != queryItems.constEnd(); ++queryIt )
689+
{
690+
if ( queryIt->first.compare( "REQUEST", Qt::CaseInsensitive ) == 0 )
691+
{
692+
mapUrl.removeQueryItem( queryIt->first );
693+
mapUrl.addQueryItem( queryIt->first, "DescribeFeatureType" );
694+
}
695+
else if ( queryIt->first.compare( "FORMAT", Qt::CaseInsensitive ) == 0 )
696+
{
697+
mapUrl.removeQueryItem( queryIt->first );
698+
}
699+
else if ( queryIt->first.compare( "OUTPUTFORMAT", Qt::CaseInsensitive ) == 0 )
700+
{
701+
mapUrl.removeQueryItem( queryIt->first );
702+
}
703+
else if ( queryIt->first.compare( "BBOX", Qt::CaseInsensitive ) == 0 )
704+
{
705+
mapUrl.removeQueryItem( queryIt->first );
706+
}
707+
else if ( queryIt->first.compare( "FEATUREID", Qt::CaseInsensitive ) == 0 )
708+
{
709+
mapUrl.removeQueryItem( queryIt->first );
710+
}
711+
else if ( queryIt->first.compare( "FILTER", Qt::CaseInsensitive ) == 0 )
712+
{
713+
mapUrl.removeQueryItem( queryIt->first );
714+
}
715+
else if ( queryIt->first.compare( "MAXFEATURES", Qt::CaseInsensitive ) == 0 )
716+
{
717+
mapUrl.removeQueryItem( queryIt->first );
718+
}
719+
else if ( queryIt->first.compare( "PROPERTYNAME", Qt::CaseInsensitive ) == 0 )
720+
{
721+
mapUrl.removeQueryItem( queryIt->first );
722+
}
723+
else if ( queryIt->first.compare( "_DC", Qt::CaseInsensitive ) == 0 )
724+
{
725+
mapUrl.removeQueryItem( queryIt->first );
726+
}
727+
}
728+
mapUrl.addQueryItem( "OUTPUTFORMAT", "XMLSCHEMA" );
729+
hrefString = mapUrl.toString();
730+
624731
//wfs:FeatureCollection
625732
fcString = "<wfs:FeatureCollection";
626733
fcString += " xmlns=\"http://www.opengis.net/wfs\"";
627734
fcString += " xmlns:wfs=\"http://www.opengis.net/wfs\"";
628735
fcString += " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"";
629-
fcString += " xsi:schemaLocation=\"http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/wfs.xsd\"";
736+
fcString += " xsi:schemaLocation=\"http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/wfs.xsd http://www.opengis.net/gml "+ hrefString.replace( "&", "&amp;" ) +"\"";
630737
fcString += " xmlns:ogc=\"http://www.opengis.net/ogc\"";
631738
fcString += " xmlns:gml=\"http://www.opengis.net/gml\"";
632739
fcString += " xmlns:ows=\"http://www.opengis.net/ows\"";
@@ -635,6 +742,21 @@ void QgsWFSServer::startGetFeature( QgsRequestHandler& request, const QString& f
635742
fcString += ">";
636743
result = fcString.toUtf8();
637744
request.startGetFeatureResponse( &result, format );
745+
746+
QDomDocument doc;
747+
QDomElement bbElem = doc.createElement( "gml:boundedBy" );
748+
QDomElement boxElem = createBoxElem( rect, doc );
749+
if ( !boxElem.isNull() )
750+
{
751+
if ( crs.isValid() )
752+
{
753+
boxElem.setAttribute( "srsName", crs.authid() );
754+
}
755+
bbElem.appendChild( boxElem );
756+
doc.appendChild( bbElem );
757+
}
758+
result = doc.toByteArray();
759+
request.sendGetFeatureResponse( &result );
638760
}
639761
fcString = "";
640762
}
@@ -701,6 +823,10 @@ QString QgsWFSServer::createFeatureGeoJSON( QgsFeature* feat, QgsCoordinateRefer
701823
QgsGeometry* geom = feat->geometry();
702824
if ( geom && mWithGeom )
703825
{
826+
QgsRectangle box = geom->boundingBox();
827+
828+
fStr += " \"bbox\": [ "+ QString::number( box.xMinimum(), 'f' ) +", "+ QString::number( box.yMinimum(), 'f' ) +", "+ QString::number( box.xMaximum(), 'f' ) +", "+ QString::number( box.yMaximum(), 'f' ) +"],\n";
829+
704830
fStr += " \"geometry\": ";
705831
fStr += geom->exportToGeoJSON();
706832
fStr += ",\n";
@@ -759,14 +885,25 @@ QDomElement QgsWFSServer::createFeatureElem( QgsFeature* feat, QDomDocument& doc
759885
if ( mWithGeom )
760886
{
761887
//add geometry column (as gml)
888+
QgsGeometry* geom = feat->geometry();
889+
762890
QDomElement geomElem = doc.createElement( "qgs:geometry" );
763-
QDomElement gmlElem = createGeometryElem( feat->geometry(), doc );
891+
QDomElement gmlElem = createGeometryElem( geom, doc );
764892
if ( !gmlElem.isNull() )
765893
{
894+
QgsRectangle box = geom->boundingBox();
895+
QDomElement bbElem = doc.createElement( "gml:boundedBy" );
896+
QDomElement boxElem = createBoxElem( &box, doc );
897+
766898
if ( crs.isValid() )
767899
{
900+
boxElem.setAttribute( "srsName", crs.authid() );
768901
gmlElem.setAttribute( "srsName", crs.authid() );
769902
}
903+
904+
bbElem.appendChild( boxElem );
905+
typeNameElement.appendChild( bbElem );
906+
770907
geomElem.appendChild( gmlElem );
771908
typeNameElement.appendChild( geomElem );
772909
}
@@ -793,6 +930,27 @@ QDomElement QgsWFSServer::createFeatureElem( QgsFeature* feat, QDomDocument& doc
793930
return featureElement;
794931
}
795932

933+
QDomElement QgsWFSServer::createBoxElem( QgsRectangle* box, QDomDocument& doc ) /*const*/
934+
{
935+
if ( !box )
936+
{
937+
return QDomElement();
938+
}
939+
940+
QDomElement boxElem = doc.createElement( "gml:Box" );
941+
QVector<QgsPoint> v;
942+
QgsPoint p1;
943+
p1.set( box->xMinimum(), box->yMinimum() );
944+
v.append( p1 );
945+
QgsPoint p2;
946+
p2.set( box->xMaximum(), box->yMaximum() );
947+
v.append( p2 );
948+
QDomElement coordElem = createCoordinateElem( v, doc );
949+
boxElem.appendChild( coordElem );
950+
951+
return boxElem;
952+
}
953+
796954
QDomElement QgsWFSServer::createGeometryElem( QgsGeometry* geom, QDomDocument& doc ) /*const*/
797955
{
798956
if ( !geom )
@@ -931,13 +1089,13 @@ QDomElement QgsWFSServer::createPolygonElem( QgsGeometry* geom, QDomDocument& do
9311089
QString boundaryName;
9321090
if ( i == 0 )
9331091
{
934-
boundaryName = "outerBoundaryIs";
1092+
boundaryName = "gml:outerBoundaryIs";
9351093
}
9361094
else
9371095
{
938-
boundaryName = "innerBoundaryIs";
1096+
boundaryName = "gml:innerBoundaryIs";
9391097
}
940-
QDomElement boundaryElem = doc.createElementNS( "http://www.opengis.net/gml", boundaryName );
1098+
QDomElement boundaryElem = doc.createElement( boundaryName );
9411099
QDomElement ringElem = doc.createElement( "gml:LinearRing" );
9421100
QDomElement coordElem = createCoordinateElem( poly.at( i ), doc );
9431101
ringElem.appendChild( coordElem );
@@ -979,7 +1137,7 @@ QDomElement QgsWFSServer::createCoordinateElem( const QVector<QgsPoint> points,
9791137
coordElem.setAttribute( "ts", " " );
9801138

9811139
//precision 4 for meters / feet, precision 8 for degrees
982-
int precision = 8;
1140+
int precision = 6;
9831141
/*
9841142
if ( mSourceCRS.mapUnits() == QGis::Meters
9851143
|| mSourceCRS.mapUnits() == QGis::Feet )
@@ -996,9 +1154,9 @@ QDomElement QgsWFSServer::createCoordinateElem( const QVector<QgsPoint> points,
9961154
{
9971155
coordString += " ";
9981156
}
999-
coordString += QString::number( pointIt->x(), 'f', precision );
1157+
coordString += QString::number( pointIt->x(), 'f');
10001158
coordString += ",";
1001-
coordString += QString::number( pointIt->y(), 'f', precision );
1159+
coordString += QString::number( pointIt->y(), 'f' );
10021160
}
10031161

10041162
QDomText coordText = doc.createTextNode( coordString );

src/mapserver/qgswfsserver.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class QgsVectorLayer;
3636
class QgsCoordinateReferenceSystem;
3737
class QgsField;
3838
class QgsFeature;
39+
class QgsRectangle;
3940
class QgsGeometry;
4041
class QgsSymbol;
4142
class QgsRequestHandler;
@@ -80,7 +81,7 @@ class QgsWFSServer
8081

8182
protected:
8283

83-
void startGetFeature( QgsRequestHandler& request, const QString& format );
84+
void startGetFeature( QgsRequestHandler& request, const QString& format, QgsCoordinateReferenceSystem& crs, QgsRectangle* rect );
8485
void sendGetFeature( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, QgsCoordinateReferenceSystem& crs, QMap< int, QgsField > fields, QSet<QString> hiddenAttributes );
8586
void endGetFeature( QgsRequestHandler& request, const QString& format );
8687

@@ -90,6 +91,7 @@ class QgsWFSServer
9091
//methods to write GML2
9192
QDomElement createFeatureElem( QgsFeature* feat, QDomDocument& doc, QgsCoordinateReferenceSystem& crs, QMap< int, QgsField > fields, QSet<QString> hiddenAttributes ) /*const*/;
9293

94+
QDomElement createBoxElem( QgsRectangle* box, QDomDocument& doc ) /* const */;
9395
QDomElement createGeometryElem( QgsGeometry* g, QDomDocument& doc ) /*const*/;
9496
QDomElement createLineStringElem( QgsGeometry* geom, QDomDocument& doc ) const;
9597
QDomElement createMultiLineStringElem( QgsGeometry* geom, QDomDocument& doc ) const;

0 commit comments

Comments
 (0)