Skip to content

Commit dcdf91b

Browse files
authored
Merge pull request #3507 from alexbruy/memory-provider-25d
Add support for 2.5D geometries to memory provider
2 parents 5d64a8b + eeb8269 commit dcdf91b

File tree

4 files changed

+37
-60
lines changed

4 files changed

+37
-60
lines changed

python/plugins/processing/tools/vector.py

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,6 @@
5252
from processing.tools import dataobjects, spatialite, postgis
5353

5454

55-
GEOM_TYPE_MAP = {
56-
QgsWkbTypes.NullGeometry: 'none',
57-
QgsWkbTypes.Point: 'Point',
58-
QgsWkbTypes.LineString: 'LineString',
59-
QgsWkbTypes.Polygon: 'Polygon',
60-
QgsWkbTypes.MultiPoint: 'MultiPoint',
61-
QgsWkbTypes.MultiLineString: 'MultiLineString',
62-
QgsWkbTypes.MultiPolygon: 'MultiPolygon',
63-
}
64-
65-
6655
TYPE_MAP = {
6756
str: QVariant.String,
6857
float: QVariant.Double,
@@ -561,7 +550,7 @@ def __init__(self, destination, encoding, fields, geometryType,
561550
if self.destination.startswith(self.MEMORY_LAYER_PREFIX):
562551
self.isNotFileBased = True
563552

564-
uri = GEOM_TYPE_MAP[geometryType] + "?uuid=" + str(uuid.uuid4())
553+
uri = QgsWkbTypes.displayString(geometryType) + "?uuid=" + str(uuid.uuid4())
565554
if crs.isValid():
566555
uri += '&crs=' + crs.authid()
567556
fieldsdesc = []
@@ -608,7 +597,7 @@ def _runSQL(sql):
608597
if geometryType != QgsWkbTypes.NullGeometry:
609598
_runSQL("SELECT AddGeometryColumn('{schema}', '{table}', 'the_geom', {srid}, '{typmod}', 2)".format(
610599
table=uri.table().lower(), schema=uri.schema(), srid=crs.authid().split(":")[-1],
611-
typmod=GEOM_TYPE_MAP[geometryType].upper()))
600+
typmod=QgsWkbTypes.displayString(geometryType).upper()))
612601

613602
self.layer = QgsVectorLayer(uri.uri(), uri.table(), "postgres")
614603
self.writer = self.layer.dataProvider()
@@ -640,7 +629,7 @@ def _runSQL(sql):
640629
if geometryType != QgsWkbTypes.NullGeometry:
641630
_runSQL("SELECT AddGeometryColumn('{table}', 'the_geom', {srid}, '{typmod}', 2)".format(
642631
table=uri.table().lower(), srid=crs.authid().split(":")[-1],
643-
typmod=GEOM_TYPE_MAP[geometryType].upper()))
632+
typmod=QgsWkbTypes.displayString(geometryType).upper()))
644633

645634
self.layer = QgsVectorLayer(uri.uri(), uri.table(), "spatialite")
646635
self.writer = self.layer.dataProvider()

src/app/qgisapp.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7505,7 +7505,7 @@ QgsVectorLayer *QgisApp::pasteToNewMemoryVector()
75057505
if ( !feature.hasGeometry() )
75067506
continue;
75077507

7508-
QgsWkbTypes::Type type = QgsWkbTypes::flatType( feature.geometry().wkbType() );
7508+
QgsWkbTypes::Type type = feature.geometry().wkbType();
75097509

75107510
if ( type == QgsWkbTypes::Unknown || type == QgsWkbTypes::NoGeometry )
75117511
continue;
@@ -7535,7 +7535,7 @@ QgsVectorLayer *QgisApp::pasteToNewMemoryVector()
75357535

75367536
QgsWkbTypes::Type wkbType = !typeCounts.isEmpty() ? typeCounts.keys().value( 0 ) : QgsWkbTypes::NoGeometry;
75377537

7538-
QString typeName = wkbType != QgsWkbTypes::NoGeometry ? QString( QgsWkbTypes::displayString( wkbType ) ).remove( "WKB" ) : "none";
7538+
QString typeName = wkbType != QgsWkbTypes::NoGeometry ? QgsWkbTypes::displayString( wkbType ) : "none";
75397539

75407540
if ( features.isEmpty() )
75417541
{
@@ -7590,7 +7590,7 @@ QgsVectorLayer *QgisApp::pasteToNewMemoryVector()
75907590
if ( !feature.hasGeometry() )
75917591
continue;
75927592

7593-
QgsWkbTypes::Type type = QgsWkbTypes::flatType( feature.geometry().wkbType() );
7593+
QgsWkbTypes::Type type = feature.geometry().wkbType();
75947594
if ( type == QgsWkbTypes::Unknown || type == QgsWkbTypes::NoGeometry )
75957595
continue;
75967596

src/providers/memory/qgsmemoryprovider.cpp

Lines changed: 7 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -47,23 +47,14 @@ QgsMemoryProvider::QgsMemoryProvider( const QString& uri )
4747
geometry = url.path();
4848
}
4949

