Skip to content

Commit bc59d6f

Browse files
committedOct 8, 2015
adapt local simplication to new geometry types (fixes #13538)
1 parent a0d7653 commit bc59d6f

File tree

3 files changed

+177
-118
lines changed

3 files changed

+177
-118
lines changed
 

‎src/core/qgis.cpp

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include <QDateTime>
2828
#include "qgsconfig.h"
2929
#include "qgslogger.h"
30+
#include "geometry/qgswkbtypes.h"
3031

3132
#include <ogr_api.h>
3233

@@ -99,6 +100,56 @@ const char* QGis::qgisUnitTypes[] =
99100
QT_TRANSLATE_NOOP( "QGis::UnitType", "nautical miles" )
100101
};
101102

103+
static QgsWKBTypes::Type fromOldWkbType( QGis::WkbType type )
104+
{
105+
switch ( type )
106+
{
107+
case QGis::WKBPoint: return QgsWKBTypes::Point;
108+
case QGis::WKBLineString: return QgsWKBTypes::LineString;
109+
case QGis::WKBPolygon: return QgsWKBTypes::Polygon;
110+
case QGis::WKBMultiPoint: return QgsWKBTypes::MultiPoint;
111+
case QGis::WKBMultiLineString: return QgsWKBTypes::MultiLineString;
112+
case QGis::WKBMultiPolygon: return QgsWKBTypes::MultiPolygon;
113+
case QGis::WKBNoGeometry: return QgsWKBTypes::NoGeometry;
114+
case QGis::WKBPoint25D: return QgsWKBTypes::PointZ;
115+
case QGis::WKBLineString25D: return QgsWKBTypes::LineStringZ;
116+
case QGis::WKBPolygon25D: return QgsWKBTypes::PolygonZ;
117+
case QGis::WKBMultiPoint25D: return QgsWKBTypes::MultiPointZ;
118+
case QGis::WKBMultiLineString25D: return QgsWKBTypes::MultiLineStringZ;
119+
case QGis::WKBMultiPolygon25D: return QgsWKBTypes::MultiPolygonZ;
120+
case QGis::WKBUnknown: return QgsWKBTypes::Unknown;
121+
default: break;
122+
}
123+
124+
QgsDebugMsg( QString( "unexpected old wkbType=%1" ).arg( type ) );
125+
return ( QgsWKBTypes::Type ) type;
126+
}
127+
128+
static QGis::WkbType fromNewWkbType( QgsWKBTypes::Type type )
129+
{
130+
switch ( type )
131+
{
132+
case QgsWKBTypes::Point: return QGis::WKBPoint;
133+
case QgsWKBTypes::LineString: return QGis::WKBLineString;
134+
case QgsWKBTypes::Polygon: return QGis::WKBPolygon;
135+
case QgsWKBTypes::MultiPoint: return QGis::WKBMultiPoint;
136+
case QgsWKBTypes::MultiLineString: return QGis::WKBMultiLineString;
137+
case QgsWKBTypes::MultiPolygon: return QGis::WKBMultiPolygon;
138+
case QgsWKBTypes::NoGeometry: return QGis::WKBNoGeometry;
139+
case QgsWKBTypes::PointZ: return QGis::WKBPoint25D;
140+
case QgsWKBTypes::LineStringZ: return QGis::WKBLineString25D;
141+
case QgsWKBTypes::PolygonZ: return QGis::WKBPolygon25D;
142+
case QgsWKBTypes::MultiPointZ: return QGis::WKBMultiPoint25D;
143+
case QgsWKBTypes::MultiLineStringZ: return QGis::WKBMultiLineString25D;
144+
case QgsWKBTypes::MultiPolygonZ: return QGis::WKBMultiPolygon25D;
145+
default: break;
146+
}
147+
148+
QgsDebugMsg( QString( "unexpected new wkbType=%1" ).arg( type ) );
149+
return ( QGis::WkbType ) type;
150+
}
151+
152+
102153
QGis::UnitType QGis::fromLiteral( const QString& literal, QGis::UnitType defaultType )
103154
{
104155
for ( unsigned int i = 0; i < ( sizeof( qgisUnitTypes ) / sizeof( qgisUnitTypes[0] ) ); i++ )
@@ -282,3 +333,101 @@ QString qgsVsiPrefix( const QString& path )
282333
else
283334
return "";
284335
}
336+
337+
QGis::WkbType QGis::singleType( QGis::WkbType type )
338+
{
339+
switch ( type )
340+
{
341+
case WKBMultiPoint: return WKBPoint;
342+
case WKBMultiLineString: return WKBLineString;
343+
case WKBMultiPolygon: return WKBPolygon;
344+
case WKBMultiPoint25D: return WKBPoint25D;
345+
case WKBMultiLineString25D: return WKBLineString25D;
346+
case WKBMultiPolygon25D: return WKBPolygon25D;
347+
default: return fromNewWkbType( QgsWKBTypes::singleType( fromOldWkbType( type ) ) );
348+
}
349+
}
350+
351+
QGis::WkbType QGis::multiType( QGis::WkbType type )
352+
{
353+
switch ( type )
354+
{
355+
case WKBPoint: return WKBMultiPoint;
356+
case WKBLineString: return WKBMultiLineString;
357+
case WKBPolygon: return WKBMultiPolygon;
358+
case WKBPoint25D: return WKBMultiPoint25D;
359+
case WKBLineString25D: return WKBMultiLineString25D;
360+
case WKBPolygon25D: return WKBMultiPolygon25D;
361+
default: return fromNewWkbType( QgsWKBTypes::multiType( fromOldWkbType( type ) ) );
362+
}
363+
}
364+
365+
QGis::WkbType QGis::flatType( QGis::WkbType type )
366+
{
367+
switch ( type )
368+
{
369+
case WKBPoint25D: return WKBPoint;
370+
case WKBLineString25D: return WKBLineString;
371+
case WKBPolygon25D: return WKBPolygon;
372+
case WKBMultiPoint25D: return WKBMultiPoint;
373+
case WKBMultiLineString25D: return WKBMultiLineString;
374+
case WKBMultiPolygon25D: return WKBMultiPolygon;
375+
default: return fromNewWkbType( QgsWKBTypes::flatType( fromOldWkbType( type ) ) );
376+
}
377+
}
378+
379+
bool QGis::isSingleType( QGis::WkbType type )
380+
{
381+
return QgsWKBTypes::isSingleType( fromOldWkbType( type ) );
382+
}
383+
384+
bool QGis::isMultiType( QGis::WkbType type )
385+
{
386+
return QgsWKBTypes::flatType( fromOldWkbType( type ) );
387+
}
388+
389+
int QGis::wkbDimensions( QGis::WkbType type )
390+
{
391+
if ( type == WKBUnknown || type == WKBNoGeometry )
392+
return 0;
393+
394+
QgsWKBTypes::Type wkbType = fromOldWkbType( type );
395+
return 2 + ( QgsWKBTypes::hasZ( wkbType ) ? 1 : 0 ) + ( QgsWKBTypes::hasM( wkbType ) ? 1 : 0 );
396+
}
397+
398+
const char *QGis::vectorGeometryType( QGis::GeometryType type )
399+
{
400+
switch ( type )
401+
{
402+
case Point: return "Point";
403+
case Line: return "Line";
404+
case Polygon: return "Polygon";
405+
case UnknownGeometry: return "Unknown geometry";
406+
case NoGeometry: return "No geometry";
407+
default: return "Invalid type";
408+
}
409+
}
410+
411+
412+
const char *QGis::featureType( QGis::WkbType type )
413+
{
414+
switch ( type )
415+
{
416+
case WKBUnknown: return "WKBUnknown";
417+
case WKBPoint: return "WKBPoint";
418+
case WKBLineString: return "WKBLineString";
419+
case WKBPolygon: return "WKBPolygon";
420+
case WKBMultiPoint: return "WKBMultiPoint";
421+
case WKBMultiLineString: return "WKBMultiLineString";
422+
case WKBMultiPolygon: return "WKBMultiPolygon";
423+
case WKBNoGeometry: return "WKBNoGeometry";
424+
case WKBPoint25D: return "WKBPoint25D";
425+
case WKBLineString25D: return "WKBLineString25D";
426+
case WKBPolygon25D: return "WKBPolygon25D";
427+
case WKBMultiPoint25D: return "WKBMultiPoint25D";
428+
case WKBMultiLineString25D: return "WKBMultiLineString25D";
429+
case WKBMultiPolygon25D: return "WKBMultiPolygon25D";
430+
default: return "invalid wkbtype";
431+
432+
}
433+
}

