Expand Up
@@ -77,6 +77,7 @@ QgsDelimitedTextProvider::QgsDelimitedTextProvider( QString uri )
QString wktField;
QString xField;
QString yField;
QString subset;
if ( url.hasQueryItem ( " geomType" ) )
{
Expand Down
Expand Up
@@ -121,6 +122,12 @@ QgsDelimitedTextProvider::QgsDelimitedTextProvider( QString uri )
QgsDebugMsg ( " xField is: " + xField );
QgsDebugMsg ( " yField is: " + yField );
if ( url.hasQueryItem ( " subset" ))
{
subset = url.queryItemValue (" subset" );
QgsDebugMsg ( " subset is: " + subset );
}
if ( url.hasQueryItem ( " quiet" ) ) mShowInvalidLines = false ;
// assume the layer is invalid until proven otherwise
Expand Down
Expand Up
@@ -390,6 +397,11 @@ QgsDelimitedTextProvider::QgsDelimitedTextProvider( QString uri )
reportErrors ( warnings );
mValid = mGeometryType != QGis::UnknownGeometry;
if ( ! subset.isEmpty ())
{
setSubsetString ( subset );
}
}
Expand Down
Expand Up
@@ -559,7 +571,6 @@ void QgsDelimitedTextProvider::reportErrors( QStringList messages )
QgsMessageLog::logMessage ( tr ( " There are %1 additional errors in the file" ).arg ( mNExtraInvalidLines ), tag );
}
// Display errors in a dialog...
if ( mShowInvalidLines )
{
Expand Down
Expand Up
@@ -587,6 +598,204 @@ void QgsDelimitedTextProvider::reportErrors( QStringList messages )
}
void QgsDelimitedTextProvider::resetDataSummary ()
{
QgsFeatureIterator fi = getFeatures (QgsFeatureRequest ());
mNumberFeatures = 0 ;
mExtent = QgsRectangle ();
QgsFeature f;
while ( fi.nextFeature (f))
{
if ( mGeometryType != QGis::NoGeometry )
{
if ( mNumberFeatures == 0 )
{
mExtent = f.geometry ()->boundingBox ();
}
else
{
QgsRectangle bbox ( f.geometry ()->boundingBox ());
mExtent .combineExtentWith ( &bbox);
}
}
mNumberFeatures ++;
}
}
bool QgsDelimitedTextProvider::nextFeature ( QgsFeature& feature, QgsDelimitedTextFile *file, const QgsFeatureRequest& request )
{
QStringList tokens;
while ( true )
{
// before we do anything else, assume that there's something wrong with
// the feature
feature.setValid ( false );
QgsDelimitedTextFile::Status status = file->nextRecord ( tokens );
if ( status == QgsDelimitedTextFile::RecordEOF ) break ;
if ( status != QgsDelimitedTextFile::RecordOk ) continue ;
int fid = file->recordLineNumber ();
if ( request.filterType () == QgsFeatureRequest::FilterFid && fid != request.filterFid ()) continue ;
if ( recordIsEmpty ( tokens ) ) continue ;
while ( tokens.size () < mFieldCount )
tokens.append ( QString::null );
QgsGeometry *geom = 0 ;
if ( mWktFieldIndex >= 0 )
{
geom = loadGeometryWkt ( tokens, request );
}
else if ( mXFieldIndex >= 0 && mYFieldIndex >= 0 )
{
geom = loadGeometryXY ( tokens,request );
}
if ( !geom && mWkbType != QGis::WKBNoGeometry )
{
// Already dealt with invalid lines in provider - no need to repeat
// removed code (CC 2013-04-13) ...
// mInvalidLines << line;
// In any case it may be a valid line that is excluded because of
// bounds check...
continue ;
}
// At this point the current feature values are valid
feature.setValid ( true );
feature.setFields ( &attributeFields ); // allow name-based attribute lookups
feature.setFeatureId ( fid );
feature.initAttributes ( attributeFields.count () );
if ( geom )
feature.setGeometry ( geom );
if ( request.flags () & QgsFeatureRequest::SubsetOfAttributes )
{
const QgsAttributeList& attrs = request.subsetOfAttributes ();
for ( QgsAttributeList::const_iterator i = attrs.begin (); i != attrs.end (); ++i )
{
int fieldIdx = *i;
fetchAttribute ( feature, fieldIdx, tokens );
}
}
else
{
for ( int idx = 0 ; idx < attributeFields.count (); ++idx )
fetchAttribute ( feature, idx, tokens );
}
// We have a good line, so return
return true ;
} // !mStream->atEnd()
return false ;
}
QgsGeometry* QgsDelimitedTextProvider::loadGeometryWkt ( const QStringList& tokens, const QgsFeatureRequest& request )
{
QgsGeometry* geom = 0 ;
QString sWkt = tokens[mWktFieldIndex ];
geom = geomFromWkt ( sWkt );
if ( geom && geom->type () != mGeometryType )
{
delete geom;
geom = 0 ;
}
if ( geom && !boundsCheck ( geom, request ) )
{
delete geom;
geom = 0 ;
}
return geom;
}
QgsGeometry* QgsDelimitedTextProvider::loadGeometryXY ( const QStringList& tokens, const QgsFeatureRequest& request )
{
QString sX = tokens[mXFieldIndex ];
QString sY = tokens[mYFieldIndex ];
QgsPoint pt;
bool ok = pointFromXY ( sX , sY , pt );
if ( ok && boundsCheck ( pt, request ) )
{
return QgsGeometry::fromPoint ( pt );
}
return 0 ;
}
/* *
* Check to see if the point is within the selection rectangle
*/
bool QgsDelimitedTextProvider::boundsCheck ( const QgsPoint &pt, const QgsFeatureRequest& request )
{
// no selection rectangle or geometry => always in the bounds
if ( request.filterType () != QgsFeatureRequest::FilterRect || ( request.flags () & QgsFeatureRequest::NoGeometry ) )
return true ;
return request.filterRect ().contains ( pt );
}
/* *
* Check to see if the geometry is within the selection rectangle
*/
bool QgsDelimitedTextProvider::boundsCheck ( QgsGeometry *geom, const QgsFeatureRequest& request )
{
// no selection rectangle or geometry => always in the bounds
if ( request.filterType () != QgsFeatureRequest::FilterRect || ( request.flags () & QgsFeatureRequest::NoGeometry ) )
return true ;
if ( request.flags () & QgsFeatureRequest::ExactIntersect )
return geom->intersects ( request.filterRect () );
else
return geom->boundingBox ().intersects ( request.filterRect () );
}
void QgsDelimitedTextProvider::fetchAttribute ( QgsFeature& feature, int fieldIdx, const QStringList& tokens )
{
if ( fieldIdx < 0 || fieldIdx >= attributeColumns.count ()) return ;
int column = attributeColumns[fieldIdx];
if ( column < 0 || column >= tokens.count ()) return ;
const QString &value = tokens[column];
QVariant val;
switch ( attributeFields[fieldIdx].type () )
{
case QVariant::Int:
if ( value.isEmpty () )
val = QVariant ( attributeFields[fieldIdx].type () );
else
val = QVariant ( value );
break ;
case QVariant::Double:
if ( value.isEmpty () )
{
val = QVariant ( attributeFields[fieldIdx].type () );
}
else if ( mDecimalPoint .isEmpty () )
{
val = QVariant ( value.toDouble () );
}
else
{
val = QVariant ( QString ( value ).replace ( mDecimalPoint , " ." ).toDouble () );
}
break ;
default :
val = QVariant ( value );
break ;
}
feature.setAttribute ( fieldIdx, val );
}
// Return the extent of the layer
QgsRectangle QgsDelimitedTextProvider::extent ()
Expand Down