QGIS API Documentation 3.99.0-Master (2fe06baccd8)
Loading...
Searching...
No Matches
qgsmemoryproviderutils.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsmemoryproviderutils.cpp
3 --------------------------
4 begin : May 2017
5 copyright : (C) 2017 by Nyall Dawson
6 email : nyall dot dawson at gmail dot com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
19
20#include "qgsfields.h"
21#include "qgsvectorlayer.h"
22
23#include <QUrl>
24
25QString memoryLayerFieldType( QMetaType::Type type, const QString &typeString )
26{
27 switch ( type )
28 {
29 case QMetaType::Type::Int:
30 return QStringLiteral( "integer" );
31
32 case QMetaType::Type::LongLong:
33 return QStringLiteral( "long" );
34
35 case QMetaType::Type::Double:
36 return QStringLiteral( "double" );
37
38 case QMetaType::Type::QString:
39 return QStringLiteral( "string" );
40
41 case QMetaType::Type::QDate:
42 return QStringLiteral( "date" );
43
44 case QMetaType::Type::QTime:
45 return QStringLiteral( "time" );
46
47 case QMetaType::Type::QDateTime:
48 return QStringLiteral( "datetime" );
49
50 case QMetaType::Type::QByteArray:
51 return QStringLiteral( "binary" );
52
53 case QMetaType::Type::Bool:
54 return QStringLiteral( "boolean" );
55
56 case QMetaType::Type::QVariantMap:
57 return QStringLiteral( "map" );
58
59 case QMetaType::Type::User:
60 if ( typeString.compare( QLatin1String( "geometry" ), Qt::CaseInsensitive ) == 0 )
61 {
62 return QStringLiteral( "geometry" );
63 }
64 break;
65
66 default:
67 break;
68 }
69 return QStringLiteral( "string" );
70}
71
72QgsVectorLayer *QgsMemoryProviderUtils::createMemoryLayer( const QString &name, const QgsFields &fields, Qgis::WkbType geometryType, const QgsCoordinateReferenceSystem &crs, bool loadDefaultStyle )
73{
74 QString geomType = QgsWkbTypes::displayString( geometryType );
75 if ( geomType.isNull() )
76 geomType = QStringLiteral( "none" );
77
78 QStringList parts;
79 if ( crs.isValid() )
80 {
81 if ( !crs.authid().isEmpty() )
82 parts << QStringLiteral( "crs=%1" ).arg( crs.authid() );
83 else
84 parts << QStringLiteral( "crs=wkt:%1" ).arg( crs.toWkt( Qgis::CrsWktVariant::Preferred ) );
85 }
86 else
87 {
88 parts << QStringLiteral( "crs=" );
89 }
90 for ( const QgsField &field : fields )
91 {
92 const QString lengthPrecision = QStringLiteral( "(%1,%2)" ).arg( field.length() ).arg( field.precision() );
93 parts << QStringLiteral( "field=%1:%2%3%4" ).arg( QString( QUrl::toPercentEncoding( field.name() ) ),
94 memoryLayerFieldType( field.type() == QMetaType::Type::QVariantList || field.type() == QMetaType::Type::QStringList ? field.subType() : field.type(), field.typeName() ),
95 lengthPrecision,
96 field.type() == QMetaType::Type::QVariantList || field.type() == QMetaType::Type::QStringList ? QStringLiteral( "[]" ) : QString() );
97 }
98
99 const QString uri = geomType + '?' + parts.join( '&' );
101 options.skipCrsValidation = true;
102 options.loadDefaultStyle = loadDefaultStyle;
103 return new QgsVectorLayer( uri, name, QStringLiteral( "memory" ), options );
104}
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition qgis.h:277
@ Preferred
Preferred format, matching the most recent WKT ISO standard. Currently an alias to WKT2_2019,...
Definition qgis.h:2439
Represents a coordinate reference system (CRS).
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
QString toWkt(Qgis::CrsWktVariant variant=Qgis::CrsWktVariant::Wkt1Gdal, bool multiline=false, int indentationWidth=4) const
Returns a WKT representation of this CRS.
Contains information about the context in which a coordinate transform is executed.
Encapsulate a field in an attribute table or data source.
Definition qgsfield.h:54
Container of fields for a vector layer.
Definition qgsfields.h:46
static QgsVectorLayer * createMemoryLayer(const QString &name, const QgsFields &fields, Qgis::WkbType geometryType=Qgis::WkbType::NoGeometry, const QgsCoordinateReferenceSystem &crs=QgsCoordinateReferenceSystem(), bool loadDefaultStyle=true) SIP_FACTORY
Creates a new memory layer using the specified parameters.
Represents a vector layer which manages a vector based dataset.
static Q_INVOKABLE QString displayString(Qgis::WkbType type)
Returns a non-translated display string type for a WKB type, e.g., the geometry name used in WKT geom...
QString memoryLayerFieldType(QMetaType::Type type, const QString &typeString)
Setting options for loading vector layers.
bool skipCrsValidation
Controls whether the layer is allowed to have an invalid/unknown CRS.
bool loadDefaultStyle
Set to true if the default layer style should be loaded.