Skip to content

Commit 11d5bd3

Browse files
committedJan 17, 2013
Merge pull request #392 from rldhont/new_vector_api
Update QGIS WFS Server to use the new vector API
2 parents a6c5fd8 + e12d139 commit 11d5bd3

File tree

3 files changed

+44
-51
lines changed

3 files changed

+44
-51
lines changed
 

‎src/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ IF (WITH_BINDINGS)
1717
ENDIF (WITH_BINDINGS)
1818

1919
IF (WITH_MAPSERVER)
20-
#ADD_SUBDIRECTORY(mapserver) # TODO: enable again once compilation is fixed
20+
ADD_SUBDIRECTORY(mapserver) # TODO: enable again once compilation is fixed
2121
ENDIF (WITH_MAPSERVER)
2222

2323
IF (WITH_ASTYLE)

‎src/mapserver/qgswfsserver.cpp

Lines changed: 40 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
453453
if ( maxFeatures == -1 )
454454
maxFeat += layer->featureCount();
455455

456-
provider->select( attrIndexes, searchRect, mWithGeom, true );
456+
layer->select( attrIndexes, searchRect, mWithGeom, true );
457457

458458
long featCounter = 0;
459459
QDomNodeList filterNodes = queryElem.elementsByTagName( "Filter" );
@@ -476,7 +476,8 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
476476
fid = fid.section( ".", 1, 1 );
477477
}
478478

479-
provider->featureAtId( fid.toInt(), feature, mWithGeom, attrIndexes );
479+
//Need to be test for propertyname
480+
layer->featureAtId( fid.toInt(), feature, mWithGeom, true );
480481

