QgsRenderContext QgsRenderContext::fromMapSettings( const QgsMapSettings &mapSettings ) { QgsRenderContext ctx; ctx.setMapToPixel( mapSettings.mapToPixel() ); ctx.setExtent( mapSettings.visibleExtent() ); ctx.setFlag( DrawEditingInfo, mapSettings.testFlag( QgsMapSettings::DrawEditingInfo ) ); ctx.setFlag( ForceVectorOutput, mapSettings.testFlag( QgsMapSettings::ForceVectorOutput ) ); ctx.setFlag( UseAdvancedEffects, mapSettings.testFlag( QgsMapSettings::UseAdvancedEffects ) ); ctx.setFlag( UseRenderingOptimization, mapSettings.testFlag( QgsMapSettings::UseRenderingOptimization ) ); ctx.setCoordinateTransform( QgsCoordinateTransform() ); ctx.setSelectionColor( mapSettings.selectionColor() ); ctx.setFlag( DrawSelection, mapSettings.testFlag( QgsMapSettings::DrawSelection ) ); ctx.setFlag( DrawSymbolBounds, mapSettings.testFlag( QgsMapSettings::DrawSymbolBounds ) ); ctx.setFlag( RenderMapTile, mapSettings.testFlag( QgsMapSettings::RenderMapTile ) ); ctx.setFlag( Antialiasing, mapSettings.testFlag( QgsMapSettings::Antialiasing ) ); ctx.setFlag( RenderPartialOutput, mapSettings.testFlag( QgsMapSettings::RenderPartialOutput ) ); ctx.setScaleFactor( mapSettings.outputDpi() / 25.4 ); // = pixels per mm ctx.setRendererScale( mapSettings.scale() ); ctx.setExpressionContext( mapSettings.expressionContext() ); ctx.setSegmentationTolerance( mapSettings.segmentationTolerance() ); ctx.setSegmentationToleranceType( mapSettings.segmentationToleranceType() ); ctx.mDistanceArea.setSourceCrs( mapSettings.destinationCrs() ); ctx.mDistanceArea.setEllipsoid( mapSettings.ellipsoid() ); //this flag is only for stopping during the current rendering progress, //so must be false at every new render operation ctx.setRenderingStopped( false ); return ctx; }
QgsRenderContext QgsRenderContext::fromMapSettings( const QgsMapSettings& mapSettings ) { QgsRenderContext ctx; ctx.setMapToPixel( mapSettings.mapToPixel() ); ctx.setExtent( mapSettings.visibleExtent() ); ctx.setFlag( DrawEditingInfo, mapSettings.testFlag( QgsMapSettings::DrawEditingInfo ) ); ctx.setFlag( ForceVectorOutput, mapSettings.testFlag( QgsMapSettings::ForceVectorOutput ) ); ctx.setFlag( UseAdvancedEffects, mapSettings.testFlag( QgsMapSettings::UseAdvancedEffects ) ); ctx.setFlag( UseRenderingOptimization, mapSettings.testFlag( QgsMapSettings::UseRenderingOptimization ) ); ctx.setCoordinateTransform( nullptr ); ctx.setSelectionColor( mapSettings.selectionColor() ); ctx.setFlag( DrawSelection, mapSettings.testFlag( QgsMapSettings::DrawSelection ) ); ctx.setFlag( DrawSymbolBounds, mapSettings.testFlag( QgsMapSettings::DrawSymbolBounds ) ); ctx.setFlag( RenderMapTile, mapSettings.testFlag( QgsMapSettings::RenderMapTile ) ); ctx.setRasterScaleFactor( 1.0 ); ctx.setScaleFactor( mapSettings.outputDpi() / 25.4 ); // = pixels per mm ctx.setRendererScale( mapSettings.scale() ); ctx.setExpressionContext( mapSettings.expressionContext() ); //this flag is only for stopping during the current rendering progress, //so must be false at every new render operation ctx.setRenderingStopped( false ); return ctx; }
QgsRectangle QgsMapCanvas::imageRect( const QImage& img, const QgsMapSettings& mapSettings ) { // This is a hack to pass QgsMapCanvasItem::setRect what it // expects (encoding of position and size of the item) const QgsMapToPixel& m2p = mapSettings.mapToPixel(); QgsPoint topLeft = m2p.toMapPoint( 0, 0 ); double res = m2p.mapUnitsPerPixel(); QgsRectangle rect( topLeft.x(), topLeft.y(), topLeft.x() + img.width()*res, topLeft.y() - img.height()*res ); return rect; }
int QgsDecorationGrid::yGridLines( const QgsMapSettings &mapSettings, QList< QPair< qreal, QLineF > > &lines ) const { // prepare vertical lines lines.clear(); if ( mGridIntervalX <= 0.0 ) { return 1; } const QgsMapToPixel &m2p = mapSettings.mapToPixel(); // draw nothing if the distance between grid lines would be less than 1px // otherwise the grid lines would completely cover the whole map //if ( mapBoundingRect.height() / mGridIntervalY >= p->device()->height() ) if ( mGridIntervalX / mapSettings.mapUnitsPerPixel() < 1 ) return 1; const QPolygonF &canvasPoly = canvasPolygon( mapSettings ); const QPolygonF &mapPolygon = canvasExtent( mapSettings ); QLineF lineSouth( mapPolygon[3], mapPolygon[2] ); QLineF lineNorth( mapPolygon[0], mapPolygon[1] ); double len = lineSouth.length(); Q_ASSERT( std::fabs( len - lineNorth.length() ) < 1e-6 ); // no shear const QRectF &mapBoundingRect = mapPolygon.boundingRect(); double roundCorrection = mapBoundingRect.left() > 0 ? 1.0 : 0.0; double dist = static_cast< int >( ( mapBoundingRect.left() - mGridOffsetX ) / mGridIntervalX + roundCorrection ) * mGridIntervalX + mGridOffsetX; dist = dist - mapBoundingRect.left(); while ( dist < len ) { double t = dist / len; QPointF p0( lineNorth.pointAt( t ) ); QPointF p1( lineSouth.pointAt( t ) ); QLineF line( p0, p1 ); clipByRect( line, canvasPoly ); line = QLineF( m2p.transform( QgsPointXY( line.pointAt( 0 ) ) ).toQPointF(), m2p.transform( QgsPointXY( line.pointAt( 1 ) ) ).toQPointF() ); lines.push_back( qMakePair( p0.x(), line ) ); dist += mGridIntervalX; } return 0; }
static QgsQuickFeatureLayerPair _closestFeature( const QgsQuickFeatureLayerPairs &results, const QgsMapSettings &mapSettings, const QPointF &point ) { QgsPointXY mapPoint = mapSettings.mapToPixel().toMapCoordinates( point.toPoint() ); QgsGeometry mapPointGeom( QgsGeometry::fromPointXY( mapPoint ) ); double distMin = 1e10; int iMin = -1; for ( int i = 0; i < results.count(); ++i ) { const QgsQuickFeatureLayerPair &res = results.at( i ); QgsGeometry geom( res.feature().geometry() ); try { geom.transform( mapSettings.layerTransform( res.layer() ) ); } catch ( QgsCsException &e ) { Q_UNUSED( e ); // Caught an error in transform continue; } double dist = geom.distance( mapPointGeom ); if ( dist < distMin ) { iMin = i; distMin = dist; } } if ( results.empty() ) { return QgsQuickFeatureLayerPair(); } else { return results.at( iMin ); } }
QgsPoint QgsTolerance::toLayerCoordinates( QgsMapLayer* layer, const QgsMapSettings& mapSettings, QPoint point ) { QgsPoint pt = mapSettings.mapToPixel().toMapCoordinates( point ); return mapSettings.mapToLayerCoordinates( layer, pt ); }