Skip to content

Commit 18a27b2

Browse files
author
mhugent
committedFeb 17, 2011
Safer handling of layers with unknown geometry
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@15180 c8812cc2-4d05-0410-92ff-de0c093fc19c

File tree

4 files changed

+54
-36
lines changed

4 files changed

+54
-36
lines changed
 

‎python/core/qgsvectorlayer.sip

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,10 @@ public:
145145
/** Returns point, line or polygon */
146146
QGis::GeometryType geometryType() const;
147147

148+
/** Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeometry
149+
@note added in 1.7*/
150+
bool hasGeometryType() const;
151+
148152
/**Returns the WKBType or WKBUnknown in case of error*/
149153
QGis::WkbType wkbType() const;
150154

‎src/app/legend/qgslegendlayer.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ QgsLegendLayer::QgsLegendLayer( QgsMapLayer* layer )
6363
Qt::ItemFlags flags = Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable;
6464

6565
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layer );
66-
if ( !vlayer || vlayer->geometryType() != QGis::NoGeometry )
66+
if ( !vlayer || vlayer->hasGeometryType() )
6767
{
6868
flags |= Qt::ItemIsUserCheckable;
6969
}
@@ -195,7 +195,7 @@ void QgsLegendLayer::vectorLayerSymbology( QgsVectorLayer* layer, double widthSc
195195
}
196196

197197
SymbologyList itemList;
198-
if ( layer->geometryType() != QGis::NoGeometry )
198+
if ( layer->hasGeometryType() )
199199
{
200200
//add the new items
201201
QString lw, uv, label;
@@ -288,13 +288,17 @@ void QgsLegendLayer::vectorLayerSymbologyV2( QgsVectorLayer* layer )
288288
{
289289
QSize iconSize( 16, 16 );
290290

291-
SymbologyList itemList = layer->rendererV2()->legendSymbologyItems( iconSize );
292-
if ( mShowFeatureCount )
291+
QgsFeatureRendererV2* renderer = layer->rendererV2();
292+
if ( renderer )
293293
{
294-
updateItemListCountV2( itemList, layer );
295-
}
294+
SymbologyList itemList = renderer->legendSymbologyItems( iconSize );
295+
if ( mShowFeatureCount )
296+
{
297+
updateItemListCountV2( itemList, layer );
298+
}
296299

297-
changeSymbologySettings( layer, itemList );
300+
changeSymbologySettings( layer, itemList );
301+
}
298302
}
299303

300304
void QgsLegendLayer::rasterLayerSymbology( QgsRasterLayer* layer )

