Skip to content

Commit b21747b

Browse files
author
jef
committedOct 18, 2010
improve support for geometry-less layers
git-svn-id: http://svn.osgeo.org/qgis/trunk@14391 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent efa5c7a commit b21747b

File tree

3 files changed

+241
-175
lines changed

3 files changed

+241
-175
lines changed
 

‎src/core/qgsvectordataprovider.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@
2626
#include "qgslogger.h"
2727

2828
QgsVectorDataProvider::QgsVectorDataProvider( QString uri )
29-
: QgsDataProvider( uri ),
30-
mCacheMinMaxDirty( true ),
31-
mFetchFeaturesWithoutGeom( true )
29+
: QgsDataProvider( uri )
30+
, mCacheMinMaxDirty( true )
31+
, mFetchFeaturesWithoutGeom( true )
3232
{
3333
QSettings settings;
3434
setEncoding( settings.value( "/UI/encoding", QString( "System" ) ).toString() );

‎src/core/qgsvectorlayer.cpp

Lines changed: 231 additions & 170 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,9 @@ QString QgsVectorLayer::providerType() const
236236
*/
237237
void QgsVectorLayer::setDisplayField( QString fldName )
238238
{
239+
if ( geometryType() == QGis::NoGeometry )
240+
return;
241+
239242
// If fldName is provided, use it as the display field, otherwise
240243
// determine the field index for the feature column of the identify
241244
// dialog. We look for fields containing "name" first and second for
@@ -313,12 +316,15 @@ void QgsVectorLayer::setDisplayField( QString fldName )
313316
// This method will probably be removed again in the near future!
314317
void QgsVectorLayer::drawLabels( QgsRenderContext& rendererContext )
315318
{
319+
if ( geometryType() == QGis::NoGeometry )
320+
return;
321+
316322
QgsDebugMsg( "Starting draw of labels" );
317323

318324
if (( mRenderer || mRendererV2 ) && mLabelOn &&
319-
( !label()->scaleBasedVisibility() ||
320-
( label()->minScale() <= rendererContext.rendererScale() &&
321-
rendererContext.rendererScale() <= label()->maxScale() ) ) )
325+
( !mLabel->scaleBasedVisibility() ||
326+
( mLabel->minScale() <= rendererContext.rendererScale() &&
327+
rendererContext.rendererScale() <= mLabel->maxScale() ) ) )
322328
{
323329
QgsAttributeList attributes;
324330
if ( mRenderer )
@@ -701,6 +707,9 @@ unsigned char *QgsVectorLayer::drawPolygon( unsigned char *feature, QgsRenderCon
701707

702708
void QgsVectorLayer::drawRendererV2( QgsRenderContext& rendererContext, bool labeling )
703709
{
710+
if ( geometryType() == QGis::NoGeometry )
711+
return;
712+
704713
QSettings settings;
705714
bool vertexMarkerOnlyForSelection = settings.value( "/qgis/digitizing/marker_only_for_selected", false ).toBool();
706715

@@ -763,6 +772,9 @@ void QgsVectorLayer::drawRendererV2( QgsRenderContext& rendererContext, bool lab
763772

764773
void QgsVectorLayer::drawRendererV2Levels( QgsRenderContext& rendererContext, bool labeling )
765774
{
775+
if ( geometryType() == QGis::NoGeometry )
776+
return;
777+
766778
QHash< QgsSymbolV2*, QList<QgsFeature> > features; // key = symbol, value = array of features
767779

768780
QSettings settings;
@@ -898,6 +910,9 @@ void QgsVectorLayer::reload()
898910

899911
bool QgsVectorLayer::draw( QgsRenderContext& rendererContext )
900912
{
913+
if ( geometryType() == QGis::NoGeometry )
914+
return true;
915+
901916
//set update threshold before each draw to make sure the current setting is picked up
902917
QSettings settings;
903918
mUpdateThreshold = settings.value( "Map/updateThreshold", 0 ).toInt();
@@ -1272,6 +1287,9 @@ const QgsRenderer* QgsVectorLayer::renderer() const
12721287

12731288
void QgsVectorLayer::setRenderer( QgsRenderer * r )
12741289
{
1290+
if ( geometryType() == QGis::NoGeometry )
1291+
return;
1292+
12751293
if ( r != mRenderer )
12761294
{
12771295
delete mRenderer;
@@ -1398,6 +1416,9 @@ long QgsVectorLayer::updateFeatureCount() const
13981416

13991417
void QgsVectorLayer::updateExtents()
14001418
{
1419+
if ( geometryType() == QGis::NoGeometry )
1420+
return;
1421+
14011422
mLayerExtent.setMinimal();
14021423

14031424
if ( !mDataProvider )
@@ -1778,7 +1799,9 @@ bool QgsVectorLayer::addFeature( QgsFeature& f, bool alsoUpdateExtent )
17781799
// and add to the known added features.
17791800
f.setFeatureId( addedIdLowWaterMark );
17801801
editFeatureAdd( f );
1781-
mCachedGeometries[f.id()] = *f.geometry();
1802+
1803+
if ( f.geometry() )
1804+
mCachedGeometries[f.id()] = *f.geometry();
17821805

17831806
setModified( true );
17841807

@@ -1793,6 +1816,9 @@ bool QgsVectorLayer::addFeature( QgsFeature& f, bool alsoUpdateExtent )
17931816

17941817
bool QgsVectorLayer::insertVertex( double x, double y, int atFeatureId, int beforeVertex )
17951818
{
1819+
if ( geometryType() == QGis::NoGeometry )
1820+
return false;
1821+
17961822
if ( !mEditable )
17971823
{
17981824
return false;
@@ -1829,6 +1855,9 @@ bool QgsVectorLayer::insertVertex( double x, double y, int atFeatureId, int befo
18291855

18301856
bool QgsVectorLayer::moveVertex( double x, double y, int atFeatureId, int atVertex )
18311857
{
1858+
if ( geometryType() == QGis::NoGeometry )
1859+
return false;
1860+
18321861
if ( !mEditable )
18331862
{
18341863
return false;
@@ -1866,6 +1895,9 @@ bool QgsVectorLayer::moveVertex( double x, double y, int atFeatureId, int atVert
18661895

18671896
bool QgsVectorLayer::deleteVertex( int atFeatureId, int atVertex )
18681897
{
1898+
if ( geometryType() == QGis::NoGeometry )
1899+
return false;
1900+
18691901
if ( !mEditable )
18701902
{
18711903
return false;
@@ -1937,6 +1969,9 @@ bool QgsVectorLayer::deleteSelectedFeatures()
19371969

19381970
int QgsVectorLayer::addRing( const QList<QgsPoint>& ring )
19391971
{
1972+
if ( geometryType() == QGis::NoGeometry )
1973+
return 5;
1974+
19401975
int addRingReturnCode = 5; //default: return code for 'ring not inserted'
19411976
double xMin, yMin, xMax, yMax;
19421977
QgsRectangle bBox;
@@ -1971,6 +2006,9 @@ int QgsVectorLayer::addRing( const QList<QgsPoint>& ring )
19712006

19722007
int QgsVectorLayer::addIsland( const QList<QgsPoint>& ring )
19732008
{
2009+
if ( geometryType() == QGis::NoGeometry )
2010+
return 6;
2011+
19742012
//number of selected features must be 1
19752013

19762014
if ( mSelectedFeatureIds.size() < 1 )
@@ -2045,6 +2083,9 @@ int QgsVectorLayer::addIsland( const QList<QgsPoint>& ring )
20452083

20462084
int QgsVectorLayer::translateFeature( int featureId, double dx, double dy )
20472085
{
2086+
if ( geometryType() == QGis::NoGeometry )
2087+
return 1;
2088+
20482089
//look if geometry of selected feature already contains geometry changes
20492090
QgsGeometryMap::iterator changedIt = mChangedGeometries.find( featureId );
20502091
if ( changedIt != mChangedGeometries.end() )
@@ -2100,6 +2141,9 @@ int QgsVectorLayer::translateFeature( int featureId, double dx, double dy )
21002141

21012142
int QgsVectorLayer::splitFeatures( const QList<QgsPoint>& splitLine, bool topologicalEditing )
21022143
{
2144+
if ( geometryType() == QGis::NoGeometry )
2145+
return 4;
2146+
21032147
QgsFeatureList newFeatures; //store all the newly created features
21042148
double xMin, yMin, xMax, yMax;
21052149
QgsRectangle bBox; //bounding box of the split line
@@ -2209,6 +2253,9 @@ int QgsVectorLayer::splitFeatures( const QList<QgsPoint>& splitLine, bool topolo
22092253

22102254
int QgsVectorLayer::removePolygonIntersections( QgsGeometry* geom )
22112255
{
2256+
if ( geometryType() == QGis::NoGeometry )
2257+
return 1;
2258+
22122259
int returnValue = 0;
22132260

22142261
//first test if geom really has type polygon or multipolygon
@@ -2241,6 +2288,9 @@ int QgsVectorLayer::removePolygonIntersections( QgsGeometry* geom )
22412288

22422289
int QgsVectorLayer::addTopologicalPoints( QgsGeometry* geom )
22432290
{
2291+
if ( geometryType() == QGis::NoGeometry )
2292+
return 1;
2293+
22442294
if ( !geom )
22452295
{
22462296
return 1;
@@ -2345,6 +2395,9 @@ int QgsVectorLayer::addTopologicalPoints( QgsGeometry* geom )
23452395

23462396
int QgsVectorLayer::addTopologicalPoints( const QgsPoint& p )
23472397
{
2398+
if ( geometryType() == QGis::NoGeometry )
2399+
return 1;
2400+
23482401
QMultiMap<double, QgsSnappingResult> snapResults; //results from the snapper object
23492402
//we also need to snap to vertex to make sure the vertex does not already exist in this geometry
23502403
QMultiMap<double, QgsSnappingResult> vertexSnapResults;
@@ -2397,7 +2450,7 @@ int QgsVectorLayer::addTopologicalPoints( const QgsPoint& p )
23972450
return 0;
23982451
}
23992452

2400-
QgsLabel * QgsVectorLayer::label()
2453+
QgsLabel *QgsVectorLayer::label()
24012454
{
24022455
return mLabel;
24032456
}
@@ -2648,103 +2701,119 @@ bool QgsVectorLayer::writeXml( QDomNode & layer_node,
26482701

26492702
// renderer specific settings
26502703
QString errorMsg;
2651-
if ( geometryType() != QGis::NoGeometry )
2652-
{
2653-
if ( !writeSymbology( layer_node, document, errorMsg ) )
2654-
{
2655-
return false;
2656-
}
2657-
}
2658-
return true;
2704+
return writeSymbology( layer_node, document, errorMsg );
26592705
} // bool QgsVectorLayer::writeXml
26602706

26612707
bool QgsVectorLayer::readSymbology( const QDomNode& node, QString& errorMessage )
26622708
{
2663-
// try renderer v2 first
2664-
QDomElement rendererElement = node.firstChildElement( RENDERER_TAG_NAME );
2665-
if ( !rendererElement.isNull() )
2709+
if ( geometryType() != QGis::NoGeometry )
26662710
{
2667-
// using renderer v2
2668-
setUsingRendererV2( true );
2711+
// try renderer v2 first
2712+
QDomElement rendererElement = node.firstChildElement( RENDERER_TAG_NAME );
2713+
if ( !rendererElement.isNull() )
2714+
{
2715+
// using renderer v2
2716+
setUsingRendererV2( true );
26692717

2670-
QgsFeatureRendererV2* r = QgsFeatureRendererV2::load( rendererElement );
2671-
if ( r == NULL )
2672-
return false;
2718+
QgsFeatureRendererV2* r = QgsFeatureRendererV2::load( rendererElement );
2719+
if ( r == NULL )
2720+
return false;
26732721

2674-
setRendererV2( r );
2675-
}
2676-
else
2677-
{
2678-
// using renderer v1
2679-
setUsingRendererV2( false );
2722+
setRendererV2( r );
2723+
}
2724+
else
2725+
{
2726+
// using renderer v1
2727+
setUsingRendererV2( false );
26802728

2681-
// create and bind a renderer to this layer
2729+
// create and bind a renderer to this layer
26822730

2683-
QDomNode singlenode = node.namedItem( "singlesymbol" );
2684-
QDomNode graduatednode = node.namedItem( "graduatedsymbol" );
2685-
QDomNode continuousnode = node.namedItem( "continuoussymbol" );
2686-
QDomNode uniquevaluenode = node.namedItem( "uniquevalue" );
2731+
QDomNode singlenode = node.namedItem( "singlesymbol" );
2732+
QDomNode graduatednode = node.namedItem( "graduatedsymbol" );
2733+
QDomNode continuousnode = node.namedItem( "continuoussymbol" );
2734+
QDomNode uniquevaluenode = node.namedItem( "uniquevalue" );
26872735

2688-
QgsRenderer * renderer = 0;
2689-
int returnCode = 1;
2736+
QgsRenderer * renderer = 0;
2737+
int returnCode = 1;
26902738

2691-
if ( !singlenode.isNull() )
2692-
{
2693-
renderer = new QgsSingleSymbolRenderer( geometryType() );
2694-
returnCode = renderer->readXML( singlenode, *this );
2695-
}
2696-
else if ( !graduatednode.isNull() )
2697-
{
2698-
renderer = new QgsGraduatedSymbolRenderer( geometryType() );
2699-
returnCode = renderer->readXML( graduatednode, *this );
2700-
}
2701-
else if ( !continuousnode.isNull() )
2702-
{
2703-
renderer = new QgsContinuousColorRenderer( geometryType() );
2704-
returnCode = renderer->readXML( continuousnode, *this );
2705-
}
2706-
else if ( !uniquevaluenode.isNull() )
2707-
{
2708-
renderer = new QgsUniqueValueRenderer( geometryType() );
2709-
returnCode = renderer->readXML( uniquevaluenode, *this );
2739+
if ( !singlenode.isNull() )
2740+
{
2741+
renderer = new QgsSingleSymbolRenderer( geometryType() );
2742+
returnCode = renderer->readXML( singlenode, *this );
2743+
}
2744+
else if ( !graduatednode.isNull() )
2745+
{
2746+
renderer = new QgsGraduatedSymbolRenderer( geometryType() );
2747+
returnCode = renderer->readXML( graduatednode, *this );
2748+
}
2749+
else if ( !continuousnode.isNull() )
2750+
{
2751+
renderer = new QgsContinuousColorRenderer( geometryType() );
2752+
returnCode = renderer->readXML( continuousnode, *this );
2753+
}
2754+
else if ( !uniquevaluenode.isNull() )
2755+
{
2756+
renderer = new QgsUniqueValueRenderer( geometryType() );
2757+
returnCode = renderer->readXML( uniquevaluenode, *this );
2758+
}
2759+
2760+
if ( !renderer )
2761+
{
2762+
errorMessage = tr( "Unknown renderer" );
2763+
return false;
2764+
}
2765+
2766+
if ( returnCode == 1 )
2767+
{
2768+
errorMessage = tr( "No renderer object" ); delete renderer; return false;
2769+
}
2770+
else if ( returnCode == 2 )
2771+
{
2772+
errorMessage = tr( "Classification field not found" ); delete renderer; return false;
2773+
}
2774+
2775+
mRenderer = renderer;
27102776
}
27112777

2712-
if ( !renderer )
2778+
// get and set the display field if it exists.
2779+
QDomNode displayFieldNode = node.namedItem( "displayfield" );
2780+
if ( !displayFieldNode.isNull() )
27132781
{
2714-
errorMessage = tr( "Unknown renderer" );
2715-
return false;
2782+
QDomElement e = displayFieldNode.toElement();
2783+
setDisplayField( e.text() );
27162784
}
27172785

2718-
if ( returnCode == 1 )
2786+
// use scale dependent visibility flag
2787+
QDomElement e = node.toElement();
2788+
mLabel->setScaleBasedVisibility( e.attribute( "scaleBasedLabelVisibilityFlag", "0" ) == "1" );
2789+
mLabel->setMinScale( e.attribute( "minLabelScale", "1" ).toFloat() );
2790+
mLabel->setMaxScale( e.attribute( "maxLabelScale", "100000000" ).toFloat() );
2791+
2792+
// Test if labeling is on or off
2793+
QDomNode labelnode = node.namedItem( "label" );
2794+
QDomElement element = labelnode.toElement();
2795+
int hasLabelsEnabled = element.text().toInt();
2796+
if ( hasLabelsEnabled < 1 )
27192797
{
2720-
errorMessage = tr( "No renderer object" ); delete renderer; return false;
2798+
enableLabels( false );
27212799
}
2722-
else if ( returnCode == 2 )
2800+
else
27232801
{
2724-
errorMessage = tr( "Classification field not found" ); delete renderer; return false;
2802+
enableLabels( true );
27252803
}
27262804

2727-
mRenderer = renderer;
2805+
QDomNode labelattributesnode = node.namedItem( "labelattributes" );
27282806

2807+
if ( !labelattributesnode.isNull() )
2808+
{
2809+
QgsDebugMsg( "calling readXML" );
2810+
mLabel->readXML( labelattributesnode );
2811+
}
27292812
}
27302813

27312814
// process the attribute actions
27322815
mActions->readXML( node );
27332816

2734-
// get and set the display field if it exists.
2735-
QDomNode displayFieldNode = node.namedItem( "displayfield" );
2736-
if ( !displayFieldNode.isNull() )
2737-
{
2738-
QDomElement e = displayFieldNode.toElement();
2739-
setDisplayField( e.text() );
2740-
}
2741-
2742-
// use scale dependent visibility flag
2743-
QDomElement e = node.toElement();
2744-
label()->setScaleBasedVisibility( e.attribute( "scaleBasedLabelVisibilityFlag", "0" ) == "1" );
2745-
label()->setMinScale( e.attribute( "minLabelScale", "1" ).toFloat() );
2746-
label()->setMaxScale( e.attribute( "maxLabelScale", "100000000" ).toFloat() );
2747-
27482817
mEditTypes.clear();
27492818
QDomNode editTypesNode = node.namedItem( "edittypes" );
27502819
if ( !editTypesNode.isNull() )
@@ -2825,73 +2894,91 @@ bool QgsVectorLayer::readSymbology( const QDomNode& node, QString& errorMessage
28252894
}
28262895
}
28272896

2828-
// Test if labeling is on or off
2829-
QDomNode labelnode = node.namedItem( "label" );
2830-
QDomElement element = labelnode.toElement();
2831-
int hasLabelsEnabled = element.text().toInt();
2832-
if ( hasLabelsEnabled < 1 )
2833-
{
2834-
enableLabels( false );
2835-
}
2836-
else
2837-
{
2838-
enableLabels( true );
2839-
}
2840-
2841-
QDomNode labelattributesnode = node.namedItem( "labelattributes" );
2842-
2843-
if ( !labelattributesnode.isNull() )
2844-
{
2845-
QgsDebugMsg( "qgsvectorlayer calling label readXML routine" );
2846-
mLabel->readXML( labelattributesnode );
2847-
}
2848-
28492897
return true;
28502898
}
28512899

28522900
bool QgsVectorLayer::writeSymbology( QDomNode& node, QDomDocument& doc, QString& errorMessage ) const
28532901
{
2854-
if ( mUsingRendererV2 )
2855-
{
2856-
QDomElement rendererElement = mRendererV2->save( doc );
2857-
node.appendChild( rendererElement );
2858-
}
2859-
else
2902+
QDomElement mapLayerNode = node.toElement();
2903+
2904+
if ( geometryType() != QGis::NoGeometry )
28602905
{
2861-
//classification field(s)
2862-
QgsAttributeList attributes = mRenderer->classificationAttributes();
2863-
const QgsFieldMap providerFields = mDataProvider->fields();
2864-
for ( QgsAttributeList::const_iterator it = attributes.begin(); it != attributes.end(); ++it )
2906+
if ( mUsingRendererV2 )
28652907
{
2866-
QDomElement classificationElement = doc.createElement( "classificationattribute" );
2867-
QDomText classificationText = doc.createTextNode( providerFields[*it].name() );
2868-
classificationElement.appendChild( classificationText );
2869-
node.appendChild( classificationElement );
2908+
QDomElement rendererElement = mRendererV2->save( doc );
2909+
node.appendChild( rendererElement );
28702910
}
2871-
2872-
// renderer settings
2873-
const QgsRenderer * myRenderer = renderer();
2874-
if ( myRenderer )
2911+
else
28752912
{
2876-
if ( !myRenderer->writeXML( node, doc, *this ) )
2913+
// use scale dependent visibility flag
2914+
mapLayerNode.setAttribute( "scaleBasedLabelVisibilityFlag", mLabel->scaleBasedVisibility() ? 1 : 0 );
2915+
mapLayerNode.setAttribute( "minLabelScale", mLabel->minScale() );
2916+
mapLayerNode.setAttribute( "maxLabelScale", mLabel->maxScale() );
2917+
2918+
//classification field(s)
2919+
QgsAttributeList attributes = mRenderer->classificationAttributes();
2920+
const QgsFieldMap providerFields = mDataProvider->fields();
2921+
for ( QgsAttributeList::const_iterator it = attributes.begin(); it != attributes.end(); ++it )
2922+
{
2923+
QDomElement classificationElement = doc.createElement( "classificationattribute" );
2924+
QDomText classificationText = doc.createTextNode( providerFields[*it].name() );
2925+
classificationElement.appendChild( classificationText );
2926+
node.appendChild( classificationElement );
2927+
}
2928+
2929+
// renderer settings
2930+
const QgsRenderer * myRenderer = renderer();
2931+
if ( myRenderer )
28772932
{
2878-
errorMessage = tr( "renderer failed to save" );
2933+
if ( !myRenderer->writeXML( node, doc, *this ) )
2934+
{
2935+
errorMessage = tr( "renderer failed to save" );
2936+
return false;
2937+
}
2938+
}
2939+
else
2940+
{
2941+
QgsDebugMsg( "no renderer" );
2942+
errorMessage = tr( "no renderer" );
28792943
return false;
28802944
}
28812945
}
2946+
2947+
// add the display field
2948+
QDomElement dField = doc.createElement( "displayfield" );
2949+
QDomText dFieldText = doc.createTextNode( displayField() );
2950+
dField.appendChild( dFieldText );
2951+
node.appendChild( dField );
2952+
2953+
// add label node
2954+
QDomElement labelElem = doc.createElement( "label" );
2955+
QDomText labelText = doc.createTextNode( "" );
2956+
2957+
if ( hasLabelsEnabled() )
2958+
{
2959+
labelText.setData( "1" );
2960+
}
28822961
else
28832962
{
2884-
QgsDebugMsg( "no renderer" );
2885-
errorMessage = tr( "no renderer" );
2886-
return false;
2963+
labelText.setData( "0" );
28872964
}
2888-
}
2965+
labelElem.appendChild( labelText );
28892966

2890-
// use scale dependent visibility flag
2891-
QDomElement mapLayerNode = node.toElement();
2892-
mapLayerNode.setAttribute( "scaleBasedLabelVisibilityFlag", label()->scaleBasedVisibility() ? 1 : 0 );
2893-
mapLayerNode.setAttribute( "minLabelScale", label()->minScale() );
2894-
mapLayerNode.setAttribute( "maxLabelScale", label()->maxScale() );
2967+
node.appendChild( labelElem );
2968+
2969+
// Now we get to do all that all over again for QgsLabel
2970+
2971+
QString fieldname = mLabel->labelField( QgsLabel::Text );
2972+
if ( fieldname != "" )
2973+
{
2974+
dField = doc.createElement( "labelfield" );
2975+
dFieldText = doc.createTextNode( fieldname );
2976+
dField.appendChild( dFieldText );
2977+
node.appendChild( dField );
2978+
}
2979+
2980+
mLabel->writeXML( node, doc );
2981+
}
28952982

28962983
//edit types
28972984
if ( mEditTypes.size() > 0 )
@@ -2973,53 +3060,9 @@ bool QgsVectorLayer::writeSymbology( QDomNode& node, QDomDocument& doc, QString&
29733060
node.appendChild( aliasElem );
29743061
}
29753062

2976-
// add the display field
2977-
QDomElement dField = doc.createElement( "displayfield" );
2978-
QDomText dFieldText = doc.createTextNode( displayField() );
2979-
dField.appendChild( dFieldText );
2980-
node.appendChild( dField );
2981-
2982-
// add label node
2983-
QDomElement labelElem = doc.createElement( "label" );
2984-
QDomText labelText = doc.createTextNode( "" );
2985-
2986-
if ( hasLabelsEnabled() )
2987-
{
2988-
labelText.setData( "1" );
2989-
}
2990-
else
2991-
{
2992-
labelText.setData( "0" );
2993-
}
2994-
labelElem.appendChild( labelText );
2995-
2996-
node.appendChild( labelElem );
2997-
29983063
// add attribute actions
29993064
mActions->writeXML( node, doc );
30003065

3001-
// Now we get to do all that all over again for QgsLabel
3002-
3003-
// XXX Since this is largely a cut-n-paste from the previous, this
3004-
// XXX therefore becomes a candidate to be generalized into a separate
3005-
// XXX function. I think.
3006-
3007-
const QgsLabel *myLabel = label();
3008-
3009-
if ( myLabel )
3010-
{
3011-
QString fieldname = myLabel->labelField( QgsLabel::Text );
3012-
if ( fieldname != "" )
3013-
{
3014-
dField = doc.createElement( "labelfield" );
3015-
dFieldText = doc.createTextNode( fieldname );
3016-
dField.appendChild( dFieldText );
3017-
node.appendChild( dField );
3018-
}
3019-
3020-
myLabel->writeXML( node, doc );
3021-
}
3022-
30233066
//save vector overlays (e.g. diagrams)
30243067
QList<QgsVectorOverlay*>::const_iterator overlay_it = mOverlays.constBegin();
30253068
for ( ; overlay_it != mOverlays.constEnd(); ++overlay_it )
@@ -3036,7 +3079,7 @@ bool QgsVectorLayer::writeSymbology( QDomNode& node, QDomDocument& doc, QString&
30363079

30373080
bool QgsVectorLayer::changeGeometry( int fid, QgsGeometry* geom )
30383081
{
3039-
if ( !mEditable || !mDataProvider )
3082+
if ( !mEditable || !mDataProvider || geometryType() == QGis::NoGeometry )
30403083
{
30413084
return false;
30423085
}
@@ -3674,6 +3717,9 @@ bool QgsVectorLayer::addFeatures( QgsFeatureList features, bool makeSelected )
36743717

36753718
bool QgsVectorLayer::copySymbologySettings( const QgsMapLayer& other )
36763719
{
3720+
if ( geometryType() == QGis::NoGeometry )
3721+
return false;
3722+
36773723
const QgsVectorLayer* vl = qobject_cast<const QgsVectorLayer *>( &other );
36783724

36793725
// exit if both vectorlayer are the same
@@ -3739,6 +3785,9 @@ bool QgsVectorLayer::hasCompatibleSymbology( const QgsMapLayer& other ) const
37393785

37403786
bool QgsVectorLayer::snapPoint( QgsPoint& point, double tolerance )
37413787
{
3788+
if ( geometryType() == QGis::NoGeometry )
3789+
return false;
3790+
37423791
QMultiMap<double, QgsSnappingResult> snapResults;
37433792
int result = snapWithContext( point, tolerance, snapResults, QgsSnapper::SnapToVertex );
37443793

@@ -3763,6 +3812,9 @@ int QgsVectorLayer::snapWithContext( const QgsPoint& startPoint, double snapping
37633812
QMultiMap<double, QgsSnappingResult>& snappingResults,
37643813
QgsSnapper::SnappingType snap_to )
37653814
{
3815+
if ( geometryType() == QGis::NoGeometry )
3816+
return 1;
3817+
37663818
if ( snappingTolerance <= 0 || !mDataProvider )
37673819
{
37683820
return 1;
@@ -3869,6 +3921,9 @@ void QgsVectorLayer::snapToGeometry( const QgsPoint& startPoint, int featureId,
38693921

38703922
int QgsVectorLayer::insertSegmentVerticesForSnap( const QList<QgsSnappingResult>& snapResults )
38713923
{
3924+
if ( geometryType() == QGis::NoGeometry )
3925+
return 1;
3926+
38723927
int returnval = 0;
38733928
QgsPoint layerPoint;
38743929

@@ -4266,6 +4321,9 @@ QgsFeatureRendererV2* QgsVectorLayer::rendererV2()
42664321
}
42674322
void QgsVectorLayer::setRendererV2( QgsFeatureRendererV2* r )
42684323
{
4324+
if ( geometryType() == QGis::NoGeometry )
4325+
return;
4326+
42694327
delete mRendererV2;
42704328
mRendererV2 = r;
42714329
}
@@ -4275,6 +4333,9 @@ bool QgsVectorLayer::isUsingRendererV2()
42754333
}
42764334
void QgsVectorLayer::setUsingRendererV2( bool usingRendererV2 )
42774335
{
4336+
if ( geometryType() == QGis::NoGeometry )
4337+
return;
4338+
42784339
mUsingRendererV2 = usingRendererV2;
42794340
}
42804341

‎src/providers/ogr/qgsogrprovider.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,11 @@ bool QgsOgrProvider::nextFeature( QgsFeature& feature )
554554

555555
void QgsOgrProvider::select( QgsAttributeList fetchAttributes, QgsRectangle rect, bool fetchGeometry, bool useIntersect )
556556
{
557+
if ( geometryType() == QGis::WKBNoGeometry )
558+
{
559+
fetchGeometry = false;
560+
}
561+
557562
mUseIntersect = useIntersect;
558563
mAttributesToFetch = fetchAttributes;
559564
mFetchGeom = fetchGeometry;
@@ -748,10 +753,10 @@ bool QgsOgrProvider::addFeature( QgsFeature& f )
748753
bool returnValue = true;
749754
OGRFeatureDefnH fdef = OGR_L_GetLayerDefn( ogrLayer );
750755
OGRFeatureH feature = OGR_F_Create( fdef );
751-
unsigned char* wkb = f.geometry()->asWkb();
752756

753-
if ( f.geometry()->wkbSize() > 0 )
757+
if ( f.geometry() && f.geometry()->wkbSize() > 0 )
754758
{
759+
unsigned char* wkb = f.geometry()->asWkb();
755760
OGRGeometryH geom = NULL;
756761

757762
if ( OGR_G_CreateFromWkb( wkb, NULL, &geom, f.geometry()->wkbSize() )

0 commit comments

Comments
 (0)
Please sign in to comment.