Skip to content

Commit

Permalink
Merge pull request #31087 from m-kuhn/backport_curve_db_manager_3_8
Browse files Browse the repository at this point in the history
[db_manager] [backport 3.8] Support loading mixed curved and straight type tables
  • Loading branch information
m-kuhn committed Aug 5, 2019
2 parents 038b9d6 + 5c57412 commit 1a89280
Show file tree
Hide file tree
Showing 5 changed files with 224 additions and 33 deletions.
12 changes: 12 additions & 0 deletions python/core/auto_generated/geometry/qgswkbtypes.sip.in
Expand Up @@ -120,6 +120,18 @@ Returns the multi type for a WKB type. For example, for Polygon WKB types the mu

.. seealso:: :py:func:`singleType`

.. seealso:: :py:func:`flatType`
%End


static Type curveType( Type type );
%Docstring
Returns the curve type for a WKB type. For example, for Polygon WKB types the curve type would be CurvePolygon.

.. seealso:: :py:func:`isMultiType`

.. seealso:: :py:func:`singleType`

.. seealso:: :py:func:`flatType`
%End

Expand Down
34 changes: 2 additions & 32 deletions python/plugins/db_manager/db_plugins/plugin.py
Expand Up @@ -523,28 +523,8 @@ def rasterTablesFactory(self, row, db, schema=None):
def tables(self, schema=None, sys_tables=False):
tables = self.connector.getTables(schema.name if schema else None, sys_tables)
if tables is not None:
ret = []
for t in tables:
table = self.tablesFactory(t, self, schema)
ret.append(table)

# Similarly to what to browser does, if the geom type is generic geometry,
# we additionnly add three copies of the layer to allow importing
if isinstance(table, VectorTable):
if table.geomType == 'GEOMETRY':
point_table = self.tablesFactory(t, self, schema)
point_table.geomType = 'POINT'
ret.append(point_table)

line_table = self.tablesFactory(t, self, schema)
line_table.geomType = 'LINESTRING'
ret.append(line_table)

poly_table = self.tablesFactory(t, self, schema)
poly_table.geomType = 'POLYGON'
ret.append(poly_table)

return ret
tables = [self.tablesFactory(x, self, schema) for x in tables]
return tables

def createTable(self, table, fields, schema=None):
field_defs = [x.definition() for x in fields]
Expand Down Expand Up @@ -983,16 +963,6 @@ def info(self):

return VectorTableInfo(self)

def uri(self):
uri = super().uri()
uri.setSrid(str(self.srid))
for f in self.fields():
if f.primaryKey:
uri.setKeyColumn(f.name)
break
uri.setWkbType(QgsWkbTypes.parseType(self.geomType))
return uri

def hasSpatialIndex(self, geom_column=None):
geom_column = geom_column if geom_column is not None else self.geomColumn
fld = None
Expand Down
136 changes: 136 additions & 0 deletions src/core/geometry/qgswkbtypes.h
Expand Up @@ -421,6 +421,142 @@ class CORE_EXPORT QgsWkbTypes
return Unknown;
}


