diff --git a/src/core/qgsvectorlayer.cpp b/src/core/qgsvectorlayer.cpp index 529f5a99b65c..dbeb5ff35189 100644 --- a/src/core/qgsvectorlayer.cpp +++ b/src/core/qgsvectorlayer.cpp @@ -1707,7 +1707,7 @@ int QgsVectorLayer::translateFeature( int featureId, double dx, double dy ) } } - //else, if must be contained in mCachedGeometries + //else look in mCachedGeometries to make access faster QgsGeometryMap::iterator cachedIt = mCachedGeometries.find( featureId ); if ( cachedIt != mCachedGeometries.end() ) { @@ -1719,6 +1719,23 @@ int QgsVectorLayer::translateFeature( int featureId, double dx, double dy ) } return errorCode; } + + //else get the geometry from provider (may be slow) + QgsFeature f; + if(mDataProvider && mDataProvider->featureAtId(featureId, f, true)) + { + if(f.geometry()) + { + QgsGeometry translateGeom(*(f.geometry())); + int errorCode = translateGeom.translate(dx, dy); + if(errorCode == 0) + { + mChangedGeometries.insert(featureId, translateGeom); + setModified(true, true); + } + return errorCode; + } + } return 1; //geometry not found } diff --git a/src/providers/ogr/qgsogrprovider.cpp b/src/providers/ogr/qgsogrprovider.cpp index 1db59a3d5e1d..79f8c171ecc7 100644 --- a/src/providers/ogr/qgsogrprovider.cpp +++ b/src/providers/ogr/qgsogrprovider.cpp @@ -337,6 +337,8 @@ bool QgsOgrProvider::featureAtId( int featureId, getFeatureAttribute( fet, feature, *it ); } + OGR_F_Destroy( fet ); + feature.setValid( true ); return true; }