Qt+QGIS二次開發:QGIS中使用QgsRubberBand類創建臨時圖形


1  概述

臨時圖形Rubberband主要用於高亮顯示、交互繪制等情況下。
2 原理

臨時圖形是在一個底色透明的圖層(頂層)上,添加已有的幾何元素或者創建一個幾何元素(臨時圖形),可以設置相應的樣式,並在圖層的最上層疊加顯示。
3 使用方法

QgsRubberBand用於顯示臨時圖形。可以顯示點、線、面等所有類型。由於在交互繪制時,可能需要高亮顯示節點,所以本類也可以設置不同的IconType來顯示不同的節點樣式(只能在點類型時起作用)。

生成對象后可以完成操作所有的屬性,如幾何元素、樣式等。

setWidth():設置畫筆寬度。

setIconSize():設置icon的寬度(高度)。

addGeometry():添加已有的Geometry。注意:第二個參數為vectorlayer,用途是將Geometry按照此layer的crs與mapcanvas的crs進行坐標轉換,如果此為NULL,則不轉換。參見Qgis開發12-讀取矢量元素.docx

特別要注意:mapcanvas在顯示之前各種參數都不確定,一定要在mapcanvas渲染結束之后再進行坐標轉換之類的操作。
示例:

//xx.cpp
    connect(m_pMapCanvas,SIGNAL(xyCoordinates(QgsPoint)),this,SLOT(showMousePoint(QgsPoint)));

/**
*@briefMainWindow::initialMapCanvas
*
*initializewhenmapcanvaspaintfinished.
*@authorsf2gis@163.com
*@date2014-08-2222:31:24
*/
voidMainWindow::initialMapCanvas()
{
    createRubberBand(m_pMapCanvas);
}

/**
*@briefMainWindow::createRubberBand
*
*createrubberband.
*@parampMapCanvas
*@authorsf2gis@163.com
*@date2014-08-2222:32:30
*/

voidMainWindow::createRubberBand(QgsMapCanvas*pMapCanvas)
{
    {//line
        QgsRubberBand*pRubber=newQgsRubberBand(pMapCanvas,QGis::Line);
        pRubber->setColor(QColor(0,255,0));
        pRubber->setWidth(2);
        constQgsMapToPixel*pM2PTransform=pMapCanvas->getCoordinateTransform();
        QgsPointpt1=pM2PTransform->toMapCoordinates(0,0);
        QgsPointpt2=pM2PTransform->toMapCoordinates(100,0);
        QgsPointpt3=pM2PTransform->toMapCoordinates(100,100);
        QgsPointpt4=pM2PTransform->toMapCoordinates(0,100);
        pRubber->addPoint(pt1,false);
        pRubber->addPoint(pt2,false);
        pRubber->addPoint(pt3,false);
        pRubber->addPoint(pt4,true);
    }

    {//polygon

        QgsRubberBand*pRubber=newQgsRubberBand(pMapCanvas,QGis::Polygon);
        pRubber->setColor(QColor(255,0,0));
        pRubber->setWidth(2);
        constQgsMapToPixel*pM2PTransform=pMapCanvas->getCoordinateTransform();
        QgsPointpt1=pM2PTransform->toMapCoordinates(10,10);
        QgsPointpt2=pM2PTransform->toMapCoordinates(90,10);
        QgsPointpt3=pM2PTransform->toMapCoordinates(90,90);
        QgsPointpt4=pM2PTransform->toMapCoordinates(10,90);
        pRubber->addPoint(pt1,false);
        pRubber->addPoint(pt2,false);
        pRubber->addPoint(pt3,false);
        pRubber->addPoint(pt4,true);
    }

    {//point
        QgsRubberBand*pRubber=newQgsRubberBand(pMapCanvas,QGis::Point);
        pRubber->setColor(QColor(0,255,0));
        pRubber->setWidth(10);
        pRubber->setIcon(QgsRubberBand::ICON_CROSS);
        pRubber->setIconSize(20);
        constQgsMapToPixel*pM2PTransform=pMapCanvas->getCoordinateTransform();
        QgsPointpt1=pM2PTransform->toMapCoordinates(50,50);
        pRubber->addPoint(pt1,true);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM