3131#include " qgslogger.h"
3232#include " qgsmessagelog.h"
3333#include " qgsogrutils.h"
34+ #include " qgsreferencedgeometry.h"
3435#include " qgsserverapicontext.h"
3536#include " qgsserverapiutils.h"
3637#include " qgsserverfeatureid.h"
@@ -455,8 +456,26 @@ void QgsWfs3AbstractItemsHandler::gatherLayerFieldsInfo( json &data, const QgsVe
455456 fInfo .type = " string" ;
456457 break ;
457458 }
459+ case QMetaType::Type::QByteArray:
460+ {
461+ fInfo .type = " binary" ;
462+ break ;
463+ }
464+ case QMetaType::Type::User:
465+ {
466+ if ( field.typeName ().toLower () == " geometry" )
467+ {
468+ // no format: we do not have the information about the geometry type
469+ fInfo .format = " geometry-any" ;
470+ fInfo .type = " string" ;
471+ }
472+ break ;
473+ }
458474 default :
475+ {
476+ QgsDebugMsgLevel ( u" Field '%1' has unsupported meta type '%2', defaulting to string" _s.arg ( field.name () ).arg ( field.type () ), 2 );
459477 break ;
478+ }
460479 }
461480 };
462481
@@ -667,6 +686,8 @@ void QgsWfs3AbstractItemsHandler::gatherLayerFieldsInfo( json &data, const QgsVe
667686 // For now, we skip and warn (info level) assuming that if the widget is not set this is intentional.
668687 QgsMessageLog::logMessage ( u" Unhandled widget type '%1' for field '%2'" _s.arg ( widgetType, fieldIdentifier ), u" Server" _s, Qgis::MessageLevel::Info );
669688 }
689+ // ////////////////////////////////////////////////////
690+ // Generic code that may apply to several widget types
670691
671692 // Extract the pattern
672693 const QgsFieldConstraints constraints = field.constraints ();
@@ -692,9 +713,6 @@ void QgsWfs3AbstractItemsHandler::gatherLayerFieldsInfo( json &data, const QgsVe
692713 }
693714 }
694715
695- // ////////////////////////////////////////////////////
696- // Generic code that may apply to several widget types
697-
698716 // Check for std::numeric_limits max/min(lowest for double) and reset if found
699717 if ( fInfo .maximum .has_value () )
700718 {
@@ -1772,7 +1790,20 @@ void QgsWfs3CollectionsItemsHandler::writeJsonOutput( const QgsVectorLayer *mapL
17721790
17731791 json data = exporter.exportFeaturesToJsonObject ( featureList );
17741792
1775- // Patch feature IDs with server feature IDs
1793+ QMap<int , QString> extraGeomFields;
1794+ const QList<int > requestedAttrs = featureRequest.subsetOfAttributes ();
1795+ for ( const int idx : std::as_const ( requestedAttrs ) )
1796+ {
1797+ if ( mapLayer->fields ().field ( idx ).type () == QMetaType::Type::User && mapLayer->fields ().field ( idx ).typeName ().compare ( " geometry" _L1 ) == 0 )
1798+ {
1799+ extraGeomFields.insert ( idx, mapLayer->fields ().field ( idx ).displayName () );
1800+ }
1801+ }
1802+
1803+ // Patch feature
1804+ // - IDs with server feature IDs
1805+ // - add references
1806+ // - format extra geometries
17761807 for ( int i = 0 ; i < featureList.length (); i++ )
17771808 {
17781809 data[" features" ][i][" id" ] = fidMap.value ( data[" features" ][i][" id" ] ).toStdString ();
@@ -1786,6 +1817,11 @@ void QgsWfs3CollectionsItemsHandler::writeJsonOutput( const QgsVectorLayer *mapL
17861817 data[" features" ][i][" properties" ][fieldIdentifier.toStdString ()] = relatedFeatureReference ( rawValue, referencedInfo, relAs, apiContext );
17871818 }
17881819 }
1820+ for ( const auto &[fieldIdx, fieldIdentifier] : extraGeomFields.toStdMap () )
1821+ {
1822+ const QgsReferencedGeometry &refGeom = featureList[i].attribute ( fieldIdx ).value <QgsReferencedGeometry>();
1823+ data[" features" ][i][" properties" ][fieldIdentifier.toStdString ()] = refGeom.asWkt ().toStdString ();
1824+ }
17891825 }
17901826
17911827 // Add some metadata
0 commit comments