Bug report #15829
georeferencer - logical error during loadGCPs
| Status: | Closed | ||
|---|---|---|---|
| Priority: | High | ||
| Assignee: | - | ||
| Category: | C++ plugins/Georeferencer | ||
| Affected QGIS version: | 2.18.0 | Regression?: | No |
| Operating System: | Easy fix?: | No | |
| Pull Request or Patch supplied: | No | Resolution: | |
| Crashes QGIS or corrupts data: | No | Copied to github as #: | 23749 |
Description
While working on the georeferencer, I have noticed a logical error during the function 'loadGCPs'.
When the .points file is being read, after reading each point, the function 'addPoint' is called.
'addPoint'
- creates a new QgsGeorefDataPoint
- creates a SIGNAL for the QgsGeorefDataPoint
- appends it to 'mPoints'
and then calls mGCPListWidget->setGCPList( &mPoints );
which will (re-)build the QTableView with any needed calculations.
In a case where there are 892 points
- 'setGCPList' is called 892 times and takes a good minute to load
When this is corrected to call 'setGCPList' after the building of 'mPoints' has been completed
- the loading takes a few seconds, since the QTableView is only being build once
Since the QTableView is not needed during the reading of the .points file
- 'setGCPList' should only be called once
Associated revisions
Fix #15829 georeferencer - resolve logical error during loadGCPs
History
#1
Updated by Mark Johnson almost 9 years ago
This could then be something in the form of:
bool QgsGeorefPluginGui::loadGCPs( /*bool verbose*/ )
{
QFile pointFile( mGCPpointsFileName );
if ( !pointFile.open( QIODevice::ReadOnly ) )
{
return false;
}
clearGCPData();
QTextStream points( &pointFile );
QString line = points.readLine();
while ( !points.atEnd() )
{
...
QgsPoint mapCoords( ls.at( 0 ).toDouble(), ls.at( 1 ).toDouble() ); // map x,y
QgsPoint pixelCoords( ls.at( 2 ).toDouble(), ls.at( 3 ).toDouble() ); // pixel x,y
QgsGeorefDataPoint* pnt;
if ( ls.count() == 5 )
{
bool enable = ls.at( 4 ).toInt();
pnt = new QgsGeorefDataPoint( mCanvas, mIface->mapCanvas(), pixelCoords, mapCoords, enable);
}
else
pnt = new QgsGeorefDataPoint( mCanvas, mIface->mapCanvas(), pixelCoords, mapCoords,true);
mPoints.append( pnt );
connect( mCanvas, SIGNAL( extentsChanged() ), pnt, SLOT( updateCoords() ) );
++i;
}
mInitialPoints = mPoints;
mGCPsDirty = true;
}
if ( mGCPsDirty )
{
mGCPListWidget->setGCPList( &mPoints );
updateGeorefTransform();
mCanvas->refresh();
mIface->mapCanvas()->refresh();
}
return true;
}
#2
Updated by Nyall Dawson almost 9 years ago
Mark - this looks good! Could you submit this as a pull request to the QGIS Github repo (https://github.com/qgis/QGIS)? That's the usual approach to get changes like this merged in.
#3
Updated by Mark Johnson almost 9 years ago
Done, see:
https://github.com/qgis/QGIS/pull/3754
please see the notes of the pull, since other files diff have been included.
#4
Updated by Mark Johnson almost 9 years ago
- Status changed from Open to Closed
Fixed in changeset 59a0e2fb886fc0bcf620c860bba85d3863c46b73.