@@ -379,6 +379,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
379
379
long maxFeat = 0 ;
380
380
long maxFeatures = -1 ;
381
381
long featureCounter = 0 ;
382
+ int layerPrec = 8 ;
382
383
383
384
QDomDocument doc;
384
385
QString errorMsg;
@@ -436,6 +437,9 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
436
437
437
438
// excluded attributes for this layer
438
439
const QSet<QString>& layerExcludedAttributes = layer->excludeAttributesWFS ();
440
+
441
+ // get layer precision
442
+ layerPrec = mConfigParser ->wfsLayerPrecision ( layer->id () );
439
443
440
444
// do a select with searchRect and go through all the features
441
445
QgsVectorDataProvider* provider = layer->dataProvider ();
@@ -526,9 +530,9 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
526
530
).nextFeature ( feature );
527
531
528
532
if ( featureCounter == 0 )
529
- startGetFeature ( request, format, layerCrs, &searchRect );
533
+ startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
530
534
531
- sendGetFeature ( request, format, &feature, featCounter, layerCrs, attrIndexes, layerExcludedAttributes );
535
+ sendGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
532
536
533
537
fid = " " ;
534
538
++featCounter;
@@ -563,9 +567,9 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
563
567
while ( fit.nextFeature ( feature ) && ( maxFeatures == -1 || featureCounter < maxFeat ) )
564
568
{
565
569
if ( featureCounter == 0 )
566
- startGetFeature ( request, format, layerCrs, &searchRect );
570
+ startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
567
571
568
- sendGetFeature ( request, format, &feature, featCounter, layerCrs, attrIndexes, layerExcludedAttributes );
572
+ sendGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
569
573
++featCounter;
570
574
++featureCounter;
571
575
}
@@ -589,9 +593,9 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
589
593
if ( res.toInt () != 0 )
590
594
{
591
595
if ( featureCounter == 0 )
592
- startGetFeature ( request, format, layerCrs, &searchRect );
596
+ startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
593
597
594
- sendGetFeature ( request, format, &feature, featureCounter, layerCrs, attrIndexes, layerExcludedAttributes );
598
+ sendGetFeature ( request, format, &feature, featureCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
595
599
++featureCounter;
596
600
++featCounter;
597
601
}
@@ -604,9 +608,9 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
604
608
while ( fit.nextFeature ( feature ) && ( maxFeatures == -1 || featureCounter < maxFeat ) )
605
609
{
606
610
if ( featureCounter == 0 )
607
- startGetFeature ( request, format, layerCrs, &searchRect );
611
+ startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
608
612
609
- sendGetFeature ( request, format, &feature, featCounter, layerCrs, attrIndexes, layerExcludedAttributes );
613
+ sendGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
610
614
++featCounter;
611
615
++featureCounter;
612
616
}
@@ -621,7 +625,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
621
625
622
626
QgsMapLayerRegistry::instance ()->removeAllMapLayers ();
623
627
if ( featureCounter == 0 )
624
- startGetFeature ( request, format, layerCrs, &searchRect );
628
+ startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
625
629
endGetFeature ( request, format );
626
630
return 0 ;
627
631
}
@@ -774,6 +778,9 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
774
778
775
779
// excluded attributes for this layer
776
780
const QSet<QString>& layerExcludedAttributes = layer->excludeAttributesWFS ();
781
+
782
+ // get layer precision
783
+ int layerPrec = mConfigParser ->wfsLayerPrecision ( layer->id () );
777
784
778
785
// do a select with searchRect and go through all the features
779
786
QgsVectorDataProvider* provider = layer->dataProvider ();
@@ -841,9 +848,9 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
841
848
).nextFeature ( feature );
842
849
843
850
if ( featureCounter == 0 )
844
- startGetFeature ( request, format, layerCrs, &searchRect );
851
+ startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
845
852
846
- sendGetFeature ( request, format, &feature, featCounter, layerCrs, attrIndexes, layerExcludedAttributes );
853
+ sendGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
847
854
++featCounter;
848
855
++featureCounter;
849
856
}
@@ -887,9 +894,9 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
887
894
if ( res.toInt () != 0 )
888
895
{
889
896
if ( featureCounter == 0 )
890
- startGetFeature ( request, format, layerCrs, &searchRect );
897
+ startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
891
898
892
- sendGetFeature ( request, format, &feature, featCounter, layerCrs, attrIndexes, layerExcludedAttributes );
899
+ sendGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
893
900
++featCounter;
894
901
++featureCounter;
895
902
}
@@ -924,9 +931,9 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
924
931
).nextFeature ( feature );
925
932
926
933
if ( featureCounter == 0 )
927
- startGetFeature ( request, format, layerCrs, &searchRect );
934
+ startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
928
935
929
- sendGetFeature ( request, format, &feature, featCounter, layerCrs, attrIndexes, layerExcludedAttributes );
936
+ sendGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
930
937
931
938
fid = " " ;
932
939
++featCounter;
@@ -961,9 +968,9 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
961
968
while ( fit.nextFeature ( feature ) && ( maxFeatures == -1 || featureCounter < maxFeat ) )
962
969
{
963
970
if ( featureCounter == 0 )
964
- startGetFeature ( request, format, layerCrs, &searchRect );
971
+ startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
965
972
966
- sendGetFeature ( request, format, &feature, featCounter, layerCrs, attrIndexes, layerExcludedAttributes );
973
+ sendGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
967
974
++featCounter;
968
975
++featureCounter;
969
976
}
@@ -1006,9 +1013,9 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
1006
1013
if ( res.toInt () != 0 )
1007
1014
{
1008
1015
if ( featureCounter == 0 )
1009
- startGetFeature ( request, format, layerCrs, &searchRect );
1016
+ startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
1010
1017
1011
- sendGetFeature ( request, format, &feature, featureCounter, layerCrs, attrIndexes, layerExcludedAttributes );
1018
+ sendGetFeature ( request, format, &feature, featureCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
1012
1019
++featureCounter;
1013
1020
++featCounter;
1014
1021
}
@@ -1043,9 +1050,9 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
1043
1050
{
1044
1051
mErrors << QString ( " The feature %2 of layer for the TypeName '%1'" ).arg ( tnStr ).arg ( featureCounter );
1045
1052
if ( featureCounter == 0 )
1046
- startGetFeature ( request, format, layerCrs, &searchRect );
1053
+ startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
1047
1054
1048
- sendGetFeature ( request, format, &feature, featCounter, layerCrs, attrIndexes, layerExcludedAttributes );
1055
+ sendGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
1049
1056
++featCounter;
1050
1057
++featureCounter;
1051
1058
}
@@ -1061,20 +1068,20 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
1061
1068
1062
1069
QgsMapLayerRegistry::instance ()->removeAllMapLayers ();
1063
1070
if ( featureCounter == 0 )
1064
- startGetFeature ( request, format, layerCrs, &searchRect );
1071
+ startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
1065
1072
endGetFeature ( request, format );
1066
1073
1067
1074
return 0 ;
1068
1075
}
1069
1076
1070
- void QgsWFSServer::startGetFeature ( QgsRequestHandler& request, const QString& format, QgsCoordinateReferenceSystem& crs, QgsRectangle* rect )
1077
+ void QgsWFSServer::startGetFeature ( QgsRequestHandler& request, const QString& format, int prec, QgsCoordinateReferenceSystem& crs, QgsRectangle* rect )
1071
1078
{
1072
1079
QByteArray result;
1073
1080
QString fcString;
1074
1081
if ( format == " GeoJSON" )
1075
1082
{
1076
1083
fcString = " {\" type\" : \" FeatureCollection\" ,\n " ;
1077
- fcString += " \" bbox\" : [ " + qgsDoubleToString ( rect->xMinimum (), 8 ) + " , " + qgsDoubleToString ( rect->yMinimum (), 8 ) + " , " + qgsDoubleToString ( rect->xMaximum (), 8 ) + " , " + qgsDoubleToString ( rect->yMaximum (), 8 ) + " ],\n " ;
1084
+ fcString += " \" bbox\" : [ " + qgsDoubleToString ( rect->xMinimum (), prec ) + " , " + qgsDoubleToString ( rect->yMinimum (), prec ) + " , " + qgsDoubleToString ( rect->xMaximum (), prec ) + " , " + qgsDoubleToString ( rect->yMaximum (), prec ) + " ],\n " ;
1078
1085
fcString += " \" features\" : [\n " ;
1079
1086
result = fcString.toUtf8 ();
1080
1087
request.startGetFeatureResponse ( &result, format );
@@ -1167,7 +1174,7 @@ void QgsWFSServer::startGetFeature( QgsRequestHandler& request, const QString& f
1167
1174
QDomElement bbElem = doc.createElement ( " gml:boundedBy" );
1168
1175
if ( format == " GML3" )
1169
1176
{
1170
- QDomElement envElem = QgsOgcUtils::rectangleToGMLEnvelope ( rect, doc, 8 );
1177
+ QDomElement envElem = QgsOgcUtils::rectangleToGMLEnvelope ( rect, doc, prec );
1171
1178
if ( !envElem.isNull () )
1172
1179
{
1173
1180
if ( crs.isValid () )
@@ -1180,7 +1187,7 @@ void QgsWFSServer::startGetFeature( QgsRequestHandler& request, const QString& f
1180
1187
}
1181
1188
else
1182
1189
{
1183
- QDomElement boxElem = QgsOgcUtils::rectangleToGMLBox ( rect, doc, 8 );
1190
+ QDomElement boxElem = QgsOgcUtils::rectangleToGMLBox ( rect, doc, prec );
1184
1191
if ( !boxElem.isNull () )
1185
1192
{
1186
1193
if ( crs.isValid () )
@@ -1197,7 +1204,7 @@ void QgsWFSServer::startGetFeature( QgsRequestHandler& request, const QString& f
1197
1204
fcString = " " ;
1198
1205
}
1199
1206
1200
- void QgsWFSServer::sendGetFeature ( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, QgsCoordinateReferenceSystem& crs, QgsAttributeList attrIndexes, QSet<QString> excludedAttributes ) /* const*/
1207
+ void QgsWFSServer::sendGetFeature ( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, int prec, QgsCoordinateReferenceSystem& crs, QgsAttributeList attrIndexes, QSet<QString> excludedAttributes ) /* const*/
1201
1208
{
1202
1209
if ( !feat->isValid () )
1203
1210
return ;
@@ -1210,7 +1217,7 @@ void QgsWFSServer::sendGetFeature( QgsRequestHandler& request, const QString& fo
1210
1217
fcString += " " ;
1211
1218
else
1212
1219
fcString += " ," ;
1213
- fcString += createFeatureGeoJSON ( feat, crs, attrIndexes, excludedAttributes );
1220
+ fcString += createFeatureGeoJSON ( feat, prec, crs, attrIndexes, excludedAttributes );
1214
1221
fcString += " \n " ;
1215
1222
1216
1223
result = fcString.toUtf8 ();
@@ -1223,12 +1230,12 @@ void QgsWFSServer::sendGetFeature( QgsRequestHandler& request, const QString& fo
1223
1230
QDomElement featureElement;
1224
1231
if ( format == " GML3" )
1225
1232
{
1226
- featureElement = createFeatureGML3 ( feat, gmlDoc, crs, attrIndexes, excludedAttributes );
1233
+ featureElement = createFeatureGML3 ( feat, gmlDoc, prec, crs, attrIndexes, excludedAttributes );
1227
1234
gmlDoc.appendChild ( featureElement );
1228
1235
}
1229
1236
else
1230
1237
{
1231
- featureElement = createFeatureGML2 ( feat, gmlDoc, crs, attrIndexes, excludedAttributes );
1238
+ featureElement = createFeatureGML2 ( feat, gmlDoc, prec, crs, attrIndexes, excludedAttributes );
1232
1239
gmlDoc.appendChild ( featureElement );
1233
1240
}
1234
1241
@@ -1678,7 +1685,7 @@ QgsFeatureIds QgsWFSServer::getFeatureIdsFromFilter( QDomElement filterElem, Qgs
1678
1685
return fids;
1679
1686
}
1680
1687
1681
- QString QgsWFSServer::createFeatureGeoJSON ( QgsFeature* feat, QgsCoordinateReferenceSystem &, QgsAttributeList attrIndexes, QSet<QString> excludedAttributes ) /* const*/
1688
+ QString QgsWFSServer::createFeatureGeoJSON ( QgsFeature* feat, int prec, QgsCoordinateReferenceSystem &, QgsAttributeList attrIndexes, QSet<QString> excludedAttributes ) /* const*/
1682
1689
{
1683
1690
QString fStr = " {\" type\" : \" Feature\" ,\n " ;
1684
1691
@@ -1691,10 +1698,10 @@ QString QgsWFSServer::createFeatureGeoJSON( QgsFeature* feat, QgsCoordinateRefer
1691
1698
{
1692
1699
QgsRectangle box = geom->boundingBox ();
1693
1700
1694
- fStr += " \" bbox\" : [ " + qgsDoubleToString ( box.xMinimum (), 8 ) + " , " + qgsDoubleToString ( box.yMinimum (), 8 ) + " , " + qgsDoubleToString ( box.xMaximum (), 8 ) + " , " + qgsDoubleToString ( box.yMaximum (), 8 ) + " ],\n " ;
1701
+ fStr += " \" bbox\" : [ " + qgsDoubleToString ( box.xMinimum (), prec ) + " , " + qgsDoubleToString ( box.yMinimum (), prec ) + " , " + qgsDoubleToString ( box.xMaximum (), prec ) + " , " + qgsDoubleToString ( box.yMaximum (), prec ) + " ],\n " ;
1695
1702
1696
1703
fStr += " \" geometry\" : " ;
1697
- fStr += geom->exportToGeoJSON ( 8 );
1704
+ fStr += geom->exportToGeoJSON ( prec );
1698
1705
fStr += " ,\n " ;
1699
1706
}
1700
1707
@@ -1741,7 +1748,7 @@ QString QgsWFSServer::createFeatureGeoJSON( QgsFeature* feat, QgsCoordinateRefer
1741
1748
return fStr ;
1742
1749
}
1743
1750
1744
- QDomElement QgsWFSServer::createFeatureGML2 ( QgsFeature* feat, QDomDocument& doc, QgsCoordinateReferenceSystem& crs, QgsAttributeList attrIndexes, QSet<QString> excludedAttributes ) /* const*/
1751
+ QDomElement QgsWFSServer::createFeatureGML2 ( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, QgsAttributeList attrIndexes, QSet<QString> excludedAttributes ) /* const*/
1745
1752
{
1746
1753
// gml:FeatureMember
1747
1754
QDomElement featureElement = doc.createElement ( " gml:featureMember" /* wfs:FeatureMember*/ );
@@ -1757,12 +1764,12 @@ QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc
1757
1764
QgsGeometry* geom = feat->geometry ();
1758
1765
1759
1766
QDomElement geomElem = doc.createElement ( " qgs:geometry" );
1760
- QDomElement gmlElem = QgsOgcUtils::geometryToGML ( geom, doc, 8 );
1767
+ QDomElement gmlElem = QgsOgcUtils::geometryToGML ( geom, doc, prec );
1761
1768
if ( !gmlElem.isNull () )
1762
1769
{
1763
1770
QgsRectangle box = geom->boundingBox ();
1764
1771
QDomElement bbElem = doc.createElement ( " gml:boundedBy" );
1765
- QDomElement boxElem = QgsOgcUtils::rectangleToGMLBox ( &box, doc, 8 );
1772
+ QDomElement boxElem = QgsOgcUtils::rectangleToGMLBox ( &box, doc, prec );
1766
1773
1767
1774
if ( crs.isValid () )
1768
1775
{
@@ -1800,7 +1807,7 @@ QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc
1800
1807
return featureElement;
1801
1808
}
1802
1809
1803
- QDomElement QgsWFSServer::createFeatureGML3 ( QgsFeature* feat, QDomDocument& doc, QgsCoordinateReferenceSystem& crs, QgsAttributeList attrIndexes, QSet<QString> excludedAttributes ) /* const*/
1810
+ QDomElement QgsWFSServer::createFeatureGML3 ( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, QgsAttributeList attrIndexes, QSet<QString> excludedAttributes ) /* const*/
1804
1811
{
1805
1812
// gml:FeatureMember
1806
1813
QDomElement featureElement = doc.createElement ( " gml:featureMember" /* wfs:FeatureMember*/ );
@@ -1816,12 +1823,12 @@ QDomElement QgsWFSServer::createFeatureGML3( QgsFeature* feat, QDomDocument& doc
1816
1823
QgsGeometry* geom = feat->geometry ();
1817
1824
1818
1825
QDomElement geomElem = doc.createElement ( " qgs:geometry" );
1819
- QDomElement gmlElem = QgsOgcUtils::geometryToGML ( geom, doc, " GML3" , 8 );
1826
+ QDomElement gmlElem = QgsOgcUtils::geometryToGML ( geom, doc, " GML3" , prec );
1820
1827
if ( !gmlElem.isNull () )
1821
1828
{
1822
1829
QgsRectangle box = geom->boundingBox ();
1823
1830
QDomElement bbElem = doc.createElement ( " gml:boundedBy" );
1824
- QDomElement boxElem = QgsOgcUtils::rectangleToGMLEnvelope ( &box, doc, 8 );
1831
+ QDomElement boxElem = QgsOgcUtils::rectangleToGMLEnvelope ( &box, doc, prec );
1825
1832
1826
1833
if ( crs.isValid () )
1827
1834
{
0 commit comments