50-
geometry = geometry.toLower();
51-
if ( geometry == "point" )
52-
mWkbType = QgsWkbTypes::Point;
53-
else if ( geometry == "linestring" )
54-
mWkbType = QgsWkbTypes::LineString;
55-
else if ( geometry == "polygon" )
56-
mWkbType = QgsWkbTypes::Polygon;
57-
else if ( geometry == "multipoint" )
58-
mWkbType = QgsWkbTypes::MultiPoint;
59-
else if ( geometry == "multilinestring" )
60-
mWkbType = QgsWkbTypes::MultiLineString;
61-
else if ( geometry == "multipolygon" )
62-
mWkbType = QgsWkbTypes::MultiPolygon;
63-
else if ( geometry == "none" )
50+
if ( geometry.toLower() == "none" )
51+
{
6452
mWkbType = QgsWkbTypes::NoGeometry;
53+
}
6554
else
66-
mWkbType = QgsWkbTypes::Unknown;
55+
{
56+
mWkbType = QgsWkbTypes::parseType( geometry );
57+
}
6758

6859
if ( url.hasQueryItem( "crs" ) )
6960
{
@@ -208,34 +199,7 @@ QString QgsMemoryProvider::dataSourceUri( bool expandAuthConfig ) const
208199
Q_UNUSED( expandAuthConfig )
209200

210201
QUrl uri( "memory" );
211-
QString geometry;
212-
switch ( mWkbType )
213-
{
214-
case QgsWkbTypes::Point :
215-
geometry = "Point";
216-
break;
217-
case QgsWkbTypes::LineString :
218-
geometry = "LineString";
219-
break;
220-
case QgsWkbTypes::Polygon :
221-
geometry = "Polygon";
222-
break;
223-
case QgsWkbTypes::MultiPoint :
224-
geometry = "MultiPoint";
225-
break;
226-
case QgsWkbTypes::MultiLineString :
227-
geometry = "MultiLineString";
228-
break;
229-
case QgsWkbTypes::MultiPolygon :
230-
geometry = "MultiPolygon";
231-
break;
232-
case QgsWkbTypes::NoGeometry :
233-
geometry = "None";
234-
break;
235-
default:
236-
geometry = "";
237-
break;
238-
}
202+
QString geometry = QgsWkbTypes::displayString( mWkbType );
239203
uri.addQueryItem( "geometry", geometry );
240204

241205
if ( mCrs.isValid() )

tests/src/python/test_provider_memory.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,30 @@ def testLayerGeometry(self):
127127
("MultiPoint", QgsWkbTypes.PointGeometry, QgsWkbTypes.MultiPoint),
128128
("MultiLineString", QgsWkbTypes.LineGeometry, QgsWkbTypes.MultiLineString),
129129
("MultiPolygon", QgsWkbTypes.PolygonGeometry, QgsWkbTypes.MultiPolygon),
130+
("PointZ", QgsWkbTypes.PointGeometry, QgsWkbTypes.PointZ),
131+
("LineStringZ", QgsWkbTypes.LineGeometry, QgsWkbTypes.LineStringZ),
132+
("PolygonZ", QgsWkbTypes.PolygonGeometry, QgsWkbTypes.PolygonZ),
133+
("MultiPointZ", QgsWkbTypes.PointGeometry, QgsWkbTypes.MultiPointZ),
134+
("MultiLineStringZ", QgsWkbTypes.LineGeometry, QgsWkbTypes.MultiLineStringZ),
135+
("MultiPolygonZ", QgsWkbTypes.PolygonGeometry, QgsWkbTypes.MultiPolygonZ),
136+
("PointM", QgsWkbTypes.PointGeometry, QgsWkbTypes.PointM),
137+
("LineStringM", QgsWkbTypes.LineGeometry, QgsWkbTypes.LineStringM),
138+
("PolygonM", QgsWkbTypes.PolygonGeometry, QgsWkbTypes.PolygonM),
139+
("MultiPointM", QgsWkbTypes.PointGeometry, QgsWkbTypes.MultiPointM),
140+
("MultiLineStringM", QgsWkbTypes.LineGeometry, QgsWkbTypes.MultiLineStringM),
141+
("MultiPolygonM", QgsWkbTypes.PolygonGeometry, QgsWkbTypes.MultiPolygonM),
142+
("PointZM", QgsWkbTypes.PointGeometry, QgsWkbTypes.PointZM),
143+
("LineStringZM", QgsWkbTypes.LineGeometry, QgsWkbTypes.LineStringZM),
144+
("PolygonZM", QgsWkbTypes.PolygonGeometry, QgsWkbTypes.PolygonZM),
145+
("MultiPointZM", QgsWkbTypes.PointGeometry, QgsWkbTypes.MultiPointZM),
146+
("MultiLineStringZM", QgsWkbTypes.LineGeometry, QgsWkbTypes.MultiLineStringZM),
147+
("MultiPolygonZM", QgsWkbTypes.PolygonGeometry, QgsWkbTypes.MultiPolygonZM),
148+
("Point25D", QgsWkbTypes.PointGeometry, QgsWkbTypes.Point25D),
149+
("LineString25D", QgsWkbTypes.LineGeometry, QgsWkbTypes.LineString25D),
150+
("Polygon25D", QgsWkbTypes.PolygonGeometry, QgsWkbTypes.Polygon25D),
151+
("MultiPoint25D", QgsWkbTypes.PointGeometry, QgsWkbTypes.MultiPoint25D),
152+
("MultiLineString25D", QgsWkbTypes.LineGeometry, QgsWkbTypes.MultiLineString25D),
153+
("MultiPolygon25D", QgsWkbTypes.PolygonGeometry, QgsWkbTypes.MultiPolygon25D),
130154
("None", QgsWkbTypes.NullGeometry, QgsWkbTypes.NoGeometry)]
131155
for v in testVectors:
132156
layer = QgsVectorLayer(v[0], "test", "memory")

0 commit comments

Comments
 (0)