QGIS API Documentation  3.37.0-Master (a5b4d9743e8)
qgsogcutils.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsogcutils.h
3  ---------------------
4  begin : March 2013
5  copyright : (C) 2013 by Martin Dobias
6  email : wonder dot sk at gmail dot com
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 #ifndef QGSOGCUTILS_H
16 #define QGSOGCUTILS_H
17 
18 class QColor;
19 class QDomNode;
20 class QDomElement;
21 class QDomDocument;
22 class QString;
23 
24 #include "qgis_core.h"
25 #include "qgis_sip.h"
26 #include <list>
27 #include <QVector>
28 
29 class QgsExpression;
30 class QgsGeometry;
31 class QgsPointXY;
32 class QgsRectangle;
33 class QgsVectorLayer;
34 class QgsMapLayer;
35 
36 
37 #include "qgsgeometry.h"
38 #include "qgsexpression.h"
39 #include "qgsexpressionnode.h"
40 #include "qgsexpressionnodeimpl.h"
41 #include "qgssqlstatement.h"
43 
53 class CORE_EXPORT QgsOgcUtils
54 {
55  public:
56 
61  struct Context
62  {
63 
67  Context( const QgsMapLayer *layer = nullptr, const QgsCoordinateTransformContext &transformContext = QgsCoordinateTransformContext() )
68  : layer( layer )
69  , transformContext( transformContext )
70  {
71  }
72  const QgsMapLayer *layer = nullptr;
74  };
75 
80  {
84  };
85 
93  static QgsGeometry geometryFromGML( const QString &xmlString, const QgsOgcUtils::Context &context = QgsOgcUtils::Context() );
94 
98  static QgsGeometry geometryFromGML( const QDomNode &geometryNode, const QgsOgcUtils::Context &context = QgsOgcUtils::Context() );
99 
101  static QgsRectangle rectangleFromGMLBox( const QDomNode &boxNode );
102 
104  static QgsRectangle rectangleFromGMLEnvelope( const QDomNode &envelopeNode );
105 
110  static QDomElement geometryToGML( const QgsGeometry &geometry, QDomDocument &doc,
111  QgsOgcUtils::GMLVersion gmlVersion,
112  const QString &srsName,
113  bool invertAxisOrientation,
114  const QString &gmlIdBase,
115  int precision = 17 );
116 
121  static QDomElement geometryToGML( const QgsGeometry &geometry, QDomDocument &doc, const QString &format, int precision = 17 );
122 
127  static QDomElement geometryToGML( const QgsGeometry &geometry, QDomDocument &doc, int precision = 17 );
128 
133  static QDomElement rectangleToGMLBox( QgsRectangle *box, QDomDocument &doc, int precision = 17 );
134 
139  static QDomElement rectangleToGMLBox( QgsRectangle *box, QDomDocument &doc,
140  const QString &srsName,
141  bool invertAxisOrientation,
142  int precision = 17 );
143 
148  static QDomElement rectangleToGMLEnvelope( QgsRectangle *env, QDomDocument &doc, int precision = 17 );
149 
154  static QDomElement rectangleToGMLEnvelope( QgsRectangle *env, QDomDocument &doc,
155  const QString &srsName,
156  bool invertAxisOrientation,
157  int precision = 17 );
158 
159 
161  static QColor colorFromOgcFill( const QDomElement &fillElement );
162 
164  static QgsExpression *expressionFromOgcFilter( const QDomElement &element, QgsVectorLayer *layer = nullptr ) SIP_FACTORY;
165 
172  static QDomElement expressionToOgcFilter( const QgsExpression &exp, QDomDocument &doc, QString *errorMessage = nullptr );
173 
178  {
181  FILTER_FES_2_0
182  };
183 
191  static QgsExpression *expressionFromOgcFilter( const QDomElement &element, FilterVersion version, QgsVectorLayer *layer = nullptr ) SIP_FACTORY;
192 
200  static QDomElement expressionToOgcFilter( const QgsExpression &exp,
201  QDomDocument &doc,
202  QgsOgcUtils::GMLVersion gmlVersion,
203  FilterVersion filterVersion,
204  const QString &namespacePrefix,
205  const QString &namespaceURI,
206  const QString &geometryName,
207  const QString &srsName,
208  bool honourAxisOrientation,
209  bool invertAxisOrientation,
210  QString *errorMessage = nullptr,
211  const QMap<QString, QString> &fieldNameToXPathMap = QMap<QString, QString>(),
212  const QMap<QString, QString> &namespacePrefixToUriMap = QMap<QString, QString>() ) SIP_SKIP;
213 
220  static QDomElement expressionToOgcExpression( const QgsExpression &exp, QDomDocument &doc, QString *errorMessage = nullptr,
221  bool requiresFilterElement = false );
222 
228  static QDomElement elseFilterExpression( QDomDocument &doc );
229 
235  static QDomElement expressionToOgcExpression( const QgsExpression &exp,
236  QDomDocument &doc,
237  QgsOgcUtils::GMLVersion gmlVersion,
238  FilterVersion filterVersion,
239  const QString &geometryName,
240  const QString &srsName,
241  bool honourAxisOrientation,
242  bool invertAxisOrientation,
243  QString *errorMessage = nullptr,
244  bool requiresFilterElement = false,
245  const QMap<QString, QString> &fieldNameToXPathMap = QMap<QString, QString>(),
246  const QMap<QString, QString> &namespacePrefixToUriMap = QMap<QString, QString>() );
247 
248 #ifndef SIP_RUN
249 
256  {
257  public:
259  LayerProperties() = default;
260 
262  QString mName;
266  QString mSRSName;
270  QString mNamespaceURI;
271  };
272 #endif
273 
291  static QDomElement SQLStatementToOgcFilter( const QgsSQLStatement &statement,
292  QDomDocument &doc,
293  QgsOgcUtils::GMLVersion gmlVersion,
294  FilterVersion filterVersion,
295  const QList<LayerProperties> &layerProperties,
296  bool honourAxisOrientation,
297  bool invertAxisOrientation,
298  const QMap< QString, QString> &mapUnprefixedTypenameToPrefixedTypename,
299  QString *errorMessage = nullptr,
300  const QMap<QString, QString> &fieldNameToXPathMap = QMap<QString, QString>(),
301  const QMap<QString, QString> &namespacePrefixToUriMap = QMap<QString, QString>() ) SIP_SKIP;
302 
303  private:
304 
306  static QgsGeometry geometryFromGMLPoint( const QDomElement &geometryElement );
308  static QgsGeometry geometryFromGMLLineString( const QDomElement &geometryElement );
310  static QgsGeometry geometryFromGMLPolygon( const QDomElement &geometryElement );
312  static QgsGeometry geometryFromGMLMultiPoint( const QDomElement &geometryElement );
314  static QgsGeometry geometryFromGMLMultiLineString( const QDomElement &geometryElement );
316  static QgsGeometry geometryFromGMLMultiPolygon( const QDomElement &geometryElement );
317 
322  static QDomElement filterElement(
323  QDomDocument &doc,
324  QgsOgcUtils::GMLVersion gmlVersion,
325  FilterVersion filterVersion,
326  bool GMLUsed );
327 
334  static bool readGMLCoordinates( QgsPolylineXY &coords, const QDomElement &elem );
335 
344  static bool readGMLPositions( QgsPolylineXY &coords, const QDomElement &elem );
345 
346 
353  static QDomElement createGMLCoordinates( const QgsPolylineXY &points, QDomDocument &doc );
354 
361  static QDomElement createGMLPositions( const QgsPolylineXY &points, QDomDocument &doc );
362 
364  static QgsExpressionNode *nodeFromOgcFilter( QDomElement &element, QString &errorMessage, QgsVectorLayer *layer = nullptr );
366  static QgsExpressionNodeBinaryOperator *nodeBinaryOperatorFromOgcFilter( QDomElement &element, QString &errorMessage, QgsVectorLayer *layer = nullptr );
368  static QgsExpressionNodeFunction *nodeSpatialOperatorFromOgcFilter( QDomElement &element, QString &errorMessage );
370  static QgsExpressionNodeUnaryOperator *nodeNotFromOgcFilter( QDomElement &element, QString &errorMessage );
372  static QgsExpressionNodeFunction *nodeFunctionFromOgcFilter( QDomElement &element, QString &errorMessage );
374  static QgsExpressionNode *nodeLiteralFromOgcFilter( QDomElement &element, QString &errorMessage, QgsVectorLayer *layer = nullptr );
376  static QgsExpressionNodeColumnRef *nodeColumnRefFromOgcFilter( QDomElement &element, QString &errorMessage );
378  static QgsExpressionNode *nodeIsBetweenFromOgcFilter( QDomElement &element, QString &errorMessage );
380  static QgsExpressionNodeBinaryOperator *nodePropertyIsNullFromOgcFilter( QDomElement &element, QString &errorMessage );
381 };
382 
383 #ifndef SIP_RUN
384 
391 {
392  public:
394  QgsOgcUtilsExprToFilter( QDomDocument &doc,
395  QgsOgcUtils::GMLVersion gmlVersion,
396  QgsOgcUtils::FilterVersion filterVersion,
397  const QString &namespacePrefix,
398  const QString &namespaceURI,
399  const QString &geometryName,
400  const QString &srsName,
401  bool honourAxisOrientation,
402  bool invertAxisOrientation,
403  const QMap<QString, QString> &fieldNameToXPathMap,
404  const QMap<QString, QString> &namespacePrefixToUriMap
405  );
406 
408  QDomElement expressionNodeToOgcFilter( const QgsExpressionNode *node, QgsExpression *expression, const QgsExpressionContext *context );
409 
411  bool GMLNamespaceUsed() const { return mGMLUsed; }
412 
414  QString errorMessage() const { return mErrorMessage; }
415 
416  private:
417  QDomDocument &mDoc;
418  bool mGMLUsed;
419  QgsOgcUtils::GMLVersion mGMLVersion;
420  QgsOgcUtils::FilterVersion mFilterVersion;
421  const QString &mNamespacePrefix;
422  const QString &mNamespaceURI;
423  const QString &mGeometryName;
424  const QString &mSrsName;
425  bool mInvertAxisOrientation;
426  const QMap<QString, QString> &mFieldNameToXPathMap;
427  const QMap<QString, QString> &mNamespacePrefixToUriMap;
428  QString mErrorMessage;
429  QString mFilterPrefix;
430  QString mPropertyName;
431  int mGeomId;
432 
433  QDomElement expressionUnaryOperatorToOgcFilter( const QgsExpressionNodeUnaryOperator *node, QgsExpression *expression, const QgsExpressionContext *context );
434  QDomElement expressionBinaryOperatorToOgcFilter( const QgsExpressionNodeBinaryOperator *node, QgsExpression *expression, const QgsExpressionContext *context );
435  QDomElement expressionLiteralToOgcFilter( const QgsExpressionNodeLiteral *node, QgsExpression *expression, const QgsExpressionContext *context );
436  QDomElement expressionColumnRefToOgcFilter( const QgsExpressionNodeColumnRef *node, QgsExpression *expression, const QgsExpressionContext *context );
437  QDomElement expressionInOperatorToOgcFilter( const QgsExpressionNodeInOperator *node, QgsExpression *expression, const QgsExpressionContext *context );
438  QDomElement expressionFunctionToOgcFilter( const QgsExpressionNodeFunction *node, QgsExpression *expression, const QgsExpressionContext *context );
439 };
440 
448 {
449  public:
450 
457  const QgsVectorLayer *layer = nullptr );
458 
464  QgsExpressionNode *nodeFromOgcFilter( const QDomElement &element );
465 
470  QString errorMessage() const;
471 
477  QgsExpressionNodeBinaryOperator *nodeBinaryOperatorFromOgcFilter( const QDomElement &element );
478 
483  QgsExpressionNodeFunction *nodeSpatialOperatorFromOgcFilter( const QDomElement &element );
484 
489  QgsExpressionNodeColumnRef *nodeColumnRefFromOgcFilter( const QDomElement &element );
490 
495  QgsExpressionNode *nodeLiteralFromOgcFilter( const QDomElement &element );
496 
501  QgsExpressionNodeUnaryOperator *nodeNotFromOgcFilter( const QDomElement &element );
502 
507  QgsExpressionNodeBinaryOperator *nodePropertyIsNullFromOgcFilter( const QDomElement &element );
508 
513  QgsExpressionNodeFunction *nodeFunctionFromOgcFilter( const QDomElement &element );
514 
519  QgsExpressionNode *nodeIsBetweenFromOgcFilter( const QDomElement &element );
520 
521  private:
522  const QgsVectorLayer *mLayer = nullptr;
523  QString mErrorMessage;
524  QString mPropertyName;
525  QString mPrefix;
526 };
527 
534 {
535  public:
537  QgsOgcUtilsSQLStatementToFilter( QDomDocument &doc,
538  QgsOgcUtils::GMLVersion gmlVersion,
539  QgsOgcUtils::FilterVersion filterVersion,
540  const QList<QgsOgcUtils::LayerProperties> &layerProperties,
541  bool honourAxisOrientation,
542  bool invertAxisOrientation,
543  const QMap< QString, QString> &mapUnprefixedTypenameToPrefixedTypename,
544  const QMap<QString, QString> &fieldNameToXPathMap,
545  const QMap<QString, QString> &namespacePrefixToUriMap );
546 
548  QDomElement toOgcFilter( const QgsSQLStatement::Node *node );
549 
551  bool GMLNamespaceUsed() const { return mGMLUsed; }
552 
554  QString errorMessage() const { return mErrorMessage; }
555 
556  private:
557  QDomDocument &mDoc;
558  bool mGMLUsed;
559  QgsOgcUtils::GMLVersion mGMLVersion;
560  QgsOgcUtils::FilterVersion mFilterVersion;
561  const QList<QgsOgcUtils::LayerProperties> &mLayerProperties;
562  bool mHonourAxisOrientation;
563  bool mInvertAxisOrientation;
564  QString mErrorMessage;
565  QString mFilterPrefix;
566  QString mPropertyName;
567  int mGeomId;
568  QString mCurrentSRSName;
569  QMap<QString, QString> mMapTableAliasToNames;
570  const QMap< QString, QString> &mMapUnprefixedTypenameToPrefixedTypename;
571  const QMap<QString, QString> &mFieldNameToXPathMap;
572  const QMap<QString, QString> &mNamespacePrefixToUriMap;
573 
574  QDomElement toOgcFilter( const QgsSQLStatement::NodeUnaryOperator *node );
575  QDomElement toOgcFilter( const QgsSQLStatement::NodeBinaryOperator *node );
576  QDomElement toOgcFilter( const QgsSQLStatement::NodeLiteral *node );
577  QDomElement toOgcFilter( const QgsSQLStatement::NodeColumnRef *node );
578  QDomElement toOgcFilter( const QgsSQLStatement::NodeInOperator *node );
579  QDomElement toOgcFilter( const QgsSQLStatement::NodeBetweenOperator *node );
580  QDomElement toOgcFilter( const QgsSQLStatement::NodeFunction *node );
581  QDomElement toOgcFilter( const QgsSQLStatement::NodeJoin *node, const QString &leftTable );
582  QDomElement toOgcFilter( const QgsSQLStatement::NodeSelect *node );
583 
584  void visit( const QgsSQLStatement::NodeTableDef *node );
585  QString getGeometryColumnSRSName( const QgsSQLStatement::Node *node );
586  bool processSRSName( const QgsSQLStatement::NodeFunction *mainNode,
587  QList<QgsSQLStatement::Node *> args,
588  bool lastArgIsSRSName,
589  QString &srsName,
590  bool &axisInversion );
591 };
592 
599 class CORE_EXPORT QgsOgcCrsUtils
600 {
601  public:
602 
604  enum class CRSFlavor
605  {
606  UNKNOWN,
607  AUTH_CODE,
608  HTTP_EPSG_DOT_XML,
609  OGC_URN,
610  X_OGC_URN,
611  OGC_HTTP_URI,
612  };
613 
623  static CRSFlavor parseCrsName( const QString &crsName, QString &authority, QString &code );
624 };
625 
627 
628 #endif // #ifndef SIP_RUN
629 
630 #endif // QGSOGCUTILS_H
Contains information about the context in which a coordinate transform is executed.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
A binary expression operator, which operates on two values.
An expression node which takes it value from a feature's field.
An expression node for expression functions.
An expression node for value IN or NOT IN clauses.
An expression node for literal values.
A unary node is either negative as in boolean (not) or as in numbers (minus).
Abstract base class for all nodes that can appear in an expression.
Class for parsing and evaluation of expressions (formerly called "search strings").
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:162
Base class for all map layer types.
Definition: qgsmaplayer.h:75
Utilities related to OGC CRS encodings.
Definition: qgsogcutils.h:600
CRSFlavor
CRS flavor.
Definition: qgsogcutils.h:605
Internal use by QgsOgcUtils.
Definition: qgsogcutils.h:391
bool GMLNamespaceUsed() const
Returns whether the gml: namespace is used.
Definition: qgsogcutils.h:411
QString errorMessage() const
Returns the error message.
Definition: qgsogcutils.h:414
Internal use by QgsOgcUtils.
Definition: qgsogcutils.h:448
Internal use by QgsOgcUtils.
Definition: qgsogcutils.h:534
bool GMLNamespaceUsed() const
Returns whether the gml: namespace is used.
Definition: qgsogcutils.h:551
QString errorMessage() const
Returns the error message.
Definition: qgsogcutils.h:554
QString mSRSName
SRS name.
Definition: qgsogcutils.h:266
LayerProperties()=default
Constructor.
QString mNamespaceURI
Namespace URI.
Definition: qgsogcutils.h:270
QString mNamespacePrefix
Namespace prefix.
Definition: qgsogcutils.h:268
QString mGeometryAttribute
Geometry attribute name.
Definition: qgsogcutils.h:264
QString mName
Layer name.
Definition: qgsogcutils.h:262
The QgsOgcUtils class provides various utility functions for conversion between OGC (Open Geospatial ...
Definition: qgsogcutils.h:54
GMLVersion
GML version.
Definition: qgsogcutils.h:80
FilterVersion
OGC filter version.
Definition: qgsogcutils.h:178
A class to represent a 2D point.
Definition: qgspointxy.h:60
A rectangle specified with double values.
Definition: qgsrectangle.h:42
'X BETWEEN y and z' operator
Binary logical/arithmetical operator (AND, OR, =, +, ...)
Reference to a column.
Function with a name and arguments node.
Literal value (integer, integer64, double, string)
Unary logicial/arithmetical operator ( NOT, - )
Abstract node class.
Class for parsing SQL statements.
Represents a vector layer which manages a vector based data sets.
#define SIP_SKIP
Definition: qgis_sip.h:126
#define SIP_FACTORY
Definition: qgis_sip.h:76
Q_DECLARE_METATYPE(QgsDatabaseQueryLogEntry)
QVector< QgsPointXY > QgsPolylineXY
Polyline as represented as a vector of two-dimensional points.
Definition: qgsgeometry.h:52
const QString & srsName
const QString & geometryName
int precision
The Context struct stores the current layer and coordinate transform context.
Definition: qgsogcutils.h:62
Context(const QgsMapLayer *layer=nullptr, const QgsCoordinateTransformContext &transformContext=QgsCoordinateTransformContext())
Constructs a Context from layer and transformContext.
Definition: qgsogcutils.h:67
QgsCoordinateTransformContext transformContext
Definition: qgsogcutils.h:73