Skip to content

Commit 1693873

Browse files
authored
Merge pull request #4782 from nirvn/shapefile_wkbtype
2 parents 18c3634 + 5b149fb commit 1693873

File tree

4 files changed

+23
-6
lines changed

4 files changed

+23
-6
lines changed

src/providers/ogr/qgsogrfeatureiterator.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "qgsmessagelog.h"
2626
#include "qgssettings.h"
2727
#include "qgsexception.h"
28+
#include "qgswkbtypes.h"
2829

2930
#include <QTextCodec>
3031
#include <QFile>
@@ -334,7 +335,15 @@ bool QgsOgrFeatureIterator::readFeature( OGRFeatureH fet, QgsFeature &feature )
334335

335336
if ( geom )
336337
{
337-
feature.setGeometry( QgsOgrUtils::ogrGeometryToQgsGeometry( geom ) );
338+
QgsGeometry g = QgsOgrUtils::ogrGeometryToQgsGeometry( geom );
339+
340+
// Insure that multipart datasets return multipart geometry
341+
if ( QgsWkbTypes::isMultiType( mSource->mWkbType ) && !g.isMultipart() )
342+
{
343+
g.convertToMultiType();
344+
}
345+
346+
feature.setGeometry( g );
338347
}
339348
else
340349
feature.clearGeometry();
@@ -390,6 +399,7 @@ QgsOgrFeatureSource::QgsOgrFeatureSource( const QgsOgrProvider *p )
390399
, mOgrGeometryTypeFilter( QgsOgrProvider::ogrWkbSingleFlatten( p->mOgrGeometryTypeFilter ) )
391400
, mDriverName( p->ogrDriverName )
392401
, mCrs( p->crs() )
402+
, mWkbType( p->wkbType() )
393403
{
394404
for ( int i = ( p->mFirstFieldIsFid ) ? 1 : 0; i < mFields.size(); i++ )
395405
mFieldsWithoutFid.append( mFields.at( i ) );

src/providers/ogr/qgsogrfeatureiterator.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class QgsOgrFeatureSource : public QgsAbstractFeatureSource
4444
OGRwkbGeometryType mOgrGeometryTypeFilter;
4545
QString mDriverName;
4646
QgsCoordinateReferenceSystem mCrs;
47+
QgsWkbTypes::Type mWkbType = QgsWkbTypes::Unknown;
4748

4849
friend class QgsOgrFeatureIterator;
4950
friend class QgsOgrExpressionCompiler;

src/providers/ogr/qgsogrprovider.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ email : sherman at mrcc.com
3030
#include "qgsgeometry.h"
3131
#include "qgscoordinatereferencesystem.h"
3232
#include "qgsvectorlayerexporter.h"
33+
#include "qgswkbtypes.h"
3334
#include "qgis.h"
3435

3536

@@ -1175,7 +1176,12 @@ size_t QgsOgrProvider::layerCount() const
11751176
*/
11761177
QgsWkbTypes::Type QgsOgrProvider::wkbType() const
11771178
{
1178-
return static_cast<QgsWkbTypes::Type>( mOGRGeomType );
1179+
QgsWkbTypes::Type wkb = static_cast<QgsWkbTypes::Type>( mOGRGeomType );
1180+
if ( ogrDriverName == QLatin1String( "ESRI Shapefile" ) && ( wkb == QgsWkbTypes::LineString || wkb == QgsWkbTypes::Polygon ) )
1181+
{
1182+
wkb = QgsWkbTypes::multiType( wkb );
1183+
}
1184+
return wkb;
11791185
}
11801186

11811187
/**

tests/src/python/test_provider_virtual.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ def test_Query(self):
181181
# the same, without specifying the geometry column name
182182
l2 = QgsVectorLayer("?layer_ref=%s&query=%s&uid=OBJECTID" % (l1.id(), query), "vtab", "virtual", False)
183183
self.assertEqual(l2.isValid(), True)
184-
self.assertEqual(l2.dataProvider().wkbType(), 3)
184+
self.assertEqual(l2.dataProvider().wkbType(), 6)
185185
ref_sum2 = sum(f.attributes()[0] for f in l2.getFeatures())
186186
ref_sum3 = sum(f.id() for f in l2.getFeatures())
187187
# check we have the same rows
@@ -204,7 +204,7 @@ def test_Query(self):
204204
# with two geometry columns, but no geometry column specified (will take the first)
205205
l2 = QgsVectorLayer("?layer_ref=%s&query=%s&uid=OBJECTID" % (l1.id(), query), "vtab", "virtual", False)
206206
self.assertEqual(l2.isValid(), True)
207-
self.assertEqual(l2.dataProvider().wkbType(), 3)
207+
self.assertEqual(l2.dataProvider().wkbType(), 6)
208208
ref_sum2 = sum(f.attributes()[0] for f in l2.getFeatures())
209209
ref_sum3 = sum(f.id() for f in l2.getFeatures())
210210
# check we have the same rows
@@ -343,7 +343,7 @@ def test_reopen(self):
343343

344344
l2 = QgsVectorLayer(tmp, "tt", "virtual", False)
345345
self.assertEqual(l2.isValid(), True)
346-
self.assertEqual(l2.dataProvider().wkbType(), 3)
346+
self.assertEqual(l2.dataProvider().wkbType(), 6)
347347
self.assertEqual(l2.dataProvider().featureCount(), 4)
348348

349349
def test_reopen2(self):
@@ -448,7 +448,7 @@ def test_sql2(self):
448448
l4 = QgsVectorLayer("?query=%s&uid=ObjectId" % query, "tt", "virtual")
449449
self.assertEqual(l4.isValid(), True)
450450

451-
self.assertEqual(l4.dataProvider().wkbType(), 3)
451+
self.assertEqual(l4.dataProvider().wkbType(), 6)
452452
self.assertEqual(l4.dataProvider().crs().postgisSrid(), 4326)
453453

454454
n = 0

0 commit comments

Comments
 (0)