-
-
Notifications
You must be signed in to change notification settings - Fork 3k
/
qgsmemoryproviderutils.cpp
81 lines (67 loc) · 2.74 KB
/
qgsmemoryproviderutils.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/***************************************************************************
qgsmemoryproviderutils.cpp
--------------------------
begin : May 2017
copyright : (C) 2017 by Nyall Dawson
email : nyall dot dawson at gmail dot com
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "qgsmemoryproviderutils.h"
#include "qgsfields.h"
#include "qgsvectorlayer.h"
QString memoryLayerFieldType( QVariant::Type type )
{
switch ( type )
{
case QVariant::Int:
return QStringLiteral( "integer" );
case QVariant::LongLong:
return QStringLiteral( "long" );
case QVariant::Double:
return QStringLiteral( "double" );
case QVariant::String:
return QStringLiteral( "string" );
case QVariant::Date:
return QStringLiteral( "date" );
case QVariant::Time:
return QStringLiteral( "time" );
case QVariant::DateTime:
return QStringLiteral( "datetime" );
default:
break;
}
return QStringLiteral( "string" );
}
QgsVectorLayer *QgsMemoryProviderUtils::createMemoryLayer( const QString &name, const QgsFields &fields, QgsWkbTypes::Type geometryType, const QgsCoordinateReferenceSystem &crs )
{
QString geomType = QgsWkbTypes::displayString( geometryType );
if ( geomType.isNull() )
geomType = QStringLiteral( "none" );
QStringList parts;
if ( crs.isValid() )
{
parts << QStringLiteral( "crs=" ) + crs.authid();
}
for ( const auto &field : fields )
{
QString lengthPrecision;
if ( field.length() > 0 && field.precision() > 0 )
{
lengthPrecision = QStringLiteral( "(%1,%2)" ).arg( field.length() ).arg( field.precision() );
}
else if ( field.length() > 0 )
{
lengthPrecision = QStringLiteral( "(%1)" ).arg( field.length() );
}
parts << QStringLiteral( "field=%1:%2%3" ).arg( QString( QUrl::toPercentEncoding( field.name() ) ), memoryLayerFieldType( field.type() ), lengthPrecision );
}
QString uri = geomType + '?' + parts.join( '&' );
return new QgsVectorLayer( uri, name, QStringLiteral( "memory" ) );
}