481482
if ( featureCounter == 0 )
482483
startGetFeature( request, format, layerCrs, &searchRect );
@@ -497,16 +498,16 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
497498
if ( childElem.tagName() == "Box" )
498499
{
499500
QgsRectangle* rect = new QgsRectangle( childElem );
500-
provider->select( attrIndexes, *rect, mWithGeom, true );
501+
layer->select( attrIndexes, *rect, mWithGeom, true );
501502
}
502503
else if ( childElem.tagName() != "PropertyName" )
503504
{
504505
QgsGeometry* geom = QgsGeometry::fromGML2( childElem );
505-
provider->select( attrIndexes, geom->boundingBox(), mWithGeom, true );
506+
layer->select( attrIndexes, geom->boundingBox(), mWithGeom, true );
506507
}
507508
childElem = childElem.nextSiblingElement();
508509
}
509-
while ( provider->nextFeature( feature ) && featureCounter < maxFeat )
510+
while ( layer->nextFeature( feature ) && featureCounter < maxFeat )
510511
{
511512
if ( featureCounter == 0 )
512513
startGetFeature( request, format, layerCrs, &searchRect );
@@ -525,7 +526,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
525526
}
526527
if ( mFilter )
527528
{
528-
while ( provider->nextFeature( feature ) && featureCounter < maxFeat )
529+
while ( layer->nextFeature( feature ) && featureCounter < maxFeat )
529530
{
530531
QVariant res = mFilter->evaluate( &feature, fields );
531532
if ( mFilter->hasEvalError() )
@@ -547,7 +548,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
547548
}
548549
else
549550
{
550-
while ( provider->nextFeature( feature ) && featureCounter < maxFeat )
551+
while ( layer->nextFeature( feature ) && featureCounter < maxFeat )
551552
{
552553
if ( featureCounter == 0 )
553554
startGetFeature( request, format, layerCrs, &searchRect );
@@ -731,7 +732,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
731732

732733
QgsFeature feature;
733734
QgsAttributeMap featureAttributes;
734-
const QgsFieldMap& fields = provider->fields();
735+
const QgsFields& fields = provider->fields();
735736

736737
//map extent
737738
QgsRectangle searchRect = layer->extent();
@@ -782,7 +783,8 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
782783
{
783784
if ( !fidStr.startsWith( tnStr ) )
784785
continue;
785-
provider->featureAtId( fidStr.section( ".", 1, 1 ).toInt(), feature, mWithGeom, attrIndexes );
786+
//Need to be test for propertyname
787+
layer->featureAtId( fidStr.section( ".", 1, 1 ).toInt(), feature, mWithGeom, true );
786788

787789
if ( featureCounter == 0 )
788790
startGetFeature( request, format, layerCrs, &searchRect );
@@ -794,15 +796,15 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
794796
}
795797
else if ( expFilterOk )
796798
{
797-
provider->select( attrIndexes, searchRect, mWithGeom, true );
799+
layer->select( attrIndexes, searchRect, mWithGeom, true );
798800
QgsExpression *mFilter = new QgsExpression( expFilter );
799801
if ( mFilter->hasParserError() )
800802
{
801803
throw QgsMapServiceException( "RequestNotWellFormed", mFilter->parserErrorString() );
802804
}
803805
if ( mFilter )
804806
{
805-
while ( provider->nextFeature( feature ) && featureCounter < maxFeat )
807+
while ( layer->nextFeature( feature ) && featureCounter < maxFeat )
806808
{
807809
QVariant res = mFilter->evaluate( &feature, fields );
808810
if ( mFilter->hasEvalError() )
@@ -824,7 +826,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
824826
}
825827
else if ( filterOk )
826828
{
827-
provider->select( attrIndexes, searchRect, mWithGeom, true );
829+
layer->select( attrIndexes, searchRect, mWithGeom, true );
828830
QDomElement filterElem = filter.firstChildElement();
829831
QDomNodeList fidNodes = filterElem.elementsByTagName( "FeatureId" );
830832
if ( fidNodes.size() > 0 )
@@ -842,7 +844,8 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
842844
fid = fid.section( ".", 1, 1 );
843845
}
844846

845-
provider->featureAtId( fid.toInt(), feature, mWithGeom, attrIndexes );
847+
//Need to be test for propertyname
848+
layer->featureAtId( fid.toInt(), feature, mWithGeom, true );
846849

847850
if ( featureCounter == 0 )
848851
startGetFeature( request, format, layerCrs, &searchRect );
@@ -863,16 +866,16 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
863866
if ( childElem.tagName() == "Box" )
864867
{
865868
QgsRectangle* rect = new QgsRectangle( childElem );
866-
provider->select( attrIndexes, *rect, mWithGeom, true );
869+
layer->select( attrIndexes, *rect, mWithGeom, true );
867870
}
868871
else if ( childElem.tagName() != "PropertyName" )
869872
{
870873
QgsGeometry* geom = QgsGeometry::fromGML2( childElem );
871-
provider->select( attrIndexes, geom->boundingBox(), mWithGeom, true );
874+
layer->select( attrIndexes, geom->boundingBox(), mWithGeom, true );
872875
}
873876
childElem = childElem.nextSiblingElement();
874877
}
875-
while ( provider->nextFeature( feature ) && featureCounter < maxFeat )
878+
while ( layer->nextFeature( feature ) && featureCounter < maxFeat )
876879
{
877880
if ( featureCounter == 0 )
878881
startGetFeature( request, format, layerCrs, &searchRect );
@@ -891,7 +894,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
891894
}
892895
if ( mFilter )
893896
{
894-
while ( provider->nextFeature( feature ) && featureCounter < maxFeat )
897+
while ( layer->nextFeature( feature ) && featureCounter < maxFeat )
895898
{
896899
QVariant res = mFilter->evaluate( &feature, fields );
897900
if ( mFilter->hasEvalError() )
@@ -914,8 +917,8 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
914917
}
915918
else
916919
{
917-
provider->select( attrIndexes, searchRect, mWithGeom, true );
918-
while ( provider->nextFeature( feature ) && featureCounter < maxFeat )
920+
layer->select( attrIndexes, searchRect, mWithGeom, true );
921+
while ( layer->nextFeature( feature ) && featureCounter < maxFeat )
919922
{
920923
if ( featureCounter == 0 )
921924
startGetFeature( request, format, layerCrs, &searchRect );
@@ -1068,7 +1071,7 @@ void QgsWFSServer::startGetFeature( QgsRequestHandler& request, const QString& f
10681071
fcString = "";
10691072
}
10701073

1071-
void QgsWFSServer::sendGetFeature( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, QgsCoordinateReferenceSystem& crs, QMap< int, QgsField > fields, QSet<QString> excludedAttributes ) /*const*/
1074+
void QgsWFSServer::sendGetFeature( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, QgsCoordinateReferenceSystem& crs, QgsFields fields, QSet<QString> excludedAttributes ) /*const*/
10721075
{
10731076
if ( !feat->isValid() )
10741077
return;
@@ -1267,8 +1270,7 @@ QDomDocument QgsWFSServer::transaction( const QString& requestBody )
12671270
}
12681271

12691272
// Update the features
1270-
const QgsFieldMap& fields = provider->fields();
1271-
QgsFieldMap::const_iterator fieldIt;
1273+
const QgsFields& fields = provider->fields();
12721274
QMap<QString, int> fieldMap = provider->fieldNameMap();
12731275
QMap<QString, int>::const_iterator fieldMapIt;
12741276
QString fieldName;
@@ -1286,17 +1288,13 @@ QDomDocument QgsWFSServer::transaction( const QString& requestBody )
12861288
{
12871289
continue;
12881290
}
1289-
fieldIt = fields.find( fieldMapIt.value() );
1290-
if ( fieldIt == fields.constEnd() )
1291-
{
1292-
continue;
1293-
}
1294-
if ( fieldIt.value().type() == 2 )
1295-
layer->changeAttributeValue( *fidIt, fieldIt.key(), it.value().toInt( &conversionSuccess ) );
1296-
else if ( fieldIt.value().type() == 6 )
1297-
layer->changeAttributeValue( *fidIt, fieldIt.key(), it.value().toDouble( &conversionSuccess ) );
1291+
const QgsField& field = fields[fieldMapIt.value()];
1292+
if ( field.type() == 2 )
1293+
layer->changeAttributeValue( *fidIt, fieldMapIt.value(), it.value().toInt( &conversionSuccess ) );
1294+
else if ( field.type() == 6 )
1295+
layer->changeAttributeValue( *fidIt, fieldMapIt.value(), it.value().toDouble( &conversionSuccess ) );
12981296
else
1299-
layer->changeAttributeValue( *fidIt, fieldIt.key(), it.value() );
1297+
layer->changeAttributeValue( *fidIt, fieldMapIt.value(), it.value() );
13001298
}
13011299

13021300
if ( !geometryElem.isNull() )
@@ -1370,8 +1368,7 @@ QDomDocument QgsWFSServer::transaction( const QString& requestBody )
13701368
if ( cap & QgsVectorDataProvider::AddFeatures )
13711369
{
13721370
// Get Layer Field Information
1373-
const QgsFieldMap& fields = provider->fields();
1374-
QgsFieldMap::const_iterator fieldIt;
1371+
const QgsFields& fields = provider->fields();
13751372
QMap<QString, int> fieldMap = provider->fieldNameMap();
13761373
QMap<QString, int>::const_iterator fieldMapIt;
13771374
QString fieldName;
@@ -1406,19 +1403,15 @@ QDomDocument QgsWFSServer::transaction( const QString& requestBody )
14061403
{
14071404
continue;
14081405
}
1409-
fieldIt = fields.find( fieldMapIt.value() );
1410-
if ( fieldIt == fields.constEnd() )
1411-
{
1412-
continue;
1413-
}
1406+
const QgsField& field = fields[fieldMapIt.value()];
14141407
QString attrValue = currentAttributeElement.text();
1415-
int attrType = fieldIt.value().type();
1408+
int attrType = field.type();
14161409
if ( attrType == 2 )
1417-
f->addAttribute( fieldIt.key(), attrValue.toInt() );
1410+
f->setAttribute( fieldMapIt.value(), attrValue.toInt() );
14181411
else if ( attrType == 6 )
1419-
f->addAttribute( fieldIt.key(), attrValue.toDouble() );
1412+
f->setAttribute( fieldMapIt.value(), attrValue.toDouble() );
14201413
else
1421-
f->addAttribute( fieldIt.key(), attrValue );
1414+
f->setAttribute( fieldMapIt.value(), attrValue );
14221415
}
14231416
else //a geometry attribute
14241417
{
@@ -1523,8 +1516,8 @@ QgsFeatureIds QgsWFSServer::getFeatureIdsFromFilter( QDomElement filterElem, Qgs
15231516
if ( mFilter )
15241517
{
15251518
QgsFeature feature;
1526-
const QgsFieldMap& fields = provider->fields();
1527-
while ( provider->nextFeature( feature ) )
1519+
const QgsFields& fields = provider->fields();
1520+
while ( layer->nextFeature( feature ) )
15281521
{
15291522
QVariant res = mFilter->evaluate( &feature, fields );
15301523
if ( mFilter->hasEvalError() )
@@ -1542,7 +1535,7 @@ QgsFeatureIds QgsWFSServer::getFeatureIdsFromFilter( QDomElement filterElem, Qgs
15421535
return fids;
15431536
}
15441537

1545-
QString QgsWFSServer::createFeatureGeoJSON( QgsFeature* feat, QgsCoordinateReferenceSystem &, QMap< int, QgsField > fields, QSet<QString> excludedAttributes ) /*const*/
1538+
QString QgsWFSServer::createFeatureGeoJSON( QgsFeature* feat, QgsCoordinateReferenceSystem &, QgsFields fields, QSet<QString> excludedAttributes ) /*const*/
15461539
{
15471540
QString fStr = "{\"type\": \"Feature\",\n";
15481541

@@ -1603,7 +1596,7 @@ QString QgsWFSServer::createFeatureGeoJSON( QgsFeature* feat, QgsCoordinateRefer
16031596
return fStr;
16041597
}
16051598

1606-
QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc, QgsCoordinateReferenceSystem& crs, QMap< int, QgsField > fields, QSet<QString> excludedAttributes ) /*const*/
1599+
QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc, QgsCoordinateReferenceSystem& crs, QgsFields fields, QSet<QString> excludedAttributes ) /*const*/
16071600
{
16081601
//gml:FeatureMember
16091602
QDomElement featureElement = doc.createElement( "gml:featureMember"/*wfs:FeatureMember*/ );

‎src/mapserver/qgswfsserver.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,17 +96,17 @@ class QgsWFSServer
9696
protected:
9797

9898
void startGetFeature( QgsRequestHandler& request, const QString& format, QgsCoordinateReferenceSystem& crs, QgsRectangle* rect );
99-
void sendGetFeature( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, QgsCoordinateReferenceSystem& crs, QMap< int, QgsField > fields, QSet<QString> excludedAttributes );
99+
void sendGetFeature( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, QgsCoordinateReferenceSystem& crs, QgsFields fields, QSet<QString> excludedAttributes );
100100
void endGetFeature( QgsRequestHandler& request, const QString& format );
101101

102102
//method for transaction
103103
QgsFeatureIds getFeatureIdsFromFilter( QDomElement filter, QgsVectorLayer* layer );
104104

105105
//methods to write GeoJSON
106-
QString createFeatureGeoJSON( QgsFeature* feat, QgsCoordinateReferenceSystem& crs, QMap< int, QgsField > fields, QSet<QString> excludedAttributes ) /*const*/;
106+
QString createFeatureGeoJSON( QgsFeature* feat, QgsCoordinateReferenceSystem& crs, QgsFields fields, QSet<QString> excludedAttributes ) /*const*/;
107107

108108
//methods to write GML2
109-
QDomElement createFeatureGML2( QgsFeature* feat, QDomDocument& doc, QgsCoordinateReferenceSystem& crs, QMap< int, QgsField > fields, QSet<QString> excludedAttributes ) /*const*/;
109+
QDomElement createFeatureGML2( QgsFeature* feat, QDomDocument& doc, QgsCoordinateReferenceSystem& crs, QgsFields fields, QSet<QString> excludedAttributes ) /*const*/;
110110

111111
QDomElement createBoxGML2( QgsRectangle* box, QDomDocument& doc ) /* const */;
112112

0 commit comments

Comments
 (0)
Please sign in to comment.