‎src/core/qgis.h

Lines changed: 27 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ class CORE_EXPORT QGis
5050

5151
//! Used for symbology operations
5252
// Feature types
53-
enum WkbType
53+
// @deprecated use QgsWKBTypes::Type
54+
/* Q_DECL_DEPRECATED */ enum WkbType
5455
{
5556
WKBUnknown = 0,
5657
WKBPoint = 1,
@@ -68,89 +69,29 @@ class CORE_EXPORT QGis
6869
WKBMultiPolygon25D,
6970
};
7071

71-
static WkbType singleType( WkbType type )
72-
{
73-
switch ( type )
74-
{
75-
case WKBMultiPoint: return WKBPoint;
76-
case WKBMultiLineString: return WKBLineString;
77-
case WKBMultiPolygon: return WKBPolygon;
78-
case WKBMultiPoint25D: return WKBPoint25D;
79-
case WKBMultiLineString25D: return WKBLineString25D;
80-
case WKBMultiPolygon25D: return WKBPolygon25D;
81-
default: return type;
82-
}
83-
}
84-
85-
static WkbType multiType( WkbType type )
86-
{
87-
switch ( type )
88-
{
89-
case WKBPoint: return WKBMultiPoint;
90-
case WKBLineString: return WKBMultiLineString;
91-
case WKBPolygon: return WKBMultiPolygon;
92-
case WKBPoint25D: return WKBMultiPoint25D;
93-
case WKBLineString25D: return WKBMultiLineString25D;
94-
case WKBPolygon25D: return WKBMultiPolygon25D;
95-
default: return type;
96-
}
97-
}
98-
99-
static WkbType flatType( WkbType type )
100-
{
101-
switch ( type )
102-
{
103-
case WKBPoint25D: return WKBPoint;
104-
case WKBLineString25D: return WKBLineString;
105-
case WKBPolygon25D: return WKBPolygon;
106-
case WKBMultiPoint25D: return WKBMultiPoint;
107-
case WKBMultiLineString25D: return WKBMultiLineString;
108-
case WKBMultiPolygon25D: return WKBMultiPolygon;
109-
default: return type;
110-
}
111-
}
112-
113-
static bool isSingleType( WkbType type )
114-
{
115-
switch ( flatType( type ) )
116-
{
117-
case WKBPoint:
118-
case WKBLineString:
119-
case WKBPolygon:
120-
return true;
121-
default:
122-
return false;
123-
}
124-
}
125-
126-
static bool isMultiType( WkbType type )
127-
{
128-
switch ( flatType( type ) )
129-
{
130-
case WKBMultiPoint:
131-
case WKBMultiLineString:
132-
case WKBMultiPolygon:
133-
return true;
134-
default:
135-
return false;
136-
}
137-
}
138-
139-
static int wkbDimensions( WkbType type )
140-
{
141-
switch ( type )
142-
{
143-
case WKBUnknown: return 0;
144-
case WKBNoGeometry: return 0;
145-
case WKBPoint25D: return 3;
146-
case WKBLineString25D: return 3;
147-
case WKBPolygon25D: return 3;
148-
case WKBMultiPoint25D: return 3;
149-
case WKBMultiLineString25D: return 3;
150-
case WKBMultiPolygon25D: return 3;
151-
default: return 2;
152-
}
153-
}
72+
//! Map multi to single type
73+
// @deprecated use QgsWKBTypes::singleType
74+
/* Q_DECL_DEPRECATED */ static WkbType singleType( WkbType type );
75+
76+
//! Map single to multitype type
77+
// @deprecated use QgsWKBTypes::multiType
78+
/* Q_DECL_DEPRECATED */ static WkbType multiType( WkbType type );
79+
80+
//! Map 2d+ to 2d type
81+
// @deprecated use QgsWKBTypes::flatType
82+
/* Q_DECL_DEPRECATED */ static WkbType flatType( WkbType type );
83+
84+
//! Return if type is a single type
85+
// @deprecated use QgsWKBTypes::isSingleType
86+
/* Q_DECL_DEPRECATED */ static bool isSingleType( WkbType type );
87+
88+
//! Return if type is a multi type
89+
// @deprecated use QgsWKBTypes::isMultiType
90+
/* Q_DECL_DEPRECATED */ static bool isMultiType( WkbType type );
91+
92+
// get dimension of points
93+
// @deprecated use QgsWKBTypes::hasZ() and QgsWKBTypes::hasM()
94+
/* Q_DECL_DEPRECATED */ static int wkbDimensions( WkbType type );
15495

