Ejemplo n.º 1
0
void QgsWfsProjectParser::featureTypeList( QDomElement& parentElement, QDomDocument& doc ) const
{
    const QList<QDomElement>& projectLayerElements = mProjectParser->projectLayerElements();
    if ( projectLayerElements.size() < 1 )
    {
        return;
    }

    QStringList wfsLayersId = mProjectParser->wfsLayers();
    QSet<QString> wfstUpdateLayersId = wfstUpdateLayers();
    QSet<QString> wfstInsertLayersId = wfstInsertLayers();
    QSet<QString> wfstDeleteLayersId = wfstDeleteLayers();

    QMap<QString, QgsMapLayer *> layerMap;

    Q_FOREACH ( const QDomElement &elem, projectLayerElements )
    {
        QString type = elem.attribute( QStringLiteral( "type" ) );
        if ( type == QLatin1String( "vector" ) )
        {
            QString layerId = mProjectParser->layerId( elem );
            if ( !wfsLayersId.contains( layerId ) )
            {
                continue;
            }
            QgsMapLayer *layer = mProjectParser->createLayerFromElement( elem );
            if ( !layer )
            {
                continue;
            }
#ifdef HAVE_SERVER_PYTHON_PLUGINS
            if ( !mAccessControl->layerReadPermission( layer ) )
            {
                continue;
            }
#endif
            QgsDebugMsg( QString( "add layer %1 to map" ).arg( layer->id() ) );
            layerMap.insert( layer->id(), layer );

            QDomElement layerElem = doc.createElement( QStringLiteral( "FeatureType" ) );
            QDomElement nameElem = doc.createElement( QStringLiteral( "Name" ) );
            //We use the layer name even though it might not be unique.
            //Because the id sometimes contains user/pw information and the name is more descriptive
            QString typeName = layer->name();
            if ( !layer->shortName().isEmpty() )
                typeName = layer->shortName();
            typeName = typeName.replace( QLatin1String( " " ), QLatin1String( "_" ) );
            QDomText nameText = doc.createTextNode( typeName );
            nameElem.appendChild( nameText );
            layerElem.appendChild( nameElem );

            QDomElement titleElem = doc.createElement( QStringLiteral( "Title" ) );
            QString titleName = layer->title();
            if ( titleName.isEmpty() )
            {
                titleName = layer->name();
            }
            QDomText titleText = doc.createTextNode( titleName );
            titleElem.appendChild( titleText );
            layerElem.appendChild( titleElem );

            QDomElement abstractElem = doc.createElement( QStringLiteral( "Abstract" ) );
            QString abstractName = layer->abstract();
            if ( abstractName.isEmpty() )
            {
                abstractName = QLatin1String( "" );
            }
            QDomText abstractText = doc.createTextNode( abstractName );
            abstractElem.appendChild( abstractText );
            layerElem.appendChild( abstractElem );

            //keyword list
            if ( !layer->keywordList().isEmpty() )
            {
                QDomElement keywordsElem = doc.createElement( QStringLiteral( "Keywords" ) );
                QDomText keywordsText = doc.createTextNode( layer->keywordList() );
                keywordsElem.appendChild( keywordsText );
                layerElem.appendChild( keywordsElem );
            }

            //appendExGeographicBoundingBox( layerElem, doc, layer->extent(), layer->crs() );

            QDomElement srsElem = doc.createElement( QStringLiteral( "SRS" ) );
            QDomText srsText = doc.createTextNode( layer->crs().authid() );
            srsElem.appendChild( srsText );
            layerElem.appendChild( srsElem );

            //wfs:Operations element
            QDomElement operationsElement = doc.createElement( QStringLiteral( "Operations" )/*wfs:Operations*/ );
            //wfs:Query element
            QDomElement queryElement = doc.createElement( QStringLiteral( "Query" )/*wfs:Query*/ );
            operationsElement.appendChild( queryElement );

            QgsVectorLayer* vlayer = qobject_cast<QgsVectorLayer*>( layer );
            QgsVectorDataProvider* provider = vlayer->dataProvider();
            if (( provider->capabilities() & QgsVectorDataProvider::AddFeatures ) && wfstInsertLayersId.contains( layer->id() ) )
            {
                //wfs:Insert element
                QDomElement insertElement = doc.createElement( QStringLiteral( "Insert" )/*wfs:Insert*/ );
                operationsElement.appendChild( insertElement );
            }
            if (( provider->capabilities() & QgsVectorDataProvider::ChangeAttributeValues ) &&
                    ( provider->capabilities() & QgsVectorDataProvider::ChangeGeometries ) &&
                    wfstUpdateLayersId.contains( layer->id() ) )
            {
                //wfs:Update element
                QDomElement updateElement = doc.createElement( QStringLiteral( "Update" )/*wfs:Update*/ );
                operationsElement.appendChild( updateElement );
            }
            if (( provider->capabilities() & QgsVectorDataProvider::DeleteFeatures ) && wfstDeleteLayersId.contains( layer->id() ) )
            {
                //wfs:Delete element
                QDomElement deleteElement = doc.createElement( QStringLiteral( "Delete" )/*wfs:Delete*/ );
                operationsElement.appendChild( deleteElement );
            }

            layerElem.appendChild( operationsElement );

            QgsRectangle layerExtent = layer->extent();
            QDomElement bBoxElement = doc.createElement( QStringLiteral( "LatLongBoundingBox" ) );
            bBoxElement.setAttribute( QStringLiteral( "minx" ), QString::number( layerExtent.xMinimum() ) );
            bBoxElement.setAttribute( QStringLiteral( "miny" ), QString::number( layerExtent.yMinimum() ) );
            bBoxElement.setAttribute( QStringLiteral( "maxx" ), QString::number( layerExtent.xMaximum() ) );
            bBoxElement.setAttribute( QStringLiteral( "maxy" ), QString::number( layerExtent.yMaximum() ) );
            layerElem.appendChild( bBoxElement );

            // layer metadata URL
            QString metadataUrl = layer->metadataUrl();
            if ( !metadataUrl.isEmpty() )
            {
                QDomElement metaUrlElem = doc.createElement( QStringLiteral( "MetadataURL" ) );
                QString metadataUrlType = layer->metadataUrlType();
                metaUrlElem.setAttribute( QStringLiteral( "type" ), metadataUrlType );
                QString metadataUrlFormat = layer->metadataUrlFormat();
                if ( metadataUrlFormat == QLatin1String( "text/xml" ) )
                {
                    metaUrlElem.setAttribute( QStringLiteral( "format" ), QStringLiteral( "XML" ) );
                }
                else
                {
                    metaUrlElem.setAttribute( QStringLiteral( "format" ), QStringLiteral( "TXT" ) );
                }
                QDomText metaUrlText = doc.createTextNode( metadataUrl );
                metaUrlElem.appendChild( metaUrlText );
                layerElem.appendChild( metaUrlElem );
            }

            parentElement.appendChild( layerElem );
        }
    }
Ejemplo n.º 2
0
void QgsWCSProjectParser::wcsContentMetadata( QDomElement& parentElement, QDomDocument& doc ) const
{
    const QList<QDomElement>& projectLayerElements = mProjectParser->projectLayerElements();
    if ( projectLayerElements.size() < 1 )
    {
        return;
    }

    QStringList wcsLayersId = wcsLayers();

    QMap<QString, QgsMapLayer *> layerMap;

    Q_FOREACH ( const QDomElement &elem, projectLayerElements )
    {
        QString type = elem.attribute( "type" );
        if ( type == "raster" )
        {
            QgsMapLayer *layer = mProjectParser->createLayerFromElement( elem );
            if ( layer && wcsLayersId.contains( layer->id() ) )
            {
#ifdef HAVE_SERVER_PYTHON_PLUGINS
                if ( !mAccessControl->layerReadPermission( layer ) )
                {
                    continue;
                }
#endif
                QgsDebugMsg( QString( "add layer %1 to map" ).arg( layer->id() ) );
                layerMap.insert( layer->id(), layer );

                QDomElement layerElem = doc.createElement( "CoverageOfferingBrief" );
                QDomElement nameElem = doc.createElement( "name" );
                //We use the layer name even though it might not be unique.
                //Because the id sometimes contains user/pw information and the name is more descriptive
                QString typeName = layer->name();
                if ( !layer->shortName().isEmpty() )
                    typeName = layer->shortName();
                typeName = typeName.replace( " ", "_" );
                QDomText nameText = doc.createTextNode( typeName );
                nameElem.appendChild( nameText );
                layerElem.appendChild( nameElem );

                QDomElement labelElem = doc.createElement( "label" );
                QString titleName = layer->title();
                if ( titleName.isEmpty() )
                {
                    titleName = layer->name();
                }
                QDomText labelText = doc.createTextNode( titleName );
                labelElem.appendChild( labelText );
                layerElem.appendChild( labelElem );

                QDomElement descriptionElem = doc.createElement( "description" );
                QString abstractName = layer->abstract();
                if ( abstractName.isEmpty() )
                {
                    abstractName = "";
                }
                QDomText descriptionText = doc.createTextNode( abstractName );
                descriptionElem.appendChild( descriptionText );
                layerElem.appendChild( descriptionElem );

                //lonLatEnvelope
                QgsCoordinateReferenceSystem layerCrs = layer->crs();
                QgsCoordinateTransform t( layerCrs, QgsCoordinateReferenceSystem( 4326 ) );
                //transform
                QgsRectangle BBox;
                try
                {
                    BBox = t.transformBoundingBox( layer->extent() );
                }
                catch ( QgsCsException &e )
                {
                    QgsDebugMsg( QString( "Transform error caught: %1. Using original layer extent." ).arg( e.what() ) );
                    BBox = layer->extent();
                }
                QDomElement lonLatElem = doc.createElement( "lonLatEnvelope" );
                lonLatElem.setAttribute( "srsName", "urn:ogc:def:crs:OGC:1.3:CRS84" );
                QDomElement lowerPosElem = doc.createElement( "gml:pos" );
                QDomText lowerPosText = doc.createTextNode( QString::number( BBox.xMinimum() ) + " " +  QString::number( BBox.yMinimum() ) );
                lowerPosElem.appendChild( lowerPosText );
                lonLatElem.appendChild( lowerPosElem );
                QDomElement upperPosElem = doc.createElement( "gml:pos" );
                QDomText upperPosText = doc.createTextNode( QString::number( BBox.xMaximum() ) + " " +  QString::number( BBox.yMaximum() ) );
                upperPosElem.appendChild( upperPosText );
                lonLatElem.appendChild( upperPosElem );
                layerElem.appendChild( lonLatElem );

                parentElement.appendChild( layerElem );
            }
        }
    }
Ejemplo n.º 3
0
void QgsSLDConfigParser::layersAndStylesCapabilities( QDomElement& parentElement, QDomDocument& doc, const QString& version, bool fullProjectSettings ) const
{
  Q_UNUSED( version );
  Q_UNUSED( fullProjectSettings );

  //iterate over all <UserLayer> nodes
  if ( mXMLDoc )
  {
    QDomNode sldNode = mXMLDoc->documentElement();
    if ( !sldNode.isNull() )
    {
      //create wgs84 to reproject the layer bounding boxes
      //QgsCoordinateReferenceSystem wgs84;
      //wgs84.createFromEpsg(4326);

      QDomNodeList layerNodeList = sldNode.toElement().elementsByTagName( QStringLiteral( "UserLayer" ) );
      for ( int i = 0; i < layerNodeList.size(); ++i )
      {
        QDomElement layerElement = doc.createElement( QStringLiteral( "Layer" ) );
        layerElement.setAttribute( QStringLiteral( "queryable" ), QStringLiteral( "1" ) ); //support GetFeatureInfo for all layers
        parentElement.appendChild( layerElement );

        //add name
        QDomNodeList nameList = layerNodeList.item( i ).toElement().elementsByTagName( QStringLiteral( "Name" ) );
        if ( !nameList.isEmpty() )
        {
          //layer name
          QDomElement layerNameElement = doc.createElement( QStringLiteral( "Name" ) );
          QDomText layerNameText = doc.createTextNode( nameList.item( 0 ).toElement().text() );
          layerNameElement.appendChild( layerNameText );
          layerElement.appendChild( layerNameElement );
        }

        //add title
        QDomNodeList titleList = layerNodeList.item( i ).toElement().elementsByTagName( QStringLiteral( "Title" ) );
        if ( !titleList.isEmpty() )
        {
          QDomElement layerTitleElement = doc.createElement( QStringLiteral( "Title" ) );
          QDomText layerTitleText = doc.createTextNode( titleList.item( 0 ).toElement().text() );
          layerTitleElement.appendChild( layerTitleText );
          layerElement.appendChild( layerTitleElement );
        }
        //add abstract
        QDomNodeList abstractList = layerNodeList.item( i ).toElement().elementsByTagName( QStringLiteral( "Abstract" ) );
        if ( !abstractList.isEmpty() )
        {
          QDomElement layerAbstractElement = doc.createElement( QStringLiteral( "Abstract" ) );
          QDomText layerAbstractText = doc.createTextNode( abstractList.item( 0 ).toElement().text() );
          layerAbstractElement.appendChild( layerAbstractText );
          layerElement.appendChild( layerAbstractElement );
        }


        //get QgsMapLayer object to add Ex_GeographicalBoundingBox, Bounding Box
        QList<QgsMapLayer*> layerList = mapLayerFromStyle( nameList.item( 0 ).toElement().text(), QLatin1String( "" ) );
        if ( layerList.size() < 1 )//error while generating the layer
        {
          QgsDebugMsg( "Error, no maplayer in layer list" );
          continue;
        }

        //get only the first layer since we don't want to have the other ones in the capabilities document
        QgsMapLayer* theMapLayer = layerList.at( 0 );
        if ( !theMapLayer )//error while generating the layer
        {
          QgsDebugMsg( "Error, QgsMapLayer object is 0" );
          continue;
        }

        //append geographic bbox and the CRS elements
        QStringList crsNumbers = QgsConfigParserUtils::createCrsListForLayer( theMapLayer );
        QStringList crsRestriction; //no crs restrictions in SLD parser
        QgsConfigParserUtils::appendCrsElementsToLayer( layerElement, doc, crsNumbers, crsRestriction );
        QgsConfigParserUtils::appendLayerBoundingBoxes( layerElement, doc, theMapLayer->extent(), theMapLayer->crs(), crsNumbers, crsRestriction );

        //iterate over all <UserStyle> nodes within a user layer
        QDomNodeList userStyleList = layerNodeList.item( i ).toElement().elementsByTagName( QStringLiteral( "UserStyle" ) );
        for ( int j = 0; j < userStyleList.size(); ++j )
        {
          QDomElement styleElement = doc.createElement( QStringLiteral( "Style" ) );
          layerElement.appendChild( styleElement );
          //Name
          QDomNodeList nameList = userStyleList.item( j ).toElement().elementsByTagName( QStringLiteral( "Name" ) );
          if ( !nameList.isEmpty() )
          {
            QDomElement styleNameElement = doc.createElement( QStringLiteral( "Name" ) );
            QDomText styleNameText = doc.createTextNode( nameList.item( 0 ).toElement().text() );
            styleNameElement.appendChild( styleNameText );
            styleElement.appendChild( styleNameElement );

            QDomElement styleTitleElement = doc.createElement( QStringLiteral( "Title" ) );
            QDomText styleTitleText = doc.createTextNode( nameList.item( 0 ).toElement().text() );
            styleTitleElement.appendChild( styleTitleText );
            styleElement.appendChild( styleTitleElement );
          }
          //Title
          QDomNodeList titleList = userStyleList.item( j ).toElement().elementsByTagName( QStringLiteral( "Title" ) );
          if ( !titleList.isEmpty() )
          {
            QDomElement styleTitleElement = doc.createElement( QStringLiteral( "Title" ) );
            QDomText styleTitleText = doc.createTextNode( titleList.item( 0 ).toElement().text() );
            styleTitleElement.appendChild( styleTitleText );
            styleElement.appendChild( styleTitleElement );
          }
          //Abstract
          QDomNodeList abstractList = userStyleList.item( j ).toElement().elementsByTagName( QStringLiteral( "Abstract" ) );
          if ( !abstractList.isEmpty() )
          {
            QDomElement styleAbstractElement = doc.createElement( QStringLiteral( "Abstract" ) );
            QDomText styleAbstractText = doc.createTextNode( abstractList.item( 0 ).toElement().text() );
            styleAbstractElement.appendChild( styleAbstractText );
            styleElement.appendChild( styleAbstractElement );
          }
        }
      }
    }
  }
}
Ejemplo n.º 4
0
void QgsMapRenderer::render( QPainter* painter, double* forceWidthScale )
{
  //Lock render method for concurrent threads (e.g. from globe)
  QMutexLocker renderLock( &mRenderMutex );

  //flag to see if the render context has changed
  //since the last time we rendered. If it hasnt changed we can
  //take some shortcuts with rendering
  bool mySameAsLastFlag = true;

  QgsDebugMsg( "========== Rendering ==========" );

  if ( mExtent.isEmpty() )
  {
    QgsDebugMsg( "empty extent... not rendering" );
    return;
  }

  if ( mSize.width() == 1 && mSize.height() == 1 )
  {
    QgsDebugMsg( "size 1x1... not rendering" );
    return;
  }

  QPaintDevice* thePaintDevice = painter->device();
  if ( !thePaintDevice )
  {
    return;
  }

  // wait
  if ( mDrawing )
  {
    QgsDebugMsg( "already rendering" );
    QCoreApplication::processEvents();
  }

  if ( mDrawing )
  {
    QgsDebugMsg( "still rendering - skipping" );
    return;
  }

  mDrawing = true;

  QgsCoordinateTransform* ct;

#ifdef QGISDEBUG
  QgsDebugMsg( "Starting to render layer stack." );
  QTime renderTime;
  renderTime.start();
#endif

  if ( mOverview )
    mRenderContext.setDrawEditingInformation( !mOverview );

  mRenderContext.setPainter( painter );
  mRenderContext.setCoordinateTransform( 0 );
  //this flag is only for stopping during the current rendering progress,
  //so must be false at every new render operation
  mRenderContext.setRenderingStopped( false );

  //calculate scale factor
  //use the specified dpi and not those from the paint device
  //because sometimes QPainter units are in a local coord sys (e.g. in case of QGraphicsScene)
  double sceneDpi = mScaleCalculator->dpi();
  double scaleFactor = 1.0;
  if ( mOutputUnits == QgsMapRenderer::Millimeters )
  {
    if ( forceWidthScale )
    {
      scaleFactor = *forceWidthScale;
    }
    else
    {
      scaleFactor = sceneDpi / 25.4;
    }
  }
  double rasterScaleFactor = ( thePaintDevice->logicalDpiX() + thePaintDevice->logicalDpiY() ) / 2.0 / sceneDpi;
  if ( mRenderContext.rasterScaleFactor() != rasterScaleFactor )
  {
    mRenderContext.setRasterScaleFactor( rasterScaleFactor );
    mySameAsLastFlag = false;
  }
  if ( mRenderContext.scaleFactor() != scaleFactor )
  {
    mRenderContext.setScaleFactor( scaleFactor );
    mySameAsLastFlag = false;
  }
  if ( mRenderContext.rendererScale() != mScale )
  {
    //add map scale to render context
    mRenderContext.setRendererScale( mScale );
    mySameAsLastFlag = false;
  }
  if ( mLastExtent != mExtent )
  {
    mLastExtent = mExtent;
    mySameAsLastFlag = false;
  }

  mRenderContext.setLabelingEngine( mLabelingEngine );
  if ( mLabelingEngine )
    mLabelingEngine->init( this );

  // know we know if this render is just a repeat of the last time, we
  // can clear caches if it has changed
  if ( !mySameAsLastFlag )
  {
    //clear the cache pixmap if we changed resolution / extent
    QSettings mySettings;
    if ( mySettings.value( "/qgis/enable_render_caching", false ).toBool() )
    {
      QgsMapLayerRegistry::instance()->clearAllLayerCaches();
    }
  }

  QgsOverlayObjectPositionManager* overlayManager = overlayManagerFromSettings();
  QList<QgsVectorOverlay*> allOverlayList; //list of all overlays, used to draw them after layers have been rendered

  // render all layers in the stack, starting at the base
  QListIterator<QString> li( mLayerSet );
  li.toBack();

  QgsRectangle r1, r2;

  while ( li.hasPrevious() )
  {
    if ( mRenderContext.renderingStopped() )
    {
      break;
    }

    // Store the painter in case we need to swap it out for the
    // cache painter
    QPainter * mypContextPainter = mRenderContext.painter();

    QString layerId = li.previous();

    QgsDebugMsg( "Rendering at layer item " + layerId );

    // This call is supposed to cause the progress bar to
    // advance. However, it seems that updating the progress bar is
    // incompatible with having a QPainter active (the one that is
    // passed into this function), as Qt produces a number of errors
    // when try to do so. I'm (Gavin) not sure how to fix this, but
    // added these comments and debug statement to help others...
    QgsDebugMsg( "If there is a QPaintEngine error here, it is caused by an emit call" );

    //emit drawingProgress(myRenderCounter++, mLayerSet.size());
    QgsMapLayer *ml = QgsMapLayerRegistry::instance()->mapLayer( layerId );

    if ( !ml )
    {
      QgsDebugMsg( "Layer not found in registry!" );
      continue;
    }

    QgsDebugMsg( QString( "layer %1:  minscale:%2  maxscale:%3  scaledepvis:%4  extent:%5" )
                 .arg( ml->name() )
                 .arg( ml->minimumScale() )
                 .arg( ml->maximumScale() )
                 .arg( ml->hasScaleBasedVisibility() )
                 .arg( ml->extent().toString() )
               );

    if ( !ml->hasScaleBasedVisibility() || ( ml->minimumScale() < mScale && mScale < ml->maximumScale() ) || mOverview )
    {
      connect( ml, SIGNAL( drawingProgress( int, int ) ), this, SLOT( onDrawingProgress( int, int ) ) );

      //
      // Now do the call to the layer that actually does
      // the rendering work!
      //

      bool split = false;

      if ( hasCrsTransformEnabled() )
      {
        r1 = mExtent;
        split = splitLayersExtent( ml, r1, r2 );
        ct = new QgsCoordinateTransform( ml->crs(), *mDestCRS );
        mRenderContext.setExtent( r1 );
        QgsDebugMsg( "  extent 1: " + r1.toString() );
        QgsDebugMsg( "  extent 2: " + r2.toString() );
        if ( !r1.isFinite() || !r2.isFinite() ) //there was a problem transforming the extent. Skip the layer
        {
          continue;
        }
      }
      else
      {
        ct = NULL;
      }

      mRenderContext.setCoordinateTransform( ct );

      //decide if we have to scale the raster
      //this is necessary in case QGraphicsScene is used
      bool scaleRaster = false;
      QgsMapToPixel rasterMapToPixel;
      QgsMapToPixel bk_mapToPixel;

      if ( ml->type() == QgsMapLayer::RasterLayer && qAbs( rasterScaleFactor - 1.0 ) > 0.000001 )
      {
        scaleRaster = true;
      }


      //create overlay objects for features within the view extent
      if ( ml->type() == QgsMapLayer::VectorLayer && overlayManager )
      {
        QgsVectorLayer* vl = qobject_cast<QgsVectorLayer *>( ml );
        if ( vl )
        {
          QList<QgsVectorOverlay*> thisLayerOverlayList;
          vl->vectorOverlays( thisLayerOverlayList );

          QList<QgsVectorOverlay*>::iterator overlayIt = thisLayerOverlayList.begin();
          for ( ; overlayIt != thisLayerOverlayList.end(); ++overlayIt )
          {
            if (( *overlayIt )->displayFlag() )
            {
              ( *overlayIt )->createOverlayObjects( mRenderContext );
              allOverlayList.push_back( *overlayIt );
            }
          }

          overlayManager->addLayer( vl, thisLayerOverlayList );
        }
      }

      // Force render of layers that are being edited
      // or if there's a labeling engine that needs the layer to register features
      if ( ml->type() == QgsMapLayer::VectorLayer )
      {
        QgsVectorLayer* vl = qobject_cast<QgsVectorLayer *>( ml );
        if ( vl->isEditable() ||
             ( mRenderContext.labelingEngine() && mRenderContext.labelingEngine()->willUseLayer( vl ) ) )
        {
          ml->setCacheImage( 0 );
        }
      }

      QSettings mySettings;
      if ( ! split )//render caching does not yet cater for split extents
      {
        if ( mySettings.value( "/qgis/enable_render_caching", false ).toBool() )
        {
          if ( !mySameAsLastFlag || ml->cacheImage() == 0 )
          {
            QgsDebugMsg( "Caching enabled but layer redraw forced by extent change or empty cache" );
            QImage * mypImage = new QImage( mRenderContext.painter()->device()->width(),
                                            mRenderContext.painter()->device()->height(), QImage::Format_ARGB32 );
            mypImage->fill( 0 );
            ml->setCacheImage( mypImage ); //no need to delete the old one, maplayer does it for you
            QPainter * mypPainter = new QPainter( ml->cacheImage() );
            // Changed to enable anti aliasing by default in QGIS 1.7
            if ( mySettings.value( "/qgis/enable_anti_aliasing", true ).toBool() )
            {
              mypPainter->setRenderHint( QPainter::Antialiasing );
            }
            mRenderContext.setPainter( mypPainter );
          }
          else if ( mySameAsLastFlag )
          {
            //draw from cached image
            QgsDebugMsg( "Caching enabled --- drawing layer from cached image" );
            mypContextPainter->drawImage( 0, 0, *( ml->cacheImage() ) );
            disconnect( ml, SIGNAL( drawingProgress( int, int ) ), this, SLOT( onDrawingProgress( int, int ) ) );
            //short circuit as there is nothing else to do...
            continue;
          }
        }
      }

      if ( scaleRaster )
      {
        bk_mapToPixel = mRenderContext.mapToPixel();
        rasterMapToPixel = mRenderContext.mapToPixel();
        rasterMapToPixel.setMapUnitsPerPixel( mRenderContext.mapToPixel().mapUnitsPerPixel() / rasterScaleFactor );
        rasterMapToPixel.setYMaximum( mSize.height() * rasterScaleFactor );
        mRenderContext.setMapToPixel( rasterMapToPixel );
        mRenderContext.painter()->save();
        mRenderContext.painter()->scale( 1.0 / rasterScaleFactor, 1.0 / rasterScaleFactor );
      }


      if ( !ml->draw( mRenderContext ) )
      {
        emit drawError( ml );
      }
      else
      {
        QgsDebugMsg( "Layer rendered without issues" );
      }

      if ( split )
      {
        mRenderContext.setExtent( r2 );
        if ( !ml->draw( mRenderContext ) )
        {
          emit drawError( ml );
        }
      }

      if ( scaleRaster )
      {
        mRenderContext.setMapToPixel( bk_mapToPixel );
        mRenderContext.painter()->restore();
      }

      if ( mySettings.value( "/qgis/enable_render_caching", false ).toBool() )
      {
        if ( !split )
        {
          // composite the cached image into our view and then clean up from caching
          // by reinstating the painter as it was swapped out for caching renders
          delete mRenderContext.painter();
          mRenderContext.setPainter( mypContextPainter );
          //draw from cached image that we created further up
          mypContextPainter->drawImage( 0, 0, *( ml->cacheImage() ) );
        }
      }
      disconnect( ml, SIGNAL( drawingProgress( int, int ) ), this, SLOT( onDrawingProgress( int, int ) ) );
    }
    else // layer not visible due to scale
    {
Ejemplo n.º 5
0
bool QgsProcessingAlgorithm::validateInputCrs( const QVariantMap &parameters, QgsProcessingContext &context ) const
{
  if ( !( flags() & FlagRequiresMatchingCrs ) )
  {
    // I'm a well behaved algorithm - I take work AWAY from users!
    return true;
  }

  bool foundCrs = false;
  QgsCoordinateReferenceSystem crs;
  Q_FOREACH ( const QgsProcessingParameterDefinition *def, mParameters )
  {
    if ( def->type() == QStringLiteral( "layer" ) || def->type() == QStringLiteral( "raster" ) )
    {
      QgsMapLayer *layer = QgsProcessingParameters::parameterAsLayer( def, parameters, context );
      if ( layer )
      {
        if ( foundCrs && layer->crs().isValid() && crs != layer->crs() )
        {
          return false;
        }
        else if ( !foundCrs && layer->crs().isValid() )
        {
          foundCrs = true;
          crs = layer->crs();
        }
      }
    }
    else if ( def->type() == QStringLiteral( "source" ) )
    {
      QgsFeatureSource *source = QgsProcessingParameters::parameterAsSource( def, parameters, context );
      if ( source )
      {
        if ( foundCrs && source->sourceCrs().isValid() && crs != source->sourceCrs() )
        {
          return false;
        }
        else if ( !foundCrs && source->sourceCrs().isValid() )
        {
          foundCrs = true;
          crs = source->sourceCrs();
        }
      }
    }
    else if ( def->type() == QStringLiteral( "multilayer" ) )
    {
      QList< QgsMapLayer *> layers = QgsProcessingParameters::parameterAsLayerList( def, parameters, context );
      Q_FOREACH ( QgsMapLayer *layer, layers )
      {
        if ( !layer )
          continue;

        if ( foundCrs && layer->crs().isValid() && crs != layer->crs() )
        {
          return false;
        }
        else if ( !foundCrs && layer->crs().isValid() )
        {
          foundCrs = true;
          crs = layer->crs();
        }
      }
    }
  }