@@ -331,37 +331,7 @@ QDomDocument QgsWFSServer::describeFeatureType()
331
331
// xsd:element
332
332
QDomElement geomElem = doc.createElement ( " element" /* xsd:element*/ );
333
333
geomElem.setAttribute ( " name" , " geometry" );
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
- }
334
+ geomElem.setAttribute ( " type" , " gml:GeometryPropertyType" );
365
335
geomElem.setAttribute ( " minOccurs" , " 0" );
366
336
geomElem.setAttribute ( " maxOccurs" , " 1" );
367
337
sequenceElem.appendChild ( geomElem );
@@ -573,11 +543,9 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
573
543
}
574
544
}
575
545
576
- if ( bboxOk )
577
- searchRect.set ( minx, miny, maxx, maxy );
578
546
QgsCoordinateReferenceSystem layerCrs = layer->crs ();
579
547
580
- startGetFeature ( request, format, layerCrs, &searchRect );
548
+ startGetFeature ( request, format );
581
549
582
550
if ( fidOk )
583
551
{
@@ -621,6 +589,8 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
621
589
}
622
590
else
623
591
{
592
+ if ( bboxOk )
593
+ searchRect.set ( minx, miny, maxx, maxy );
624
594
provider->select ( attrIndexes, searchRect, mWithGeom , true );
625
595
while ( provider->nextFeature ( feature ) && featureCounter < maxFeat )
626
596
{
@@ -638,102 +608,25 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
638
608
return 0 ;
639
609
}
640
610
641
- void QgsWFSServer::startGetFeature ( QgsRequestHandler& request, const QString& format, QgsCoordinateReferenceSystem& crs, QgsRectangle* rect )
611
+ void QgsWFSServer::startGetFeature ( QgsRequestHandler& request, const QString& format )
642
612
{
643
613
QByteArray result;
644
614
QString fcString;
645
615
if ( format == " GeoJSON" )
646
616
{
647
617
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 " ;
649
618
fcString += " \" features\" : [\n " ;
650
619
result = fcString.toUtf8 ();
651
620
request.startGetFeatureResponse ( &result, format );
652
621
}
653
622
else
654
623
{
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
-
731
624
// wfs:FeatureCollection
732
625
fcString = " <wfs:FeatureCollection" ;
733
626
fcString += " xmlns=\" http://www.opengis.net/wfs\" " ;
734
627
fcString += " xmlns:wfs=\" http://www.opengis.net/wfs\" " ;
735
628
fcString += " xmlns:xsi=\" http://www.w3.org/2001/XMLSchema-instance\" " ;
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 ( " & " , " & " ) + " \" " ;
629
+ fcString += " xsi:schemaLocation=\" http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/wfs.xsd\" " ;
737
630
fcString += " xmlns:ogc=\" http://www.opengis.net/ogc\" " ;
738
631
fcString += " xmlns:gml=\" http://www.opengis.net/gml\" " ;
739
632
fcString += " xmlns:ows=\" http://www.opengis.net/ows\" " ;
@@ -742,21 +635,6 @@ void QgsWFSServer::startGetFeature( QgsRequestHandler& request, const QString& f
742
635
fcString += " >" ;
743
636
result = fcString.toUtf8 ();
744
637
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 );
760
638
}
761
639
fcString = " " ;
762
640
}
@@ -823,10 +701,6 @@ QString QgsWFSServer::createFeatureGeoJSON( QgsFeature* feat, QgsCoordinateRefer
823
701
QgsGeometry* geom = feat->geometry ();
824
702
if ( geom && mWithGeom )
825
703
{
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
-
830
704
fStr += " \" geometry\" : " ;
831
705
fStr += geom->exportToGeoJSON ();
832
706
fStr += " ,\n " ;
@@ -885,25 +759,14 @@ QDomElement QgsWFSServer::createFeatureElem( QgsFeature* feat, QDomDocument& doc
885
759
if ( mWithGeom )
886
760
{
887
761
// add geometry column (as gml)
888
- QgsGeometry* geom = feat->geometry ();
889
-
890
762
QDomElement geomElem = doc.createElement ( " qgs:geometry" );
891
- QDomElement gmlElem = createGeometryElem ( geom , doc );
763
+ QDomElement gmlElem = createGeometryElem ( feat-> geometry () , doc );
892
764
if ( !gmlElem.isNull () )
893
765
{
894
- QgsRectangle box = geom->boundingBox ();
895
- QDomElement bbElem = doc.createElement ( " gml:boundedBy" );
896
- QDomElement boxElem = createBoxElem ( &box, doc );
897
-
898
766
if ( crs.isValid () )
899
767
{
900
- boxElem.setAttribute ( " srsName" , crs.authid () );
901
768
gmlElem.setAttribute ( " srsName" , crs.authid () );
902
769
}
903
-
904
- bbElem.appendChild ( boxElem );
905
- typeNameElement.appendChild ( bbElem );
906
-
907
770
geomElem.appendChild ( gmlElem );
908
771
typeNameElement.appendChild ( geomElem );
909
772
}
@@ -930,27 +793,6 @@ QDomElement QgsWFSServer::createFeatureElem( QgsFeature* feat, QDomDocument& doc
930
793
return featureElement;
931
794
}
932
795
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
-
954
796
QDomElement QgsWFSServer::createGeometryElem ( QgsGeometry* geom, QDomDocument& doc ) /* const*/
955
797
{
956
798
if ( !geom )
@@ -1089,13 +931,13 @@ QDomElement QgsWFSServer::createPolygonElem( QgsGeometry* geom, QDomDocument& do
1089
931
QString boundaryName;
1090
932
if ( i == 0 )
1091
933
{
1092
- boundaryName = " gml: outerBoundaryIs" ;
934
+ boundaryName = " outerBoundaryIs" ;
1093
935
}
1094
936
else
1095
937
{
1096
- boundaryName = " gml: innerBoundaryIs" ;
938
+ boundaryName = " innerBoundaryIs" ;
1097
939
}
1098
- QDomElement boundaryElem = doc.createElement ( boundaryName );
940
+ QDomElement boundaryElem = doc.createElementNS ( " http://www.opengis.net/gml " , boundaryName );
1099
941
QDomElement ringElem = doc.createElement ( " gml:LinearRing" );
1100
942
QDomElement coordElem = createCoordinateElem ( poly.at ( i ), doc );
1101
943
ringElem.appendChild ( coordElem );
@@ -1137,7 +979,7 @@ QDomElement QgsWFSServer::createCoordinateElem( const QVector<QgsPoint> points,
1137
979
coordElem.setAttribute ( " ts" , " " );
1138
980
1139
981
// precision 4 for meters / feet, precision 8 for degrees
1140
- int precision = 6 ;
982
+ int precision = 8 ;
1141
983
/*
1142
984
if ( mSourceCRS.mapUnits() == QGis::Meters
1143
985
|| mSourceCRS.mapUnits() == QGis::Feet )
@@ -1154,9 +996,9 @@ QDomElement QgsWFSServer::createCoordinateElem( const QVector<QgsPoint> points,
1154
996
{
1155
997
coordString += " " ;
1156
998
}
1157
- coordString += QString::number ( pointIt->x (), ' f' );
999
+ coordString += QString::number ( pointIt->x (), ' f' , precision );
1158
1000
coordString += " ," ;
1159
- coordString += QString::number ( pointIt->y (), ' f' );
1001
+ coordString += QString::number ( pointIt->y (), ' f' , precision );
1160
1002
}
1161
1003
1162
1004
QDomText coordText = doc.createTextNode ( coordString );
0 commit comments