/**
* Returns the curve type for a WKB type. For example, for Polygon WKB types the curve type would be CurvePolygon.
* \see isMultiType()
* \see singleType()
* \see flatType()
*/
static Type curveType( Type type )
{
switch ( type )
{
case Unknown:
case Triangle:
case TriangleZ:
case TriangleM:
case TriangleZM:
return Unknown;

case GeometryCollection:
return GeometryCollection;

case GeometryCollectionZ:
return GeometryCollectionZ;

case GeometryCollectionM:
return GeometryCollectionM;

case GeometryCollectionZM:
return GeometryCollectionZM;

case Point:
return Point;

case MultiPoint:
return MultiPoint;

case PointZ:
return PointZ;

case MultiPointZ:
return MultiPointZ;

case PointM:
return PointM;

case MultiPointM:
return MultiPointM;

case PointZM:
return PointZM;

case MultiPointZM:
return MultiPointZM;

case LineString:
case CompoundCurve:
case CircularString:
return CompoundCurve;

case MultiLineString:
case MultiCurve:
return MultiCurve;

case LineStringZ:
case CompoundCurveZ:
case CircularStringZ:
case LineString25D:
return CompoundCurveZ;

case MultiLineStringZ:
case MultiCurveZ:
case MultiLineString25D:
return MultiCurveZ;

case LineStringM:
case CompoundCurveM:
case CircularStringM:
return CompoundCurveM;

case MultiLineStringM:
case MultiCurveM:
return MultiCurveM;

case LineStringZM:
case CompoundCurveZM:
case CircularStringZM:
return CompoundCurveZM;

case MultiLineStringZM:
case MultiCurveZM:
return MultiCurveZM;

case Polygon:
case CurvePolygon:
return CurvePolygon;

case MultiPolygon:
case MultiSurface:
return MultiSurface;

case PolygonZ:
case CurvePolygonZ:
case Polygon25D:
return CurvePolygonZ;

case MultiPolygonZ:
case MultiSurfaceZ:
case MultiPolygon25D:
return MultiSurfaceZ;

case PolygonM:
case CurvePolygonM:
return CurvePolygonM;

case MultiPolygonM:
case MultiSurfaceM:
return MultiSurfaceM;

case PolygonZM:
case CurvePolygonZM:
return CurvePolygonZM;

case MultiPolygonZM:
case MultiSurfaceZM:
return MultiSurfaceZM;

case NoGeometry:
return NoGeometry;

case Point25D:
case MultiPoint25D:
return MultiPoint25D;
}
return Unknown;
}

