Skip to content

Commit

Permalink
Fix delimited text layers set to unknown geometry type if first row has
Browse files Browse the repository at this point in the history
null geometry (fix #13749)

(cherry-picked from 7439643)
  • Loading branch information
nyalldawson committed Nov 18, 2015
1 parent 0e0f473 commit 54f13a6
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 5 deletions.
11 changes: 8 additions & 3 deletions src/providers/delimitedtext/qgsdelimitedtextprovider.cpp
Expand Up @@ -409,6 +409,7 @@ void QgsDelimitedTextProvider::scanFile( bool buildIndexes )
QList<bool> couldBeInt;
QList<bool> couldBeLongLong;
QList<bool> couldBeDouble;
bool foundFirstGeometry = false;

while ( true )
{
Expand Down Expand Up @@ -458,11 +459,12 @@ void QgsDelimitedTextProvider::scanFile( bool buildIndexes )
if ( mGeometryType == QGis::UnknownGeometry || geom->type() == mGeometryType )
{
mGeometryType = geom->type();
if ( mNumberFeatures == 0 )
if ( !foundFirstGeometry )
{
mNumberFeatures++;
mWkbType = type;
mExtent = geom->boundingBox();
foundFirstGeometry = true;
}
else
{
Expand Down Expand Up @@ -517,7 +519,7 @@ void QgsDelimitedTextProvider::scanFile( bool buildIndexes )

if ( ok )
{
if ( mNumberFeatures > 0 )
if ( foundFirstGeometry )
{
mExtent.combineExtentWith( pt.x(), pt.y() );
}
Expand All @@ -527,6 +529,7 @@ void QgsDelimitedTextProvider::scanFile( bool buildIndexes )
mExtent.set( pt.x(), pt.y(), pt.x(), pt.y() );
mWkbType = QGis::WKBPoint;
mGeometryType = QGis::Point;
foundFirstGeometry = true;
}
mNumberFeatures++;
if ( buildSpatialIndex && qIsFinite( pt.x() ) && qIsFinite( pt.y() ) )
Expand Down Expand Up @@ -778,13 +781,15 @@ void QgsDelimitedTextProvider::rescanFile()
mNumberFeatures = 0;
mExtent = QgsRectangle();
QgsFeature f;
bool foundFirstGeometry = false;
while ( fi.nextFeature( f ) )
{
if ( mGeometryType != QGis::NoGeometry )
{
if ( mNumberFeatures == 0 )
if ( !foundFirstGeometry )
{
mExtent = f.constGeometry()->boundingBox();
foundFirstGeometry = true;
}
else
{
Expand Down
18 changes: 16 additions & 2 deletions tests/src/python/test_qgsdelimitedtextprovider.py
Expand Up @@ -43,7 +43,8 @@
QgsVectorLayer,
QgsFeatureRequest,
QgsRectangle,
QgsMessageLog
QgsMessageLog,
QGis
)

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


def printWanted(testname, result):
Expand All @@ -206,6 +207,7 @@ def printWanted(testname, result):
print prefix + "wanted={}"
print prefix + "wanted['uri']=" + repr(result['uri'])
print prefix + "wanted['fieldTypes']=" + repr(result['fieldTypes'])
print prefix + "wanted['geometryType']=" + repr(result['geometryType'])
print prefix + "wanted['data']={"
for k in sorted(data.keys()):
row = data[k]
Expand Down Expand Up @@ -272,6 +274,10 @@ def runTest(file, requests, **params):
msg = "Layer field types ({0}) doesn't match expected ({1})".format(
result['fieldTypes'], wanted['fieldTypes'])
failures.append(msg)
if result['geometryType'] != wanted['geometryType']:
msg = "Layer geometry type ({0}) doesn't match expected ({1})".format(
result['geometryType'], wanted['geometryType'])
failures.append(msg)
wanted_data = wanted['data']
for id in sorted(wanted_data.keys()):
wrec = wanted_data[id]
Expand Down Expand Up @@ -728,5 +734,13 @@ def test_038_type_inference(self):
requests = None
runTest(filename, requests, **params)

def test_039_issue_13749(self):
# First record contains missing geometry
filename = 'test13749.csv'
params = {'yField': 'geom_y', 'xField': 'geom_x', 'type': 'csv'}
requests = None
runTest(filename, requests, **params)


if __name__ == '__main__':
unittest.main()

0 comments on commit 54f13a6

Please sign in to comment.