mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-25 00:58:06 -05:00
Fix rendering of CurvePolygons without curved segments (fix #14028)
This commit is contained in:
parent
1a7dede155
commit
c38ee41f5b
@ -113,6 +113,11 @@ class QgsWKBTypes
|
||||
*/
|
||||
static bool isMultiType( Type type );
|
||||
|
||||
/** Returns true if the WKB type is a curved type or can contain curved geometries.
|
||||
* @note added in QGIS 2.14
|
||||
*/
|
||||
static bool isCurvedType( Type type );
|
||||
|
||||
/** Returns the inherent dimension of the geometry type as an integer. Returned value will
|
||||
* always be less than or equal to the coordinate dimension.
|
||||
* @returns 0 for point geometries, 1 for line geometries, 2 for polygon geometries
|
||||
|
@ -94,6 +94,24 @@ bool QgsWKBTypes::isMultiType( Type type )
|
||||
return it->mIsMultiType;
|
||||
}
|
||||
|
||||
bool QgsWKBTypes::isCurvedType( QgsWKBTypes::Type type )
|
||||
{
|
||||
switch ( flatType( type ) )
|
||||
{
|
||||
case CircularString:
|
||||
case CompoundCurve:
|
||||
case CurvePolygon:
|
||||
case MultiCurve:
|
||||
case MultiSurface:
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* This class is considered CRITICAL and any change MUST be accompanied with
|
||||
* full unit tests.
|
||||
|
@ -144,6 +144,11 @@ class CORE_EXPORT QgsWKBTypes
|
||||
*/
|
||||
static bool isMultiType( Type type );
|
||||
|
||||
/** Returns true if the WKB type is a curved type or can contain curved geometries.
|
||||
* @note added in QGIS 2.14
|
||||
*/
|
||||
static bool isCurvedType( Type type );
|
||||
|
||||
/** Returns the inherent dimension of the geometry type as an integer. Returned value will
|
||||
* always be less than or equal to the coordinate dimension.
|
||||
* @returns 0 for point geometries, 1 for line geometries, 2 for polygon geometries
|
||||
|
@ -702,7 +702,7 @@ void QgsSymbolV2::renderFeature( const QgsFeature& feature, QgsRenderContext& co
|
||||
bool tileMapRendering = context.testFlag( QgsRenderContext::RenderMapTile );
|
||||
|
||||
//convert curve types to normal point/line/polygon ones
|
||||
if ( geom->geometry()->hasCurvedSegments() )
|
||||
if ( QgsWKBTypes::isCurvedType( geom->geometry()->wkbType() ) )
|
||||
{
|
||||
QgsAbstractGeometryV2* g = geom->geometry()->segmentize();
|
||||
if ( !g )
|
||||
|
@ -2324,6 +2324,64 @@ class TestQgsGeometry(TestCase):
|
||||
assert QgsWKBTypes.isMultiType(QgsWKBTypes.MultiLineString25D)
|
||||
assert QgsWKBTypes.isMultiType(QgsWKBTypes.MultiPolygon25D)
|
||||
|
||||
# test isCurvedType methods
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.Unknown)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.Point)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.LineString)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.Polygon)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiPoint)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiLineString)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiPolygon)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.GeometryCollection)
|
||||
assert QgsWKBTypes.isCurvedType(QgsWKBTypes.CircularString)
|
||||
assert QgsWKBTypes.isCurvedType(QgsWKBTypes.CompoundCurve)
|
||||
assert QgsWKBTypes.isCurvedType(QgsWKBTypes.CurvePolygon)
|
||||
assert QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiCurve)
|
||||
assert QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiSurface)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.NoGeometry)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.PointZ)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.LineStringZ)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.PolygonZ)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiPointZ)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiLineStringZ)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiPolygonZ)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.GeometryCollectionZ)
|
||||
assert QgsWKBTypes.isCurvedType(QgsWKBTypes.CircularStringZ)
|
||||
assert QgsWKBTypes.isCurvedType(QgsWKBTypes.CompoundCurveZ)
|
||||
assert QgsWKBTypes.isCurvedType(QgsWKBTypes.CurvePolygonZ)
|
||||
assert QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiCurveZ)
|
||||
assert QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiSurfaceZ)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.PointM)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.LineStringM)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.PolygonM)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiPointM)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiLineStringM)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiPolygonM)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.GeometryCollectionM)
|
||||
assert QgsWKBTypes.isCurvedType(QgsWKBTypes.CircularStringM)
|
||||
assert QgsWKBTypes.isCurvedType(QgsWKBTypes.CompoundCurveM)
|
||||
assert QgsWKBTypes.isCurvedType(QgsWKBTypes.CurvePolygonM)
|
||||
assert QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiCurveM)
|
||||
assert QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiSurfaceM)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.PointZM)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.LineStringZM)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.PolygonZM)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiPointZM)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiLineStringZM)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiPolygonZM)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.GeometryCollectionZM)
|
||||
assert QgsWKBTypes.isCurvedType(QgsWKBTypes.CircularStringZM)
|
||||
assert QgsWKBTypes.isCurvedType(QgsWKBTypes.CompoundCurveZM)
|
||||
assert QgsWKBTypes.isCurvedType(QgsWKBTypes.CurvePolygonZM)
|
||||
assert QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiCurveZM)
|
||||
assert QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiSurfaceZM)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.Point25D)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.LineString25D)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.Polygon25D)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiPoint25D)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiLineString25D)
|
||||
assert not QgsWKBTypes.isCurvedType(QgsWKBTypes.MultiPolygon25D)
|
||||
|
||||
# test hasZ methods
|
||||
assert not QgsWKBTypes.hasZ(QgsWKBTypes.Unknown)
|
||||
assert not QgsWKBTypes.hasZ(QgsWKBTypes.Point)
|
||||
|
@ -95,7 +95,13 @@ class TestQgsSymbolV2(TestCase):
|
||||
'reference_image': 'compound_curve'},
|
||||
{'name': 'CurvePolygon',
|
||||
'wkt': 'CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))',
|
||||
'reference_image': 'curve_polygon'}]
|
||||
'reference_image': 'curve_polygon'},
|
||||
{'name': 'MultiCurve',
|
||||
'wkt': 'MultiCurve((5 5,3 5,3 3,0 3),CIRCULARSTRING(0 0, 2 1,2 2))',
|
||||
'reference_image': 'multicurve'},
|
||||
{'name': 'CurvePolygon_no_arc', # refs #14028
|
||||
'wkt': 'CURVEPOLYGON(LINESTRING(1 3, 3 5, 4 7, 7 3, 1 3))',
|
||||
'reference_image': 'curve_polygon_no_arc'}]
|
||||
|
||||
for test in tests:
|
||||
geom = QgsGeometry.fromWkt(test['wkt'])
|
||||
@ -110,18 +116,18 @@ class TestQgsSymbolV2(TestCase):
|
||||
geom_z = QgsGeometry.fromWkt(test['wkt'])
|
||||
geom_z.geometry().addZValue(5)
|
||||
rendered_image = self.renderGeometry(geom_z)
|
||||
assert self.imageCheck(test['name'] + ' z', test['reference_image'], rendered_image)
|
||||
assert self.imageCheck(test['name'] + 'Z', test['reference_image'], rendered_image)
|
||||
|
||||
#test with ZM
|
||||
geom_z.geometry().addMValue(15)
|
||||
rendered_image = self.renderGeometry(geom_z)
|
||||
assert self.imageCheck(test['name'] + ' zm', test['reference_image'], rendered_image)
|
||||
assert self.imageCheck(test['name'] + 'ZM', test['reference_image'], rendered_image)
|
||||
|
||||
#test with ZM
|
||||
geom_m = QgsGeometry.fromWkt(test['wkt'])
|
||||
geom_m.geometry().addMValue(15)
|
||||
rendered_image = self.renderGeometry(geom_m)
|
||||
assert self.imageCheck(test['name'] + ' m', test['reference_image'], rendered_image)
|
||||
assert self.imageCheck(test['name'] + 'M', test['reference_image'], rendered_image)
|
||||
|
||||
def renderGeometry(self, geom):
|
||||
f = QgsFeature()
|
||||
|
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
BIN
tests/testdata/control_images/symbolv2/expected_multicurve/expected_multicurve.png
vendored
Normal file
BIN
tests/testdata/control_images/symbolv2/expected_multicurve/expected_multicurve.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 898 B |
Loading…
x
Reference in New Issue
Block a user