Skip to content

Commit 7439643

Browse files
committed
Fix delimited text layers set to unknown geometry type if first row has
null geometry (fix #13749)
1 parent 6a1d206 commit 7439643

File tree

4 files changed

+112
-5
lines changed

4 files changed

+112
-5
lines changed

src/providers/delimitedtext/qgsdelimitedtextprovider.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,7 @@ void QgsDelimitedTextProvider::scanFile( bool buildIndexes )
409409
QList<bool> couldBeInt;
410410
QList<bool> couldBeLongLong;
411411
QList<bool> couldBeDouble;
412+
bool foundFirstGeometry = false;
412413

413414
while ( true )
414415
{
@@ -458,11 +459,12 @@ void QgsDelimitedTextProvider::scanFile( bool buildIndexes )
458459
if ( mGeometryType == QGis::UnknownGeometry || geom->type() == mGeometryType )
459460
{
460461
mGeometryType = geom->type();
461-
if ( mNumberFeatures == 0 )
462+
if ( !foundFirstGeometry )
462463
{
463464
mNumberFeatures++;
464465
mWkbType = type;
465466
mExtent = geom->boundingBox();
467+
foundFirstGeometry = true;
466468
}
467469
else
468470
{
@@ -517,7 +519,7 @@ void QgsDelimitedTextProvider::scanFile( bool buildIndexes )
517519

518520
if ( ok )
519521
{
520-
if ( mNumberFeatures > 0 )
522+
if ( foundFirstGeometry )
521523
{
522524
mExtent.combineExtentWith( pt.x(), pt.y() );
523525
}
@@ -527,6 +529,7 @@ void QgsDelimitedTextProvider::scanFile( bool buildIndexes )
527529
mExtent.set( pt.x(), pt.y(), pt.x(), pt.y() );
528530
mWkbType = QGis::WKBPoint;
529531
mGeometryType = QGis::Point;
532+
foundFirstGeometry = true;
530533
}
531534
mNumberFeatures++;
532535
if ( buildSpatialIndex && qIsFinite( pt.x() ) && qIsFinite( pt.y() ) )
@@ -778,13 +781,15 @@ void QgsDelimitedTextProvider::rescanFile()
778781
mNumberFeatures = 0;
779782
mExtent = QgsRectangle();
780783
QgsFeature f;
784+
bool foundFirstGeometry = false;
781785
while ( fi.nextFeature( f ) )
782786
{
783787
if ( mGeometryType != QGis::NoGeometry )
784788
{
785-
if ( mNumberFeatures == 0 )
789+
if ( !foundFirstGeometry )
786790
{
787791
mExtent = f.constGeometry()->boundingBox();
792+
foundFirstGeometry = true;
788793
}
789794
else
790795
{

tests/src/python/test_qgsdelimitedtextprovider.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@
4343
QgsVectorLayer,
4444
QgsFeatureRequest,
4545
QgsRectangle,
46-
QgsMessageLog
46+
QgsMessageLog,
47+
QGis
4748
)
4849

4950
from utilities import (getQgisTestApp,
@@ -190,7 +191,7 @@ def delimitedTextData(testname, filename, requests, verbose, **params):
190191
msg = re.sub(r'file\s+.*' + re.escape(filename), 'file ' + filelogname, msg)
191192
msg = msg.replace(filepath, filelogname)
192193
log.append(msg)
193-
return dict(fields=fields, fieldTypes=fieldTypes, data=data, log=log, uri=uri)
194+
return dict(fields=fields, fieldTypes=fieldTypes, data=data, log=log, uri=uri, geometryType=layer.geometryType())
194195

195196

196197
def printWanted(testname, result):
@@ -206,6 +207,7 @@ def printWanted(testname, result):
206207
print prefix + "wanted={}"
207208
print prefix + "wanted['uri']=" + repr(result['uri'])
208209
print prefix + "wanted['fieldTypes']=" + repr(result['fieldTypes'])
210+
print prefix + "wanted['geometryType']=" + repr(result['geometryType'])
209211
print prefix + "wanted['data']={"
210212
for k in sorted(data.keys()):
211213
row = data[k]
@@ -272,6 +274,10 @@ def runTest(file, requests, **params):
272274
msg = "Layer field types ({0}) doesn't match expected ({1})".format(
273275
result['fieldTypes'], wanted['fieldTypes'])
274276
failures.append(msg)
277+
if result['geometryType'] != wanted['geometryType']:
278+
msg = "Layer geometry type ({0}) doesn't match expected ({1})".format(
279+
result['geometryType'], wanted['geometryType'])
280+
failures.append(msg)
275281
wanted_data = wanted['data']
276282
for id in sorted(wanted_data.keys()):
277283
wrec = wanted_data[id]
@@ -728,5 +734,13 @@ def test_038_type_inference(self):
728734
requests = None
729735
runTest(filename, requests, **params)
730736

737+
def test_039_issue_13749(self):
738+
# First record contains missing geometry
739+
filename = 'test13749.csv'
740+
params = {'yField': 'geom_y', 'xField': 'geom_x', 'type': 'csv'}
741+
requests = None
742+
runTest(filename, requests, **params)
743+
744+
731745
if __name__ == '__main__':
732746
unittest.main()

0 commit comments

Comments
 (0)