15596
enum GeometryType
15697
{
@@ -162,41 +103,10 @@ class CORE_EXPORT QGis
162103
};
163104

164105
//! description strings for geometry types
165-
static const char *vectorGeometryType( GeometryType type )
166-
{
167-
switch ( type )
168-
{
169-
case Point: return "Point";
170-
case Line: return "Line";
171-
case Polygon: return "Polygon";
172-
case UnknownGeometry: return "Unknown geometry";
173-
case NoGeometry: return "No geometry";
174-
default: return "Invalid type";
175-
}
176-
}
106+
static const char *vectorGeometryType( GeometryType type );
177107

178108
//! description strings for feature types
179-
static const char *featureType( WkbType type )
180-
{
181-
switch ( type )
182-
{
183-
case WKBUnknown: return "WKBUnknown";
184-
case WKBPoint: return "WKBPoint";
185-
case WKBLineString: return "WKBLineString";
186-
case WKBPolygon: return "WKBPolygon";
187-
case WKBMultiPoint: return "WKBMultiPoint";
188-
case WKBMultiLineString: return "WKBMultiLineString";
189-
case WKBMultiPolygon: return "WKBMultiPolygon";
190-
case WKBNoGeometry: return "WKBNoGeometry";
191-
case WKBPoint25D: return "WKBPoint25D";
192-
case WKBLineString25D: return "WKBLineString25D";
193-
case WKBPolygon25D: return "WKBPolygon25D";
194-
case WKBMultiPoint25D: return "WKBMultiPoint25D";
195-
case WKBMultiLineString25D: return "WKBMultiLineString25D";
196-
case WKBMultiPolygon25D: return "WKBMultiPolygon25D";
197-
default: return "invalid wkbtype";
198-
}
199-
}
109+
static const char *featureType( WkbType type );
200110

201111
/** Raster data types.
202112
* This is modified and extended copy of GDALDataType.

‎src/core/qgsmaptopixelgeometrysimplifier.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ static bool generalizeWkbGeometryByBoundingBox(
7272
unsigned int geometryType = QGis::singleType( QGis::flatType( wkbType ) );
7373

7474
int sizeOfDoubleX = sizeof( double );
75-
int sizeOfDoubleY = QGis::wkbDimensions( wkbType ) == 3 /*hasZValue*/ ? 2 * sizeof( double ) : sizeof( double );
75+
int sizeOfDoubleY = sizeof( double ) * ( QGis::wkbDimensions( wkbType ) - 1 );
7676

7777
// If the geometry is already minimal skip the generalization
7878
size_t minimumSize = geometryType == QGis::WKBLineString ? 4 + 2 * ( sizeOfDoubleX + sizeOfDoubleY ) : 8 + 5 * ( sizeOfDoubleX + sizeOfDoubleY );

0 commit comments

Comments
 (0)
Please sign in to comment.