‎src/core/qgsvectorlayer.cpp

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ QgsVectorLayer::QgsVectorLayer( QString vectorLayerPath,
127127
setCoordinateSystem();
128128

129129
QSettings settings;
130-
if ( settings.value( "/qgis/use_symbology_ng", false ).toBool() && geometryType() != QGis::NoGeometry )
130+
if ( settings.value( "/qgis/use_symbology_ng", false ).toBool() && hasGeometryType() )
131131
{
132132
// using symbology-ng!
133133
setUsingRendererV2( true );
@@ -142,7 +142,7 @@ QgsVectorLayer::QgsVectorLayer( QString vectorLayerPath,
142142
}
143143

144144
// if the default style failed to load or was disabled use some very basic defaults
145-
if ( !defaultLoadedFlag && geometryType() != QGis::NoGeometry )
145+
if ( !defaultLoadedFlag && hasGeometryType() )
146146
{
147147
// add single symbol renderer
148148
if ( mUsingRendererV2 )
@@ -240,7 +240,7 @@ QString QgsVectorLayer::providerType() const
240240
*/
241241
void QgsVectorLayer::setDisplayField( QString fldName )
242242
{
243-
if ( geometryType() == QGis::NoGeometry )
243+
if ( !hasGeometryType() )
244244
return;
245245

246246
// If fldName is provided, use it as the display field, otherwise
@@ -320,7 +320,7 @@ void QgsVectorLayer::setDisplayField( QString fldName )
320320
// This method will probably be removed again in the near future!
321321
void QgsVectorLayer::drawLabels( QgsRenderContext& rendererContext )
322322
{
323-
if ( geometryType() == QGis::NoGeometry )
323+
if ( !hasGeometryType() )
324324
return;
325325

326326
QgsDebugMsg( "Starting draw of labels" );
@@ -711,7 +711,7 @@ unsigned char *QgsVectorLayer::drawPolygon( unsigned char *feature, QgsRenderCon
711711

712712
void QgsVectorLayer::drawRendererV2( QgsRenderContext& rendererContext, bool labeling )
713713
{
714-
if ( geometryType() == QGis::NoGeometry )
714+
if ( !hasGeometryType() )
715715
return;
716716

717717
QSettings settings;
@@ -776,7 +776,7 @@ void QgsVectorLayer::drawRendererV2( QgsRenderContext& rendererContext, bool lab
776776

777777
void QgsVectorLayer::drawRendererV2Levels( QgsRenderContext& rendererContext, bool labeling )
778778
{
779-
if ( geometryType() == QGis::NoGeometry )
779+
if ( !hasGeometryType() )
780780
return;
781781

782782
QHash< QgsSymbolV2*, QList<QgsFeature> > features; // key = symbol, value = array of features
@@ -916,7 +916,7 @@ void QgsVectorLayer::reload()
916916

917917
bool QgsVectorLayer::draw( QgsRenderContext& rendererContext )
918918
{
919-
if ( geometryType() == QGis::NoGeometry )
919+
if ( !hasGeometryType() )
920920
return true;
921921

922922
//set update threshold before each draw to make sure the current setting is picked up
@@ -1293,7 +1293,7 @@ const QgsRenderer* QgsVectorLayer::renderer() const
12931293

12941294
void QgsVectorLayer::setRenderer( QgsRenderer * r )
12951295
{
1296-
if ( geometryType() == QGis::NoGeometry )
1296+
if ( !hasGeometryType() )
12971297
return;
12981298

12991299
if ( r != mRenderer )
@@ -1354,6 +1354,12 @@ QGis::GeometryType QgsVectorLayer::geometryType() const
13541354
return QGis::UnknownGeometry;
13551355
}
13561356

1357+
bool QgsVectorLayer::hasGeometryType() const
1358+
{
1359+
QGis::GeometryType t = geometryType();
1360+
return ( t != QGis::NoGeometry && t != QGis::UnknownGeometry );
1361+
}
1362+
13571363
QGis::WkbType QgsVectorLayer::wkbType() const
13581364
{
13591365
return ( QGis::WkbType )( mWkbType );
@@ -1422,7 +1428,7 @@ long QgsVectorLayer::updateFeatureCount() const
14221428

14231429
void QgsVectorLayer::updateExtents()
14241430
{
1425-
if ( geometryType() == QGis::NoGeometry )
1431+
if ( !hasGeometryType() )
14261432
return;
14271433

14281434
mLayerExtent.setMinimal();
@@ -1921,7 +1927,7 @@ bool QgsVectorLayer::addFeature( QgsFeature& f, bool alsoUpdateExtent )
19211927

19221928
bool QgsVectorLayer::insertVertex( double x, double y, int atFeatureId, int beforeVertex )
19231929
{
1924-
if ( geometryType() == QGis::NoGeometry )
1930+
if ( !hasGeometryType() )
19251931
return false;
19261932

19271933
if ( !mEditable )
@@ -1960,7 +1966,7 @@ bool QgsVectorLayer::insertVertex( double x, double y, int atFeatureId, int befo
19601966

19611967
bool QgsVectorLayer::moveVertex( double x, double y, int atFeatureId, int atVertex )
19621968
{
1963-
if ( geometryType() == QGis::NoGeometry )
1969+
if ( !hasGeometryType() )
19641970
return false;
19651971

19661972
if ( !mEditable )
@@ -2000,7 +2006,7 @@ bool QgsVectorLayer::moveVertex( double x, double y, int atFeatureId, int atVert
20002006

20012007
bool QgsVectorLayer::deleteVertex( int atFeatureId, int atVertex )
20022008
{
2003-
if ( geometryType() == QGis::NoGeometry )
2009+
if ( !hasGeometryType() )
20042010
return false;
20052011

20062012
if ( !mEditable )
@@ -2074,7 +2080,7 @@ bool QgsVectorLayer::deleteSelectedFeatures()
20742080

20752081
int QgsVectorLayer::addRing( const QList<QgsPoint>& ring )
20762082
{
2077-
if ( geometryType() == QGis::NoGeometry )
2083+
if ( !hasGeometryType() )
20782084
return 5;
20792085

20802086
int addRingReturnCode = 5; //default: return code for 'ring not inserted'
@@ -2111,7 +2117,7 @@ int QgsVectorLayer::addRing( const QList<QgsPoint>& ring )
21112117

21122118
int QgsVectorLayer::addIsland( const QList<QgsPoint>& ring )
21132119
{
2114-
if ( geometryType() == QGis::NoGeometry )
2120+
if ( !hasGeometryType() )
21152121
return 6;
21162122

21172123
//number of selected features must be 1
@@ -2188,7 +2194,7 @@ int QgsVectorLayer::addIsland( const QList<QgsPoint>& ring )
21882194

21892195
int QgsVectorLayer::translateFeature( int featureId, double dx, double dy )
21902196
{
2191-
if ( geometryType() == QGis::NoGeometry )
2197+
if ( !hasGeometryType() )
21922198
return 1;
21932199

21942200
//look if geometry of selected feature already contains geometry changes
@@ -2246,7 +2252,7 @@ int QgsVectorLayer::translateFeature( int featureId, double dx, double dy )
22462252

22472253
int QgsVectorLayer::splitFeatures( const QList<QgsPoint>& splitLine, bool topologicalEditing )
22482254
{
2249-
if ( geometryType() == QGis::NoGeometry )
2255+
if ( !hasGeometryType() )
22502256
return 4;
22512257

22522258
QgsFeatureList newFeatures; //store all the newly created features
@@ -2358,7 +2364,7 @@ int QgsVectorLayer::splitFeatures( const QList<QgsPoint>& splitLine, bool topolo
23582364

23592365
int QgsVectorLayer::removePolygonIntersections( QgsGeometry* geom )
23602366
{
2361-
if ( geometryType() == QGis::NoGeometry )
2367+
if ( !hasGeometryType() )
23622368
return 1;
23632369

23642370
int returnValue = 0;
@@ -2393,7 +2399,7 @@ int QgsVectorLayer::removePolygonIntersections( QgsGeometry* geom )
23932399

23942400
int QgsVectorLayer::addTopologicalPoints( QgsGeometry* geom )
23952401
{
2396-
if ( geometryType() == QGis::NoGeometry )
2402+
if ( !hasGeometryType() )
23972403
return 1;
23982404

23992405
if ( !geom )
@@ -2500,7 +2506,7 @@ int QgsVectorLayer::addTopologicalPoints( QgsGeometry* geom )
25002506

25012507
int QgsVectorLayer::addTopologicalPoints( const QgsPoint& p )
25022508
{
2503-
if ( geometryType() == QGis::NoGeometry )
2509+
if ( !hasGeometryType() )
25042510
return 1;
25052511

25062512
QMultiMap<double, QgsSnappingResult> snapResults; //results from the snapper object
@@ -2825,7 +2831,7 @@ bool QgsVectorLayer::writeXml( QDomNode & layer_node,
28252831

28262832
bool QgsVectorLayer::readSymbology( const QDomNode& node, QString& errorMessage )
28272833
{
2828-
if ( geometryType() != QGis::NoGeometry )
2834+
if ( hasGeometryType() )
28292835
{
28302836
// try renderer v2 first
28312837
QDomElement rendererElement = node.firstChildElement( RENDERER_TAG_NAME );
@@ -3020,7 +3026,7 @@ bool QgsVectorLayer::writeSymbology( QDomNode& node, QDomDocument& doc, QString&
30203026
{
30213027
QDomElement mapLayerNode = node.toElement();
30223028

3023-
if ( geometryType() != QGis::NoGeometry )
3029+
if ( hasGeometryType() )
30243030
{
30253031
if ( mUsingRendererV2 )
30263032
{
@@ -3198,7 +3204,7 @@ bool QgsVectorLayer::writeSymbology( QDomNode& node, QDomDocument& doc, QString&
31983204

31993205
bool QgsVectorLayer::changeGeometry( int fid, QgsGeometry* geom )
32003206
{
3201-
if ( !mEditable || !mDataProvider || geometryType() == QGis::NoGeometry )
3207+
if ( !mEditable || !mDataProvider || !hasGeometryType() )
32023208
{
32033209
return false;
32043210
}
@@ -3831,7 +3837,7 @@ bool QgsVectorLayer::addFeatures( QgsFeatureList features, bool makeSelected )
38313837

38323838
bool QgsVectorLayer::copySymbologySettings( const QgsMapLayer& other )
38333839
{
3834-
if ( geometryType() == QGis::NoGeometry )
3840+
if ( !hasGeometryType() )
38353841
return false;
38363842

38373843
const QgsVectorLayer* vl = qobject_cast<const QgsVectorLayer *>( &other );
@@ -3899,7 +3905,7 @@ bool QgsVectorLayer::hasCompatibleSymbology( const QgsMapLayer& other ) const
38993905

39003906
bool QgsVectorLayer::snapPoint( QgsPoint& point, double tolerance )
39013907
{
3902-
if ( geometryType() == QGis::NoGeometry )
3908+
if ( !hasGeometryType() )
39033909
return false;
39043910

39053911
QMultiMap<double, QgsSnappingResult> snapResults;
@@ -3926,7 +3932,7 @@ int QgsVectorLayer::snapWithContext( const QgsPoint& startPoint, double snapping
39263932
QMultiMap<double, QgsSnappingResult>& snappingResults,
39273933
QgsSnapper::SnappingType snap_to )
39283934
{
3929-
if ( geometryType() == QGis::NoGeometry )
3935+
if ( !hasGeometryType() )
39303936
return 1;
39313937

39323938
if ( snappingTolerance <= 0 || !mDataProvider )
@@ -4033,7 +4039,7 @@ void QgsVectorLayer::snapToGeometry( const QgsPoint& startPoint, int featureId,
40334039

40344040
int QgsVectorLayer::insertSegmentVerticesForSnap( const QList<QgsSnappingResult>& snapResults )
40354041
{
4036-
if ( geometryType() == QGis::NoGeometry )
4042+
if ( !hasGeometryType() )
40374043
return 1;
40384044

40394045
int returnval = 0;
@@ -4262,7 +4268,7 @@ void QgsVectorLayer::setCoordinateSystem()
42624268
//we only nee to do that if the srs is not alreay valid
42634269
if ( !mCRS->isValid() )
42644270
{
4265-
if ( geometryType() != QGis::NoGeometry )
4271+
if ( hasGeometryType() )
42664272
{
42674273
mCRS->setValidationHint( tr( "Specify CRS for layer %1" ).arg( name() ) );
42684274
mCRS->validate();
@@ -4456,7 +4462,7 @@ QgsFeatureRendererV2* QgsVectorLayer::rendererV2()
44564462
}
44574463
void QgsVectorLayer::setRendererV2( QgsFeatureRendererV2* r )
44584464
{
4459-
if ( geometryType() == QGis::NoGeometry )
4465+
if ( !hasGeometryType() )
44604466
return;
44614467

44624468
delete mRendererV2;
@@ -4468,7 +4474,7 @@ bool QgsVectorLayer::isUsingRendererV2()
44684474
}
44694475
void QgsVectorLayer::setUsingRendererV2( bool usingRendererV2 )
44704476
{
4471-
if ( geometryType() == QGis::NoGeometry )
4477+
if ( !hasGeometryType() )
44724478
return;
44734479

44744480
mUsingRendererV2 = usingRendererV2;

‎src/core/qgsvectorlayer.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,10 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
232232
/** Returns point, line or polygon */
233233
QGis::GeometryType geometryType() const;
234234

235+
/** Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeometry
236+
@note added in 1.7*/
237+
bool hasGeometryType() const;
238+
235239
/**Returns the WKBType or WKBUnknown in case of error*/
236240
QGis::WkbType wkbType() const;
237241

0 commit comments

Comments
 (0)
Please sign in to comment.