/**
* Returns the flat type for a WKB type. This is the WKB type minus any Z or M dimensions.
* For example, for PolygonZM WKB types the single type would be Polygon.
Expand Down
17 changes: 16 additions & 1 deletion src/providers/postgres/qgspostgresconn.cpp
Expand Up @@ -1570,6 +1570,8 @@ void QgsPostgresConn::retrieveLayerTypes( QgsPostgresLayerProperty &layerPropert
// so that st_multi can be applied if necessary.
QgsWkbTypes::Type wkbType0 = QgsWkbTypes::flatType( QgsPostgresConn::wkbTypeFromPostgis( type ) );
QgsWkbTypes::Type multiType0 = QgsWkbTypes::multiType( wkbType0 );
QgsWkbTypes::Type curveType0 = QgsWkbTypes::curveType( wkbType0 );
QgsWkbTypes::Type multicurveType0 = QgsWkbTypes::curveType( multiType0 );

int j;
for ( j = 0; j < layerProperty.size(); j++ )
Expand All @@ -1579,11 +1581,24 @@ void QgsPostgresConn::retrieveLayerTypes( QgsPostgresLayerProperty &layerPropert

QgsWkbTypes::Type wkbType1 = layerProperty.types.at( j );
QgsWkbTypes::Type multiType1 = QgsWkbTypes::multiType( wkbType1 );
if ( multiType0 == multiType1 && wkbType0 != wkbType1 )
QgsWkbTypes::Type curveType1 = QgsWkbTypes::curveType( wkbType1 );
QgsWkbTypes::Type multicurveType1 = QgsWkbTypes::curveType( multiType1 );

if ( multicurveType0 == multicurveType1 && wkbType0 != wkbType1 )
{
layerProperty.types[j] = multicurveType0;
break;
}
else if ( multiType0 == multiType1 && wkbType0 != wkbType1 )
{
layerProperty.types[j] = multiType0;
break;
}
else if ( curveType0 == curveType1 && wkbType0 != wkbType1 )
{
layerProperty.types[j] = curveType0;
break;
}
}

if ( j < layerProperty.size() )
Expand Down
58 changes: 58 additions & 0 deletions tests/src/python/test_qgsgeometry.py
Expand Up @@ -2734,6 +2734,64 @@ def testWkbTypes(self):
self.assertEqual(QgsWkbTypes.multiType(QgsWkbTypes.MultiLineString25D), QgsWkbTypes.MultiLineString25D)
self.assertEqual(QgsWkbTypes.multiType(QgsWkbTypes.MultiPolygon25D), QgsWkbTypes.MultiPolygon25D)

# test curveType method
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.Unknown), QgsWkbTypes.Unknown)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.Point), QgsWkbTypes.Point)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.PointZ), QgsWkbTypes.PointZ)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.PointM), QgsWkbTypes.PointM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.PointZM), QgsWkbTypes.PointZM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiPoint), QgsWkbTypes.MultiPoint)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiPointZ), QgsWkbTypes.MultiPointZ)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiPointM), QgsWkbTypes.MultiPointM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiPointZM), QgsWkbTypes.MultiPointZM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.LineString), QgsWkbTypes.CompoundCurve)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.LineStringZ), QgsWkbTypes.CompoundCurveZ)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.LineStringM), QgsWkbTypes.CompoundCurveM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.LineStringZM), QgsWkbTypes.CompoundCurveZM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiLineString), QgsWkbTypes.MultiCurve)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiLineStringZ), QgsWkbTypes.MultiCurveZ)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiLineStringM), QgsWkbTypes.MultiCurveM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiLineStringZM), QgsWkbTypes.MultiCurveZM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.Polygon), QgsWkbTypes.CurvePolygon)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.PolygonZ), QgsWkbTypes.CurvePolygonZ)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.PolygonM), QgsWkbTypes.CurvePolygonM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.PolygonZM), QgsWkbTypes.CurvePolygonZM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiPolygon), QgsWkbTypes.MultiSurface)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiPolygonZ), QgsWkbTypes.MultiSurfaceZ)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiPolygonM), QgsWkbTypes.MultiSurfaceM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiPolygonZM), QgsWkbTypes.MultiSurfaceZM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.GeometryCollection), QgsWkbTypes.GeometryCollection)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.GeometryCollectionZ), QgsWkbTypes.GeometryCollectionZ)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.GeometryCollectionM), QgsWkbTypes.GeometryCollectionM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.GeometryCollectionZM), QgsWkbTypes.GeometryCollectionZM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.CircularString), QgsWkbTypes.CompoundCurve)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.CircularStringZ), QgsWkbTypes.CompoundCurveZ)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.CircularStringM), QgsWkbTypes.CompoundCurveM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.CircularStringZM), QgsWkbTypes.CompoundCurveZM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.CompoundCurve), QgsWkbTypes.CompoundCurve)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.CompoundCurveZ), QgsWkbTypes.CompoundCurveZ)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.CompoundCurveM), QgsWkbTypes.CompoundCurveM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.CompoundCurveZM), QgsWkbTypes.CompoundCurveZM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.CurvePolygon), QgsWkbTypes.CurvePolygon)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.CurvePolygonZ), QgsWkbTypes.CurvePolygonZ)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.CurvePolygonM), QgsWkbTypes.CurvePolygonM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.CurvePolygonZM), QgsWkbTypes.CurvePolygonZM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiCurve), QgsWkbTypes.MultiCurve)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiCurveZ), QgsWkbTypes.MultiCurveZ)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiCurveM), QgsWkbTypes.MultiCurveM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiCurveZM), QgsWkbTypes.MultiCurveZM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiSurface), QgsWkbTypes.MultiSurface)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiSurfaceZ), QgsWkbTypes.MultiSurfaceZ)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiSurfaceM), QgsWkbTypes.MultiSurfaceM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiSurfaceZM), QgsWkbTypes.MultiSurfaceZM)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.NoGeometry), QgsWkbTypes.NoGeometry)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.Point25D), QgsWkbTypes.MultiPoint25D)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.LineString25D), QgsWkbTypes.CompoundCurveZ)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.Polygon25D), QgsWkbTypes.CurvePolygonZ)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiPoint25D), QgsWkbTypes.MultiPoint25D)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiLineString25D), QgsWkbTypes.MultiCurveZ)
self.assertEqual(QgsWkbTypes.curveType(QgsWkbTypes.MultiPolygon25D), QgsWkbTypes.MultiSurfaceZ)

# test flatType method
self.assertEqual(QgsWkbTypes.flatType(QgsWkbTypes.Unknown), QgsWkbTypes.Unknown)
self.assertEqual(QgsWkbTypes.flatType(QgsWkbTypes.Point), QgsWkbTypes.Point)
Expand Down

0 comments on commit 1a89280

Please sign in to comment.